• 剑指Offer:打印从1到最大的n位数


    题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999

    陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或long long都会溢出,故使用字符串来模拟数字加法

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void print_cur_number(char *s)
    {
        char *p = s;
        while( *p != '' )
        {
            if( *p == '0' ) // 找到第一个非0数字的位置
                p++;
            else
                break;
        }
        printf("%s
    ",p);
    }
    
    int increase_one(char *s)
    {
        int i;
        int len = strlen(s);
        int carry = 0; // 进位标志
        int over = 0; // over=1, 表示当前值已经是n位数的最大值了, 再+1将成为n+1位数
    
        for( i=len-1; i>=0; i-- )
        {
            int sum = s[i]-'0'+carry;
            if( i == len-1 )
                ++sum; // 第一次循环, 最低位+1
            if( sum>=10 ) // 当前位>=10, 需要往高一位进一
            {
                if( i==0 ) // 发生最高位的进位,说明当前值(未+1之前)已经是n位数的最大值了
                    over = 1;
                else // 非最高位的进位
                {
                    sum -= 10;
                    s[i] = '0'+sum;
                    carry = 1;
                }
            }
            else // 当前值+1之后, 未发生进位, 结束循环
            {
                s[i] = sum +'0';
                break;
            }
        }
        return over;
    }
    
    void print_to_max_n_digit(int n)
    {
        char *s = malloc(n+1);
        memset(s, '0', n);
        s[n] = '';
    
        if( n<=0 )
            return ;
    
        while( !increase_one(s) )
        {
            print_cur_number(s);
        }
        free(s);
    }
    
    int main(void)
    {
        int n;
        printf("打印1-最大的n位数,请输入n: ");
        scanf("%d",&n);
        print_to_max_n_digit(n);
    
        return 0;
    }
    
  • 相关阅读:
    Textbox 自动调节高度
    Sharepoint 2010 备份与恢复 (二)
    Sharepoint 2010 备份与恢复 (一)
    Sharepoint 查看站点集是否锁住状态
    Sharepoint安装Infopath Service
    php分页显示类——在线拍卖行(1)
    php一个比较基础的文件上传的代码
    html表单的type属性
    JQuery简单表单验证
    最近的一些思考,感悟和理解。
  • 原文地址:https://www.cnblogs.com/DayByDay/p/3864279.html
Copyright © 2020-2023  润新知