程序设计实习第四高精度计算.pptVIP

  • 2
  • 0
  • 约9.03千字
  • 约 33页
  • 2018-08-20 发布于江苏
  • 举报
程序设计实习第四高精度计算

例题:ai2981大整数加法 (P159) 问题描述 求两个不超过200位的非负整数的和。 输入数据 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。 输出要求 一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 输入样例 22222222222222222222 33333333333333333333 输出样例 55555555555555555555 例题:ai2952 循环数 问题描述 当一个N位的整数X满足下列条件时,称其为循环数:X与任意一个整数1≤Y ≤ N相乘时,都将产生一个X的“循环”。即:分别将这两个整数的第1位数字与最后1位数字连在一起,可以得到一个相同的数字循环;当然两个整数在该数字循环中的起始位置不同。例如,142857是一个循环数 142857 *1 = 142857 142857 *2 = 285714 142857 *3 = 428571 142857 *4 = 571428 142857 *5 = 714285 142857 *6 = 857142 输入 写一个程序判断一个整数是否是循环数。输入文件是一个整数序列,每个整数长度为2~60。注意:每个整数前面的零被看作是该整数的一部分,在计算N时要统计。例如“01”是一个2位的整数,而“1”是一个1位的整数。 输出 对每个输入整数,输出一行,说明该整数是否是循环数。 样例输入 142857 142856 142858 01 0588235294117647 样例输出 142857 is cyclic 142856 is not cyclic 142858 is not cyclic 01 is not cyclic 0588235294117647 is cycl 解题思路 高精度的乘法:整数可能达60位 X*1: Y0 = X; X*2: Y1 = Y0+X X*3: Y2 = Y1+X …… Yi是否是X的“循环”? 解题思路: Yi是否是X的“循环”? 穷举:N位整数,循环移位可以有N种可能 循环移位方法: Yi是否是“XX” 的子串? * * 程序设计实习 第四讲 高精度计算 程序设计实习 第四讲 高精度计算 新课程网址: /cpp2009/ 例题:ai2981大整数加法 (P159) 解题思路 1) 用字符型或整型数组来存放大整数 an[0]存放个位数,an[1]存放十位数,an[2]存放百位数…… 2)模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10则进位。 用unsigned an1[201]保存第一个数,用unsigned an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1中。要注意处理进位。 #include stdio.h #include string.h #define MAX_LEN 201 int an1[MAX_LEN+10]; int an2[MAX_LEN+10]; char szLine1[MAX_LEN+10]; char szLine2[MAX_LEN+10]; int Add(int nMaxLen , int * an1, int * an2) //将长度最多为 nMaxLen 的大整数 an1和an2 相加,结果放在an1, //an1[0],an2[0]对应于个位 { int nHighestPos = 0; for(int i = 0;i nMaxLen; i ++ ) { an1[i] += an2[i]; //逐位相加 if( an1[i] = 10 ) { //看是否要进位 an1[i] -= 10; an1[i+1] ++; //进位 } if( an1[i] ) nHighestPos = i; //记录最高位的位置 } return nHighestPos; } int main() { scanf(%s, szLine1); scanf(%s, szLine2); int i, j; //库函数memeset将地址an1开始的sizeof(an1)字节内容置成0 //sizeof(an1)的值就是an1的长度 //memset函数在string.h中声明 memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); //下面将szLine1中存储的字符串形式的整数转换到an1中去, //an1[0]对应于个位 int nLen1 = strlen( szLine1);

文档评论(0)

1亿VIP精品文档

相关文档