字符串上模拟加法
题目:
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1,2,3,一直到最大的3位数即999。
此题看起来简单,当我刚开始看到问题后,首先想到的就是先求出最大值,然后在一个一个打印出就ok啦。但是仔细理解题意,并没有告诉n的取值范围。若n的值非常大,可能就超过了int或者long long的范围。也就是说在做此题时,需要考虑大数。
为解决存大数的问题,我们可以利用数组或者字符串存大数。接下来我用字符串来解决大数问题。
首先,需要考虑两个问题:
(1)在字符串上模拟加法
(2)将字符串中的数字打印出来
程序实现:
模拟加法:
boolinc(char*num,intn)//模拟加法{inti=0;intm=0;inttake=0;//进位for(i=n-1;i>=0;i--){m=num[i]-'0'+take;take=0;//进位置0if(i==n-1)//从末尾加{m++;}if(m>=10)//产生进位{if(i==0)//若最高为溢出,终止return0;else{take=1;num[i]=m-10+'0';//进位后,将本位置0}}else{num[i]=m+'0';//不产生溢出时,在本位上加}}returntrue;}
打印:
//voidprint(char*num,intn)//{//boolflag=true;//标志位//inti=0;//for(i=0;i<n;i++)//{//if(flag&&num[i]!='0')//{//flag=false;//}//if(!flag)//若高位不为0,打印//{//printf("%c",num[i]);//}//}//cout<<"";//}voidprint(char*num,intn){inti=0;for(i=0;i<n;i++){if(num[i]!='0')break;}printf("%s",num+i);}
测试:
intmain(){intn=3;//3位数char*str=newchar[n+1];//字符串的最后一位为‘\0’,多开辟一个空间memset(str,'0',n);//初始化str[n]='\0';while(inc(str,n)){print(str,n);}delete[]str;//释放空间str=NULL;return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。