《剑指offer》——打印1到最大的n位数

来源:互联网 发布:淘宝限制购物怎么解除 编辑:程序博客网 时间:2024/05/29 13:44

考虑大数问题,使用字符数组存储,

#include<iostream>using namespace std;bool inc(char *num){    //累加结束标志,初始为false    //只有当下标为0的位置上产生进位时,才能表明打印结束    bool flag = false;    int len = strlen(num);    int c = 0;//进位标志    for(int i = len - 1; i >= 0; i--)    {        num[i] = num[i] + c;        if(i == len - 1)//每次自加都在第len-1位上进行            ++num[i];        if(num[i] > '9')//如果大于9,则进位        {            if(i == 0)//如果在第0位置上产生进位,设置flag为true                flag = true;            else//否则将当前位置上的值减10,并将进位标志置1            {                num[i] -= 10;                c = 1;            }        }        else        {            break;//如果不大于10,则结束循环,直接打印        }    }    return flag;}void show(char *num){    while(*num == '0')//跳过之前为0的字符,如跳过098前面的0        num++;    while(*num != '\0')//输出当前的字符    {        cout << *num;        num++;    }}void print(int n){    if(n <= 0)//错误的输入        cout << "error" << endl;    char *num = new char[n + 1];//新建一个长度为n+1的字符数组    memset(num, '0', n);//将数组初始化    num[n] = '\0';//设置结束位    while(!inc(num))        show(num);//循环打印每个数}int main() {    print(3);//输出1~999    return 0;}
0 0
原创粉丝点击