面试题12:打印1到最大的n位数

本文介绍了一种使用字符串模拟整数加法的方法,以解决打印从1到最大的n位十进制数的问题。当n较大时,传统的整数类型无法存储如此大的数值,因此采用字符串存储并实现递增和打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3,4,5一直到最大的3位数999。

思路:看到题目的第一反应,应该是想到先把这个最大的数给找出来,然后在从1一直输出到这个数。

void printToMax(int n)
{
    int maxNum = 1;
    
    for(int i = 0; i < n; ++i)
    {
        maxNum = 10 * maxNum;
    }
    for(int i = 1; i < maxNum; ++i)
    {
        cout<<i<<endl;
    }
    
}



但是这个做法存在一个潜在的陷阱,当n比较大的时候,不能用int,double,long来存储时,程序会发生错误。

所以我们需要换一个策略,可以用字符串来存储,用字符串来模拟整数的加法过程。

int main(int argc, const char * argv[]) {
    
    int n = 9;
    char *number = new char[n + 1];
    memset(number, '0', n+1);
    number[n] = '\0';
    
    while(!increment(number))
    {
        printnumber(number);
    } 
    delete[] number;
    return 0;
}


increment()实现模拟整数递增的功能,printnumber()实现显示的功能。

bool increment(char *s) //将字符串看成整数 实现递增
{
    int length = strlen(s);
    
    int nTakeover = 0;
    bool isOverflow = false; //是否到达了最高n位整数
    
    for(int i = length - 1; i >= 0; i--)
    {
        int nSum = s[i] - '0' + nTakeover;   //nSum为整数 不是char型
        if(i == length - 1)
            nSum++;           //第一次循环时 最后一位数+1
            
        if(nSum >= 10)        //当nSum>=10时 说明此位需要进位 
        {
            if(i == 0)        //当i=10时 说明第一位也需要进位 说明这个时候已经到达了n位最大数 循环到此结束 返回1
            {
                isOverflow = true;
                
                break;
            }
            else
            {
                nTakeover = 1;     //当i!=0时 说明时中间的位数需要进位 使进位标识为1
                s[i] = '0';     //将进位的此为置为0
            }
           
        }
        else
        {
            s[i] = '0' + nSum;       //如果此位没有进行进位 那么前面的位数也不可能进位 所以到这里直接break
            break;
        }
        
    }
    
    return isOverflow;
}


void printnumber(char *s)  //从第一个非0位开始输出
{
    int length = strlen(s);
    int flag = 0;

    for(int i = 0; i < length; i++)
    {
        if(s[i] == '0' && flag==0)
        {
            continue;
        }
        flag = 1;
        cout<<s[i];
        
    }
    cout<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值