剑指offer 12 -打印1到最大的n位数

来源:互联网 发布:天空表白墙源码v4.1 编辑:程序博客网 时间:2024/05/22 16:45

注意点:(1)n很大,溢出,采用字符串表示数

                  (2)如何判断每一次增加1后是不是到了最大的n位数


#include<iostream>using namespace std;// 方法1bool Increment(char *number){int nTakeOver =0;int nLength=strlen(number);for(int i=nLength-1;i>=0;i--){int nSum=number[i]-'0'+nTakeOver;if(i==nLength-1)nSum++;if(nSum>=10){if(i==0)return true;else{nSum-=10;nTakeOver=1;number[i]=nSum+'0';}}else{number[i]=nSum+'0';break;}}return false;}     void printNumber(char *number){int isBegining=false;int nLength=strlen(number);for(int i=0;i<nLength;i++){if(number[i]!='0'&&  ( ! isBegining)  )isBegining=true;if(isBegining)cout<<number[i];}cout<<"";}void printToMaxOfDigits1(int n){if(n<=0)return ;char *number=new char[n+1];memset(number,'0',n);number[n]='\0';while(!Increment(number)){printNumber(number);}delete []number;}//方法2  递归void IncrementRecursively(char *number,int n,int index){if(index==n-1){printNumber(number);return;}for(int i=0;i<10;i++){number[index+1]=i+'0';IncrementRecursively(number,n,index+1);}}void printToMaxOfDigits2(int n){if(n<=0)return ;char *number=new char[n+1];number[n]='\0';for(int i=0;i<10;i++){number[0]=i+'0';IncrementRecursively(number,n,0);}delete []number;}int main(){printToMaxOfDigits1(2);printToMaxOfDigits1(0);printToMaxOfDigits2(2);printToMaxOfDigits2(-1);}
2.两个大数相加
#include<iostream>using namespace std;int main(int argc,char* argv[]){int T;cout<<"输入测试组数: ";cin>>T;int len,k,i;while(T--){char a[1000],b[1000],sum[1001];cout<<"输入相加数: ";cin>>a>>b;for(i=0;i<1001;i++)sum[i]='0';len=strlen(a);for(i=len-1,k=0;i>=0;i--,k++){sum[k]=sum[k]+a[i]-'0';int n=k;while(sum[n]>'9'){sum[n+1]=sum[n+1]+(sum[n]-'0')/10;sum[n]=(sum[n]-'0')%10+'0';n++;}}len=strlen(b);for(i=len-1,k=0;i>=0;i--,k++){sum[k]=sum[k]+b[i]-'0';int n=k;while(sum[n]>'9'){sum[n+1]=sum[n+1]+(sum[n]-'0')/10;sum[n]=(sum[n]-'0')%10+'0';n++;}}    for(i=1000;sum[i]=='0';i--);cout<<a<<" + "<<b<<" =  ";for(;i>=0;i--)cout<<sum[i];cout<<endl;if(T>0)cout<<endl;}return 0;}


0 0
原创粉丝点击