• 剑指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;
    }
    
  • 相关阅读:
    C系统,操作符和词法元素
    值类型和引用类型
    WPF
    C#版本进化
    快速排序
    C语言字符串
    查找
    简单快速排序
    PHP运行出现Notice : Use of undefined constant 的解决办法
    vs2010 修改注释模板
  • 原文地址:https://www.cnblogs.com/DayByDay/p/3864279.html
Copyright © 2020-2023  润新知