信息学奥赛一本通算法(C++版)基本算法:高精度计算

信息学奥赛一本通算法(C++版)基本算法:高精度计算
信息学奥赛一本通算法(C++版)基本算法:高精度计算

信息学奥赛一本通算法(C++版)基础算法:高精度计算

高精度加法(大位相加)

#include

using namespace std;

int main()

{

char a1[100],b1[100];

int a[100],b[100],c[100];//a,b,c分别存储加数,加数,结果

int lena,lenb,lenc,x,i;

memset(a,0,sizeof(a));//数组a清零

memset(b,0,sizeof(b));//数组b清零

memset(c,0,sizeof(c));//数组c清零

//gets(a1);

//gets(b1);

//getchar();

while(scanf("%s%s",&a1,&b1)!=EOF)

{

lena=strlen(a1);

lenb=strlen(b1);

for(i=0;i<=lena;i++)

a[lena-i]=a1[i]-'0';//将数串a1转化为数组a,并倒序存储

//a[i]=a1[lena-i-1]-48;

for(i=0;i<=lenb;i++)

b[lenb-i]=b1[i]-'0';//将数串a1转化为数组a,并倒序存储

//b[i]=b1[lenb-i-1]-48;

lenc=1; //lenc表示第几位

x=0; //x是进位

while(lenc<=lena||lenc<=lenb)

{

c[lenc]=a[lenc]+b[lenc]+x;//第lenc位相加并加上次的进位

x=c[lenc]/10;//向高位进位

c[lenc]%=10;//存储第lenc位的值

lenc++;//位置下标变量

}

c[lenc]=x;

if(c[lenc]==0)

lenc--; //处理最高进位

for(i=lenc;i>=1;i--)

cout<

cout<

}

return 0;

}

高精度减法(大位相减)

#include

using namespace std;

int main()

{

char n[256],n1[256],n2[256];

int a[256],b[256],c[256];

int lena,lenb,lenc,i;

memset(a,0,sizeof(a));

memset(b,0,sizeof(b));

memset(c,0,sizeof(c));

while(scanf("%s%s",&n1,&n2)!=EOF)//n1为被减数,n2为减数

{

if(strlen(n1)n2时,返回正整数;n1

{

strcpy(n,n1);//将n1数组的值完全赋值给n数组

strcpy(n1,n2);

strcpy(n2,n);//处理被减数和减数时,交换被减数和减数cout<<"-";//交换了减数和被减数,结果为负数

}

lena=strlen(n1);

lenb=strlen(n2);

for(i=0;i<=lena;i++)

a[lena-i]=(int)(n1[i]-'0');//被减数放入数组a中

for(i=0;i<=lenb;i++)

b[lenb-i]=(int)(n2[i]-'0');//减数放入数组b中

i=1;

while(i<=lena||i<=lenb)

{

if(a[i]

{

a[i]+=10;//不够减,那么向高位借1当10

a[i+1]--;

}

c[i]=a[i]-b[i];//对应位相减

i++;

}

lenc=i;

while((c[lenc]==0)&&(lenc>1)) lenc--;//最高位的0不输出for(i=lenc;i>=1;i--)

cout<

cout<

}

return 0;

高精度计算

高精度计算 由于计算机具有运算速度快,计算精度高的特点,许多过去由人来完成的烦琐、复杂的数学计算,现在都可以由计算机来代替。 计算机计算结果的精度,通常要受到计算机硬件环境的限制。例如,pascal 要计算的数字超过19位,计算机将按浮点形式输出;另一方面,计算机又有数的表示范围的限制,在一般的微型计算机上,实数的表示范围为l0-38 -l038。例如,在计算N!时,当N=21时计算结果就超过了这个范围,无法计算了。这是由计算机的硬件性质决定的,但是,我们可以通过程序设计的方法进行高精度计算(多位数计算)。 学习重点 1、掌握高精度加、减、乘、除法。 3、理解高精度除法运算中被除数、除数、商和余数之间的关系。 4、能编写相应的程序,解决生活中高精度问题。 学习过程 一、高精度计算的基本方法 用free pascal程序进行高精度计算,首先要处理好以下几个基本问题:【数据的输入与保存】 (1)一般采用字符串变量存储数据,然后用length函数测量字符串长度确定其位数。 (2)分离各位数位上的数字 分离各数位上的数通常采用正向存储的方法。以“163848192”为例,见下表:A[9] A[8] A[7] A[6] A[5] A[4] A[3] A[2] A[1] 1 6 3 8 4 8 1 9 2 基本原理是A[1]存放个位上的数字,A[2]存放十位上的数字,……依此类推。即下标小的元素存低位上的数字,下标大的元素存高位上的数字,这叫“下标与位权一致”原则。 【计算结果位数的确定】 (1)高精度加法:和的位数为两个加数中较大数的位数+1。 (2)高精度减法:差的位数为被减数和减数中较大数的位数。 (3)高精度乘法:积的位数为两个相乘的数的位数之和。 (4)高精度除法:商的位数按题目的要求确定。 【计算顺序与结果的输出】 高精度加、减、乘法,都是从低位到高位算起,而除法相反。输出结果都是从高位到低位的顺序,注意:高位上的零不输出(整数部分是零除外)。 高精度加法 【参考程序】 var a,b:array[1..10000] of byte; i,w,la,lb:integer;

信息学奥赛一本通题解目录-信息学奥赛取消

信息学奥赛一本通题解目录:信息学奥赛取消 第1章 数论1.1 整除1.2 同余1.3 最大公约数1.3.1 辗转相除法1.3.2 进制算法1.3.3 最小公倍数1.3.4 扩展欧几里得算法1.3.5 求解线性同余方程1.4 逆元1.5 中国剩余定理1.6 斐波那契数1.7 卡特兰数1.8 素数1.8.1 素数的判定1.8.2 素数的相关定理1.8.3 Miller-Rabin素数测试1.8.4 欧拉定理1.8.5 PollardRho算法求大数因子1.9

Baby-Step-Giant-Step及扩展算法1.10 欧拉函数的线性筛法1.11 本章习题第2章群论2.1 置换2.1.1 群的定义2.1.2 群的运算2.1.3 置换2.1.4 置换群2.2 拟阵2.2.1 拟阵的概念2.2.2 拟阵上的最优化问题2.3 Burnside引理2.4 Polya定理2.5 本章习题第3章组合数学3.1 计数原理3.2 稳定婚姻问题3.3 组合问题分类3.3.1 存在性问题3.3.2 计数性问题3.3.3 构造性问题3.3.4 最优化问题3.4 排列3.4.1

选排列3.4.2 错位排列3.4.3 圆排列3.5 组合3.6 母函数3.6.1 普通型母函数3.6.2 指数型母函数3.7 莫比乌斯反演3.8 Lucas定理3.9 本章习题第4章概率4.1 事与概率4.2 古典概率4.3 数学期望4.4 随机算法4.5 概率函数的收敛性4.6 本章习题第5章计算几何5.1 解析几何初步5.1.1 平面直角坐标系5.1.2 点5.1.3 直线5.1.4 线段5.1.5 多边形5.1.6

信息学奥赛培训计划(复赛)

信息技术学科信息学奥赛社团培训计划 制定人:玄王伟 2018年10月

信息学奥赛培训计划方案推进信息技术教育是全面实施素质教育的需要,是培养具有创新精神和实践能力的新型人才的需要。信息学奥赛的宗旨为:“丰富学生课余生活,提高学生学习兴趣,激发学生创新精神。”为此,我们应以竞赛作为契机进而培养学生综合分析问题、解决问题的意识和技能。 为响应学校号召,积极参与信息技术奥林匹克竞赛,校本课程特别开设C++语言程序设计部分,利用社团活动时间对部分学生进行辅导。教学材料以信息学奥赛一本通训练指导教程为主,力图让学生们对编写程序有较深入了解的同时,能够独立编写解决实际问题的算法,逐步形成解题的思维模式。因学习内容相对中小学学生具有一定的难度,本课程采用讲练结合的形式,紧紧围绕“程序=算法+数据结构”这一核思想,以数学问题激发学生学习兴趣,进而达到学习目标。为更好地保证信息学奥赛的培训效果,特制订本培训计划。 一、培训目标 1.使学生具备参加全国信息学奥林匹克竞赛分区联赛NOIP(初赛、复赛)的能力。 2.使学生养成较好的抽象逻辑推理能力、严谨的思维方式和严密的组织能力,并使学生的综合素质的提高。 3.使学生初步具备分析问题和设计算法的能力。 二、培训对象 我校小学及初中对信息学感兴趣且初赛成绩较好的学生,人数共

计14人,其中小学组12人,普及组2人。 三、培训要求 严格培训纪律,加强学生管理;信息学社团的组建由学生自愿报名、教师考察确定;培训过程中做与培训无关的事如打游戏、上网聊天等,一经发现作未参加培训处理;规定的作业、练习必须按时保质保量完成,否则按未参加培训处理。 四、培训内容 1.深入学习计算机基础知识,包括计算机软硬件系统、网络操作、信息安全等相关知识内容,结合生活实际让学生真正体会到参加信息学奥赛的乐趣。 2.全面学习C++语言的基础知识、学会程序的常用调试手段和技巧,在用C++解决问题的过程中引入基础算法的运用。 3.深入学习各类基础算法,让学生真正理解算法的精髓,遵循“算法+数据结构=程序”的程序设计思想,在算法设计的教学实例中引入数据结构的学习,从而形成一定的分析和解决问题的能力。 4.以实例为基础,展开强化训练,使学生开始具备运用计算机独立解决实际问题的能力。用计算机解决现实问题的最重要的一个前提就是数据模型的建立和数据结构的设计。数据模型的建立、数学公式的应用,是计算机解决问题的关键。因此,加强与数学学科的横向联系非常必要。 五、培训时间 自2018年10月份第三周开始至2018年11月中旬结束,包括每

信息学奥赛一本通算法(C 版)基础算法:高精度计算资料

信息学奥赛一本通算法(C++版)基础算法:高精度计算 高精度加法(大位相加) #include using namespace std; int main() { char a1[100],b1[100]; int a[100],b[100],c[100];//a,b,c分别存储加数,加数,结果 int lena,lenb,lenc,x,i; memset(a,0,sizeof(a));//数组a清零 memset(b,0,sizeof(b));//数组b清零 memset(c,0,sizeof(c));//数组c清零 //gets(a1); //gets(b1); //getchar(); while(scanf("%s%s",&a1,&b1)!=EOF) { lena=strlen(a1); lenb=strlen(b1); for(i=0;i<=lena;i++) a[lena-i]=a1[i]-'0';//将数串a1转化为数组a,并倒序存储 //a[i]=a1[lena-i-1]-48; for(i=0;i<=lenb;i++) b[lenb-i]=b1[i]-'0';//将数串a1转化为数组a,并倒序存储 //b[i]=b1[lenb-i-1]-48; lenc=1; //lenc表示第几位 x=0; //x是进位 while(lenc<=lena||lenc<=lenb) { c[lenc]=a[lenc]+b[lenc]+x;//第lenc位相加并加上次的进位 x=c[lenc]/10;//向高位进位 c[lenc]%=10;//存储第lenc位的值 lenc++;//位置下标变量 } c[lenc]=x; if(c[lenc]==0) lenc--; //处理最高进位 for(i=lenc;i>=1;i--) cout<

高精度数计算

C语言课程设计-高精度数计算 源代码: #include #include #include int main() { int a,b; int c; int i; int *Numa,*Numb,*Sum; printf("请输入第一个加数的位数(小于1000位),加数由系统随机生成:"); scanf("%d",&a); printf("请输入第二个加数的位数(小于1000位),加数由系统随机生成:"); scanf("%d",&b); Numa=(int *)malloc(a*sizeof(int)); Numb=(int *)malloc(b*sizeof(int)); srand( (unsigned)time( NULL ) );//产生随机种子 //随机产生加数a for(i=0;i

{ printf("%d",Numa[i]); } printf("\n"); printf("随机产生的加数b为:\n"); for(i=0;i=b)//加数a大 { c=a; Sum=(int *)malloc((c+1)*sizeof(int)); tag=0; for(i=0;i=10)//如果和大于10 { Sum[c-i]=Sum[c-i]-10; tag=1;//标志进位 } else { tag=0; } } else//有进位 { Sum[c-i]=Numa[a-i-1]+Numb[b-i-1]+1; if(Sum[c-i]>=10)//如果和大于10 { Sum[c-i]=Sum[c-i]-10; tag=1;//标志进位 } else { tag=0; } }

NOIP2017全国青少年信息学奥林匹克联赛提高组初赛试题卷答案解析

NOIP 2017全国青少年信息学奥林匹克联赛提高组初赛试题答案 一、单项选择题(共 15 题,每题 1.5 分,共计 22.5 分;每题有且仅有一个正确选项) 1. 从( )年开始,NOIP 竞赛将不再支持 Pascal 语言。 A. 2020 B. 2021 C. 2022 D. 2023 2.在 8 位二进制补码中,10101011 表示的数是十进制下的( )。 A. 43 B. -85 C. -43 D.-84 3.分辨率为 1600x900、16 位色的位图,存储图像信息所需的空间为( )。 A. 2812.5KB B. 4218.75KB C. 4320KB D. 2880KB 4. 2017年10月1日是星期日,1949年10月1日是( )。 A. 星期三 B. 星期日 C. 星期六 D. 星期二 5. 设 G 是有 n 个结点、m 条边(n ≤m)的连通图,必须删去 G 的( )条边,才能使得 G 变成一棵树。 A.m–n+1 B. m-n C. m+n+1 D.n–m+1 6. 若某算法的计算时间表示为递推关系式: T(N)=2T(N/2)+NlogN T(1)=1 则该算法的时间复杂度为( )。 A.O(N) B.O(NlogN) C.O(N log2N) D.O(N2) 7. 表达式a * (b + c) * d的后缀形式是()。 A. abcd*+* B. abc+*d* C. a*bc+*d D. b+c*a*d 8. 由四个不同的点构成的简单无向连通图的个数是( )。

A. 32 B. 35 C. 38 D. 41 9. 将7个名额分给4个不同的班级,允许有的班级没有名额,有( )种不同的分配方案。 A. 60 B. 84 C. 96 D.120 10. 若f[0]=0, f[1]=1, f[n+1]=(f[n]+f[n-1])/2,则随着i的增大,f[i]将接近与( )。 A. 1/2 B. 2/3 D. 1 11. 设A和B是两个长为n的有序数组,现在需要将A和B合并成一个排好序的数组,请问任何以元素比较作为基本运算的归并算法最坏情况下至少要做( )次比较。 A. n2 B. nlogn C. 2n D.2n-1 12. 在n(n>=3)枚硬币中有一枚质量不合格的硬币(质量过轻或质量过重),如果只有一架天平可以用来称重且称重的硬币数没有限制,下面是找出这枚不合格的硬币的算法。请把 a-c三行代码补全到算法中。 a. A XUY b. A Z c. n |A| 算法Coin(A,n) 1. k n/3 2. 将A中硬币分成X,Y,Z三个集合,使得|X|=|Y|=k, |Z|=n-2k 3. if W(X)≠W(Y) //W(X), W(Y)分别为X或Y的重量 4. then_______ 5. else_______ 6. __________ 7. if n>2 then goto 1 8. if n=2 then 任取A中1枚硬币与拿走硬币比较,若不等,则它不合格;若相等,则A 中剩下的硬币不合格 9. if n=1 then A中硬币不合格 正确的填空顺序是( )。 A. b,c,a B. c,b,a C. c,a,b D.a,b,c 13. 在正实数构成的数字三角形排列形式如图所示,第一行的数为a11;第二行的数从左到右依次为a21,a22;…第n行的数为an1,an2,…,ann。从a11开始,每一行的数aij只有两条边可以分别通向下一行的两个数a(i+1)j和a(i+1)(j+1)。用动态规划算法找出一条从a11向下通到an1,an2,…,ann中某个数的路径,使得该路径上的数之和达到最大。

信息学奥赛——排序算法

全国青少年信息学奥林匹克联赛 排序算法 一、插入排序(Insertion Sort) 1. 基本思想: 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。 2. 排序过程: 【示例】: [初始关键字] [49] 38 65 97 76 13 27 49 J=2(38) [38 49] 65 97 76 13 27 49 J=3(65) [38 49 65] 97 76 13 27 49 J=4(97) [38 49 65 97] 76 13 27 49 J=5(76) [38 49 65 76 97] 13 27 49 J=6(13) [13 38 49 65 76 97] 27 49 J=7(27) [13 27 38 49 65 76 97] 49 J=8(49) [13 27 38 49 49 65 76 97] Procedure InsertSort(Var R : FileType); //对R[1..N]按递增序进行插入排序, R[0]是监视哨// Begin for I := 2 To N Do //依次插入R[2],...,R[n]// begin R[0] := R[I]; J := I - 1; While R[0] < R[J] Do //查找R[I]的插入位置// begin R[J+1] := R[J]; //将大于R[I]的元素后移// J := J - 1 end R[J + 1] := R[0] ; //插入R[I] // end End; //InsertSort //

信息学奥赛基础知识提纲

信息学奥赛基础知识提纲 (2014年9月) 1 计算机系统 1-1概述 一个完整的计算机系统包括硬件系统和软件系统两大部分,必须具有五大功能:数据传送功能、数据存储功能、数据处理功能、操作控制功能、操作判断功能。它的工作特点是:运算速度快、运算精度高、记忆能力强、通用性广、自动运算。 计算机按照规模可分为:巨型机、大型机、中型机、小型机、微型机、单片机等几种类型。根据用途不同分为通用机和专用机。 硬件指的是计算机的设备实体;软件通常泛指各类程序和文件。软硬件的关系:硬件是软件的基础。软件是硬件的扩充与完善。硬件与软件在逻辑上是等价的。 1946年,世界上第一台计算机诞生于宾夕法尼亚大学,称为ENIAC 。 1949年,第一台存储计算机EDSAC,英国剑桥大学威尔克斯(Wilkes )设计和制造的。 1951年,第一台商用计算机是UNIVAC 。 1-2 硬件系统 1-2-1 冯·诺伊曼(J.von Neumann )机:美籍匈牙利数学家 现代计算机的基本结构被称为冯·诺伊曼结构。它的主要特点是储存程序的概念: (1) 采用二进制形式表示数据和指令。 (2) 将程序(包括操作指令和操作数)事先存入主存储器中,使计算机在工作时能够自 动高速地从存储器中取出指令加以执行。 (3) 由运算器、存储器、控制器、输入设备、输出设备五大基础部件组成计算机系统。 冯·诺伊曼机 运 算 器存 储 器 输出设备 输入设备 控 制 器控 制 台 控制信号请 求 信 号 请 求 信 号 控制信号结 果 程序 反馈信息 操作指令 地址 指令

1-2-2 计算机的总线结构 计算机的各个部件需要以某种方式互联,进行数据交换。最常见的互联结构就是总线互联结构和多总线互联结构。总线是一种连接多种设备的信息传递通道,实际上是一组信号线。 典型的计算机总线结构由内部总线和系统总线组成。 (1) 内部总线:用于连接CPU 内部的各个模块。 (2) 系统总线:又称外部总线,用于连接CPU 、存储器和输入输出设备。系统总线的信 号线分为三类:数据线、地址线和控制线。 数据线(Data Bus ):数据总线的宽度就是指组成数据总线的信号线的数目,它决定了在该总线上一次可以传送的二进制位数。 地址线(Address Bus ):用以传递地址信息,来指示数据总线上的数据来源和去向。地址线的数目决定了能够访问空间的大小。 控制线(Control Bus ):用来控制数据总线和地址总线。 某SRAM 芯片,其存储容量为64K*16位,则该芯片的地址线数目和数据线的数目? 1-2-3 中央处理器(Central Processor Unit ) 1、CPU 包含了冯机五大部件中的运算器(即加法器)和控制器。 运算器:对信息加工和处理的部件,主要完成各种算术运算和逻辑运算。 控制器:通过读取各种指令,并进行翻译、分析,而后对各部件作出相应的控制。 2、CPU 主要由三大部分组成:寄存器组、算术逻辑单元(ALU )和控制单元(控制器)。 寄存器组:分为通用寄存器(通用寄存器、数据寄存器、地址寄存器、标志寄存器)和状态控制寄存器(程序计数器PC 、指令寄存器IR 、存储器地址寄存器MAR 、存储器缓冲寄存器MBR )以及程序状态字PSW 。 算术逻辑单元ALU : 寄存器、存储器、I/O 设备把待处理的数据输入到ALU 。 控制单元:控制器的基本功能就是时序控制和执行控制。根据当前运行的程序,控 制器使CPU 按一定的时序关系执行一序列 的微操作从而完成程序。 时钟信号:控制器根据时钟电路产生的时钟信号进行定时,以控制各种操作按指定的时序进行。计算机的基本功能是执行程序,而程序由一连串的指令组成;计算机的执行过程由一连串的指令周期组成,每一指 令周期完成一条指令。这些指令周期又可进一步细分为更小的单元,直到微操作uop-----CPU 完成的基本的原子操作。 时钟脉冲发生器的晶振频率成为机器的主频,它产生的时钟脉冲信号是整个机器的时间基准,其周期T 称为该计算机的时钟周期。 完成一个微操作的时间就称为CPU 周期(机器周期)。执行一条机器指令所需的时间称为一个指令周期。 3、指令系统(精简指令系统):操作类指令和控制类指令 一条指令:操作码 + 地址码 一条机器指令的执行:取指令――分析指令――执行指令 4、CPU 的主要指标有: 字长:CPU 一次所能处理的二进制位数。它决定着寄存器、加法器、数据总线等的位数。主频:计算机的时钟频率。(即内频)单位:MHz 或GHz 。 运算速度:CPU 每秒钟能完成的指令数MIPS 。运算速度=1÷ 执行一条机器指令所需的时间

高精度运算(C++)

万进制高精度运算(C++语言) 目前在青少年信息学奥林匹克竞赛中所涉及到的高精度计算包括加(addition)、减(subtract)、乘(multiply)、除(divide)四种基本运算。其中乘法分高精度数乘高精度数和单精度数乘高精度数两种,除法一般指两个单精度数相除,求解最终指定精度的解,找出循环节或输出指定精度位数的小数。(注:高精度数与单精度数均指整数) 主要的解题思想是利用在小学就曾学习过的坚式加减乘除法则,用程序语言实现存在的问题主要有如何存储高精度数的值,如何实现计算等问题。 一. 高精度数字的存储 我们日常书写一个高精度数字,左侧为其高位,右侧为其低位,在计算中往往会因进位(carry )或借位(borrow )导致高位增长或减少,因此我们定义一个整型数组(int bignum[maxlen])从低位向高位实现高精度整数的存储,数组的每个元素存储高精度数中的一位。(如下表所示) 高精度数 3(高位) …… 7 9 4(低位) int bignum[i] n …… 2 1 显然,在C++语言中,int 类型(4个字节/32位计算机)元素存储十进制的一位数字非常浪费空间,并且运算量也非常大,因此常将程序代码优化为万进制,即数组的每个元素存储高精数字的四位。在后面的叙述过程中均以万进制为例介绍。(为什么选择万进制,而不选择更大的进制呢?十万进制中的最大值99999相乘时得到的值是9999800001超过4个字节的存储范围而溢出,从而导致程序计算错误。) 在实际编写程序代码过程中常作如下定义: const int base=10000; const int maxlen=1000+1; int bignum[maxlen]; 说明:base 表示进制为万进制,maxlen 表示高精度数的长度,1个元素能存储4个十进制位,1000个元素就存储4000个十进制位,而加1表示下标为0的元素另有它用,常用作存储当前高精度数字的位数。 二. 各种运算的程序实现 (一)加法: 首先回顾一下小学中曾学习的坚式加法,见图一: bignum1[] 9475 46 1243 bignum2[] 918 1324 341 carry 1 0 0 0 bignum_ans[] 1 393 1370 1584 图一 加法的计算过程 从上面的图中我们可以得知,做加法运算是从低位向高位进行,如果有进位,下一位进行相加时要加上进位,如果最高位已计算完还有进位,就要增加存储结果的位数,保存起进位来。关于进位的处理,往往定义单独变量carry 进行存储,程序实现的过程如图二所示: 图二 加法的实现过程 初始化 进位carry 赋初始值0,结果的位数为两个加数的最大位数。 当前位超过最高位了? 处理当前位和进位 N Y 还有进位么? N 结束 处理进位 Y

高精度算法(c语言版)

高精度算法 #include #include #include #include int an,bn,fa=1,fb=1; /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/ char b1[250], b2[250]; /*纪录需要计算的两个高精度数据*/ void input(int a1[],int a2[]) /*函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/ { int i,ai=1,bi=1; scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据*/ an = strlen( b1 ); /*an纪录b1的位数*/ bn = strlen( b2 ); /*bn纪录b2的位数*/ if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号*/ if(b2[0]==45) { bn--; fb=-1;bi=0;} for (i=0; i0||q) { if(an>bn) k=an; else k=bn; /*用k纪录结果的最小位数*/ for(i=0;i=0;i--) printf("%d",c[i]); /*输出结果*/ return; } else subtraction(a,b,1); return;

信息学奥赛经典算法C语言经典例题1

信息学奥赛经典算法C语言经典例题100例 经典C源程序100例 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { inti,j,k; printf("\n"); for(i=1;i<5;i++)/*以下为三重循环*/ for(j=1;j<5;j++) for(k=1;k<5;k++) { if(i!=k&&i!=j&&j!=k)/*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); }} ============================================================== 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分, 可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

2.程序源代码: main() { longinti; intbonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; elseif(i<=200000) bonus=bonus1+(i-100000)*0.075; elseif(i<=400000) bonus=bonus2+(i-200000)*0.05; elseif(i<=600000) 1 bonus=bonus4+(i-400000)*0.03; elseif(i<=1000000) bonus=bonus6+(i-600000)*0.015; else bonus=bonus10+(i-1000000)*0.01; printf("bonus=%d",bonus);}

C++入门培训讲义

武平一中信息学奥林匹克竞赛校本课程 C++编程 第一课时:认识C++程序和DEV-C++集成开发环境 一.学习目标: 1.认识C++程序结构; 2.掌握编程基本步骤; 3.记住“保存”、“编译”和“运行”的快捷键(ctrl+s、F9、F10) 二.学习内容与步骤: 1.双击桌面图标,启动DEV-C++集成开发环境,单击“文件”菜单下的“新建——>源代码”命令,在程序编辑区输入下面程序: #include #include using namespace std; int main() { cout<<"hello"; system("pause"); return 0; } 2.输入完毕,单击“文件”菜单下的保存命令。在弹出的“保存文件”对话框中保存位置选择“桌面”,文件名为“ex1”,文件类型为c++不必修改,单击保存。 3.单击“运行”菜单下的“编译”命令,窗口出现红色条时说明程序有错误,请对照修改,直到正确为止。 4.单击“运行”菜单下的“运行”命令;弹出新窗口,观察新窗口中内容,按一下键盘任意键(通常按空格键),返回编辑界面。 5.单击“文件”菜单“退出”命令,结束。 6.观察桌面的ex1.cpp和ex1.exe两个文件,双击“ex1.exe”试试,ex1.cpp 称为源程序,ex1.exe称为可执行程序,虽然这个程序简单了一点,但是电脑中的程序就是这样设计出来的。 7.参考以上步骤,输入下面这个程序: #include using namespace std; int main() { int a,b,c;

高精度算法大全

高精度算法大全 在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字. 一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据 的一种模拟加,减,乘,除,乘方,阶乘,开放等运算. 譬如一个很大的数字N >= 10^ 100, 很显然这样的数字无法在计算机中 正常存储. 于是, 我们想到了办法,将这个数字拆开,拆成一位一位的或者是四位四 位的存储到一个数组中, 用一个数组去表示一个数字.这样这个数字就被称谓是高精度数. 对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了高精度算法: 由于计算机输入计算结果的精度通常受到计算机的限制,如:在双精度方式下,计算机最多只能输出16位有效数字,如果超过16位,则只能按浮点形式输出,另外,一般计算机实数表示的范围为1038,如果超过这个范围,计算机就无法表示了。但是我们可以通过一些简单的办法来解决这个问题。这就是我们要说的高精度计算机。 一、基本方法:在计算机上进行高精度计算,首先要处理好以下几个基本问题: 1、数据的接收与存储; 2、计算结果位数的确定; 3、进位处理和借位处理; 4、商和余数的求法; 下面我们逐一介绍一下这几个问题的解决方法。 1、数据的接收与存储: 要在计算机上进行高精度计算,首先就应该有精确的输入,即计算机要精确地接收和存储数据。通常: ①、当输入的数值在计算机允许的范围内时,可以用数值型变量来接收数据。 ②、当输入的数据超过计算机允许显示的精度范围时,采用字符来接收数据。

③、分离各位数字。 接收数据子模块(字符型变量接收数据): prucedure readdata(var in:array[1..100] of integer); var ch:char; i,k:integer; begin read(ch);k:=0; while ch in['0'..'9'] do begin inc(k);int[k]:=ord(ch)-48; read(ch); end; end; 2、计算结果位数的确定 ①、两数之和的位数最大为较大的数的位数加1。 ②、乘积的位数最大为两个因子的位数之和。 ③、阶乘:lgn!=lgn+lg(n-1)+lg(n-2)...................+lg3+lg2+lg1 =lnn/ln10+ln(n-1)/ln10+ln(n-2)/ln10+................+ln3/ln10+ln2/ln1 0+ln1/ln10 =trunc(1/ln10* (lnn+ln(n-1)+ln(n-2)+...........+ln3+ln2+ln1) ) 乘方:lg(a ^b)=trunc(lg(a^b))+1 =trunc(b*lg a )+1 =trunc(b*ln a / ln10)+1 3、进位处理和借位处理 ①、加法的进位处理 进行加法处理时,先设置一个加法进位标志 T,并将 T 的初值设为 0。当两数相加时, 从低位到高位,各位数字分别相加,如果相加后某个单元中的数大于 10,则将该单元中的数

(完整)信息学奥赛(NOIP)必看经典书目汇总,推荐文档

信息学奥赛(NOIP)必看经典书目汇总! 小编整理汇总了一下大神们极力推荐的复习资料!(欢迎大家查漏补缺) 基础篇 1、《全国青少年信息学奥林匹克分区联赛初赛培训教材》(推荐指数:4颗星) 曹文,吴涛编著,知识点大杂烩,部分内容由学生撰写,但是对初赛知识点的覆盖还是做得相当不错的。语言是pascal的。 2、谭浩强老先生写的《C语言程序设计(第三版)》(推荐指数:5颗星) 针对零基础学C语言的筒子,这本书是必推的。 3、《骗分导论》(推荐指数:5颗星) 参加NOIP必看之经典 4、《全国信息学奥林匹克联赛培训教程(一)》(推荐指数:5颗星) 传说中的黄书。吴文虎,王建德著,系统地介绍了计算机的基础知识和利用Pascal语言进行程序设计的方法 5、《全国青少年信息学奥林匹克联赛模拟训练试卷精选》 王建德著,传说中的红书。 6、《算法竞赛入门经典》(推荐指数:5颗星) 刘汝佳著,算法必看经典。 7、《算法竞赛入门经典:训练指南》(推荐指数:5颗星) 刘汝佳著,《算法竞赛入门经典》的重要补充 提高篇 1、《算法导论》(推荐指数:5颗星) 这是OI学习的必备教材。

2、《算法艺术与信息学竞赛》(推荐指数:5颗星) 刘汝佳著,传说中的黑书。 3、《学习指导》(推荐指数:5颗星) 刘汝佳著,《算法艺术与信息学竞赛》的辅导书。(PS:仅可在网上搜到,格式为PDF)。 4、《奥赛经典》(推荐指数:5颗星) 有难度,但是很厚重。 5、《2016版高中信息学竞赛历年真题解析红宝书》(推荐指数:5颗星) 历年真题,这是绝对不能遗失的存在。必须要做! 三、各种在线题库 1、题库方面首推USACO(美国的赛题),usaco写完了一等基本上就没有问题,如果悟性好的话甚至能在NOI取得不错的成绩. 2、除此之外Vijos也是一个不错的题库,有很多中文题. 3、国内广受NOIP级别选手喜欢的国内OJ(Tyvj、CodeVs、洛谷、RQNOJ) 4、BJOZ拥有上千道省选级别及以上的题目资源,但有一部分题目需要购买权限才能访问。 5、UOZ 举办NOIP难度的UER和省选难度的UR。赛题质量极高,命题人大多为现役集训队选手。

信息学奥赛一本通算法(C版)基础算法:高精度计算

高精度加法(大位相加) #include using namespace std; int main() { char a1[100],b1[100]; int a[100],b[100],c[100];//a ,b,c 分别存储加数,加数,结果int lena,lenb,lenc,x,i; memset(a,0,sizeof(a));// 数组a 清零memset(b,0,sizeof(b));// 数组b 清零 memset(c,0,sizeof(c));// 数组c 清零//gets(a1); //gets(b1); //getchar(); while(scanf("%s%s",&a1,&b1)!=EOF) { lena=strlen(a1); lenb=strlen(b1); for(i=0;i<=lena;i++) a[lena-i]=a1[i]-'0';〃将数串al转化为数组a,并倒序存储//a[i]=a1[lena-i-1]-48; for(i=0;i<=lenb;i++) b[lenb-i]=b1[i]-'0';〃将数串al转化为数组a,并倒序存储//b[i]=b1[lenb-i-1]-48; lenc=1; //lenc 表示第几位 x=0; //x 是进位while(lenc<=lena||lenc<=lenb) { c[lenc]=a[lenc]+b[lenc]+x;// 第lenc 位相加并加上次的进位x=c[lenc]/10;// 向高位进 位 c[lenc]%=10;// 存储第lenc 位的值lenc++;// 位置下标变量 } c[lenc]=x; if(c[lenc]==0) lenc--; //处理最高进位 for(i=lenc;i>=1;i--) cout< using n amespace std; int mai n() { char n[256], n1[256], n2[256];

经典基本算法模块

复赛算法模块 信息学奥赛组 对于NOIP,基础是相当重要的,在3个小时之内做完4道题,那么就要求我们有相当快的速度。特别是对于一些简单的、常用的算法模块,一定要要熟练掌握并灵活运用。由于NOIP是一个比较基础的比赛,因此基本算法的掌握尤为重要,所以要求能够把这些基本的模块快速、准确的移植到不同的程序中,才能在稳中取胜 基本算法模块中最重要的是基本程序框架,也就是说,要养成适合于自己的程序风格,这样对于程序编写的速度与程序的准确度都有较大的提高。

小议竞赛的准备和考试技巧 1、良好的心态。无论竞赛多么重要,都不要在考试的时候考虑考试之前或以后的事,这很重要…… 2、充足的睡眠和营养。竞赛之前睡好觉,吃好饭,多吃甜食(据我们老师说在吃甜食后15分钟和2小时会各出现一次血糖高峰,会有比较好的竞技状态)。还有,宁可撒尿也不要口渴……口渴会严重影响思路……而尿素有兴奋作用,有利无害…… 3、正确的时间安排。一般来说应该先想完所有的题再开始做,但有的题想不出来的时候一定要给想出来的题留出时间。 4、算法的学习。一般的DFS/BFS、贪心、各种DP、二分法、排序、lr论文中的各种奇特算法、最短路、最长路、图的DFS/BFS、最大匹配,最大最小匹配、最佳匹配、差分限制系统、最长不xx子序列、高斯消元、数论算法…… 5、数据结构的学习。Hash、并查集、邻接表、边表、堆、树状数组和线段树及它们的多维形式、链表、单词查找树…… 6、关于混分:超时的搜索/DP往往能比错误的贪心得到更多的分。 7、数学很重要。比如母函数…… 8、专用的方法胜于通用的方法。 9、好的题目往往不能直接用经典算法解决。 10、真正难题的标程往往很短。 11、如果n很大,用汇编写的O(n^2)的程序绝对不如用QB写的O(n)的程序快。 12、如果n很小,利用压缩存储提高速度的O(n^2)的算法有可能比一般的O(n)算法快。 13、如果一个数学问题很复杂,那么看结果找规律有可能比数学推导快。 14、不要总把logn忽略掉。 15、即使是多项式算法,有时也可以加入很有效的剪枝。 16、做一道好题胜过做n道烂题,但如果不做烂题,可能会影响做好题的速度。

高精度模板(算法必备)

高精度计算模板 注意:减法、除法要用到compare函数 乘法需要加法的部分,加法需要减法部分 #include #include using namespace std; int compare(string str1, string str2) { if(str1.size() > str2.size()) return 1; else if(str1.size() < str2.size()) return -1; else return https://www.360docs.net/doc/df9422578.html,pare(str2); } int main() { char ch; string s1, s2, res; while(cin >> ch) { cin >> s1>> s2; switch(ch) { case '+': res = ADD_INT(s1, s2); break; //高精度加法 case '-': res = MINUS_INT(s1, s2); break; //高精度减法 case '*': res = MULTIPLY_INT(s1, s2); break; //高精度乘法 case '/': res = DIV_INT(s1, s2); break; //高精度除法,返回商 case 'm': res = MOD_INT(s1, s2); break; //高精度除法,返回余数 default : break; } cout << res<< endl; } return(0); }

string ADD_INT(string str1, string str2) { string MINUS_INT(string str1, string str2); int sign = 1; string str; if(str1[0] == '-') { if(str2[0] == '-') { sign = -1; str = ADD_INT(str1.erase(0, 1), str2.erase(0, 1)); }else { str = MINUS_INT(str2, str1.erase(0, 1)); } }else { if(str2[0] == '-') str = MINUS_INT(str1, str2.erase(0, 1)); else { string::size_type l1, l2; int i; l1 = str1.size(); l2 = str2.size(); if(l1 < l2) { for(i = 1; i <= (int)(l2 - l1); i++) str1 = "0" + str1; }else { for(i = 1; i <= (int)(l1 - l2); i++) str2 = "0" + str2; } int int1 = 0, int2 = 0; for(i = str1.size() - 1; i >= 0; i--) { int1 = (int(str1[i]) - 48 + int(str2[i]) - 48 + int2) %10; int2 = (int(str1[i]) - 48 + int(str2[i]) - 48 +int2) / 10; str = char(int1 + 48) + str; } if(int2 != 0) str = char(int2 + 48) + str; } } //运算后处理符号位 if((sign == -1) && (str[0] !='0')) str = "-" + str; return str; }

相关文档
最新文档