大数问题
发布时间:2020-12-14 01:50:38 所属栏目:大数据 来源:网络整理
导读:题目: 打印1到最大的n位数 一开始看到这个题觉得很简单,就随手写了一小段程序,后来才深深意识到还是too young too naive。 以下这段是第一次写出的代码。 运行正确又怎样?你输入一个100000000000000000000000000000000000000000000试试啊,还自作聪明的
题目: 打印1到最大的n位数 一开始看到这个题觉得很简单,就随手写了一小段程序,后来才深深意识到还是too young too naive。 以下这段是第一次写出的代码。 运行正确又怎样?你输入一个100000000000000000000000000000000000000000000试试啊,还自作聪明的用了一个long long类型输出,然并卵好吗 void?print1ToMaxN(int?n) { long?long?i?=?0; while?(i?<?pow(10,?n)) { cout?<<?i<<"?"; i++; } } 程序1.0????用字符串模拟大数加法 ????经过参考了一些程序之后,写出来如下程序 bool?Increment(char*number)//判断字符串是否已经到最大值 { bool?IsOverFlow?=?false;//溢出 int?nTakeover?=?0;//进位 int?nLength?=?strlen(number); for?(int?i?=?nLength?-?1;?i?>=?0;?i--) { int?sum?=?number[i]?-?'0'?+?nTakeover;//转化为数字 if?(i?==?nLength?-?1) sum++; if?(sum?>=?10) { if?(i?==?0) IsOverFlow?=?true; else { sum?-=?10; nTakeover?=?1; number[i]?=?'0'?+?sum;//转化为字符 } } else { number[i]?=?'0'?+?sum;//从数字转化为字符 break; } } return?IsOverFlow; } void?PrintNumber(char*number) { bool?isBeginning0?=?true; int?length?=?strlen(number); for?(int?i?=?0;?i?<?length;?++i) { if?(isBeginning0&&number[i]?!=?'0') isBeginning0?=?false; if?(!isBeginning0)//跳过0打印 { printf("%c",?number[i]); } } } void?print1ToMaxN(int?n) { if?(n?<?0) return; char*number?=?new?char[n?+?1]; memset(number,?'0',?n); number[n]?=?' '; while?(!Increment(number)) { PrintNumber(number); } delete[]number; } 注意: 1.应考虑到大数问题 2.在打印时的边界值判断问题 3.打印时遇到0怎么办 程序1.1 ????既然有了上面的程序,不难想到可以用递归来实现(其实我也觉得挺难的……) void?PrintNumber(char*number) { bool?isBeginning0?=?true; int?length?=?strlen(number); for?(int?i?=?0;?i?<?length;?++i) { if?(isBeginning0&&number[i]?!=?'0') isBeginning0?=?false; if?(!isBeginning0)//跳过0打印 { printf("%c",?number[i]); } } } void?PrintToMaxNRecursively(char*number,?int?length,int?index) { if?(index?==?length?-?1) { PrintNumber(number); return; } for?(int?i?=?0;?i?<?10;?i++) { number[index?+?1]?=?i?+?'0'; PrintToMaxNRecursively(number,?length,?index?+?1); } } void?print1ToMaxN(int?n) { if?(n?<?0) return; char*number?=?new?char[n?+?1]; number[n]?=?' '; for?(int?i?=?0;?i?<?10;?i++) { number[0]?=?i?+?'0'; PrintToMaxNRecursively(number,?n,?0); } delete[]number; } 未完待续 。。。。(更新关于大数加减乘除的方法) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |