c++面试题之打印1到最大的n位数

打印1到最大的n位数

输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3,一直到最大的3位数即999.
思路:看是简单,但是需要注意数据超出类型范围,会溢出。所以较大的数如何表示,才是需要思考的问题。
进一步思路:用字符串表示大数。在字符串上模拟数字加法的解法。字符串里每个字符都是‘0’到‘9’之间的数字。因为数字最大时n位的,所以需要长度n+1的字符串。当实际数字不够n位时在字符串前半部分补0。
具体思路:从字符串末位开始依次加一,然后直接输出。当加到10则进位。当第一位字符为’10’则退出。
字符串输出应该跳过开始的0字符。

bool add(char * number)
{
    bool isOverflow = false; //溢出
    int TakeOver = 0;        //进位
    int Length = strlen(number);
    for(int i=Length-1;i>=0;i--)
    {
        int sum=number[i]-'0'+TakeOver;
        if(i==Length-1)
            sum++;
        if(sum == 10){
            if(i==0)
                isOverflow = true;
            else{
                sum-=10;
                TakeOver = 1;
                number[i]='0'+sum;
            }
        }
        else{
            number[i]='0'+sum;
            break;
        }
    }
    return  isOverflow;


}
void Printf(char* number)
{
     bool begin0 = true;
     int length = strlen(number);
     for(int i=0;i<length;i++){
         if(begin0&&number[i]!='0')
             begin0 = false;
         if(!begin0)
         {
         printf("%c",number[i]);
         }
     }
     printf("\t");
}
int main(int argc, _TCHAR* argv[])
{   
    int n;
    cin>>n;
    char *number = new char[n+1];
    memset(number,'0',n);
    number[n]='\0';
    cout<<number<<endl;
    while(!add(number)){
    Printf(number);
    }  
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值