如何存一个大数
发布时间:2020-12-14 01:54:54 所属栏目:大数据 来源:网络整理
导读:题目: ? ? 输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1,2,3,一直到最大的3位数即999。 ? ?此题看起来简单,当我刚开始看到问题后,首先想到的就是先求出最大值,然后在一个一个打印出就ok啦。但是仔细理解题意,并没有告诉n的取值
题目: ? ? 输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1,2,3,一直到最大的3位数即999。 ? ?此题看起来简单,当我刚开始看到问题后,首先想到的就是先求出最大值,然后在一个一个打印出就ok啦。但是仔细理解题意,并没有告诉n的取值范围。若n的值非常大,可能就超过了int或者long long的范围。也就是说在做此题时,需要考虑大数。 ? 为解决存大数的问题,我们可以利用数组或者字符串存大数。接下来我用字符串来解决大数问题。 ? 首先,需要考虑两个问题: ? (1)在字符串上模拟加法 ? (2)将字符串中的数字打印出来 程序实现: 模拟加法: bool?inc(char*?num,int?n)//模拟加法 { int?i?=?0; int?m?=?0; int?take?=?0;//进位 for(i=n-1;i>=0;i--) { m?=?num[i]-'0'+?take; take?=?0;//进位置0 if(i?==?n-1)?//从末尾加 { m++; } if(m?>=?10)//产生进位 { if(i?==?0)//若最高为溢出,终止 return?0; else { take?=?1; num[i]?=?m?-?10?+?'0';//进位后,将本位置0 } } else { num[i]?=?m?+?'0';//不产生溢出时,在本位上加 } } return?true; } ?打印: //void?print(char*?num,int?n) //{ // bool?flag?=?true;//标志位 // int?i?=?0; // for(i=0;i<n;i++) // { // if(flag?&&?num[i]?!=?'0') // { // flag?=?false; // } // if(!flag)//若高位不为0,打印 // { // printf("%c",num[i]); // } // } // cout<<"?"; //} void?print(char*?num,int?n) { int?i?=?0; for(i=0;i<n;i++) { if(num[i]?!=?'0') break; } printf("%s",num+i); } ?测试: int?main() { int?n?=?3;//3位数 char*?str?=?new?char[n+1];//字符串的最后一位为‘ ’,多开辟一个空间 memset(str,'0',n);//初始化 str[n]?=?' '; while(inc(str,n)) { print(str,n); } delete[]?str;//释放空间 str?=?NULL; return?0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |