- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序设计实习第四讲高精度计算.ppt
例题: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)