zoukankan      html  css  js  c++  java
  • 剑指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;
    }
    
  • 相关阅读:
    【原】AMFObject数据格式详解
    STL总结 (C++)
    git相关项目迁移
    OBS_Classic经典版框架
    windows线程同步的几种方式
    面试题之strcpy / strlen / strcat / strcmp的实现
    python实用技巧
    Python Flask学习笔记之数据库
    Python Flask学习笔记之Web表单
    必应每日壁纸批量下载
  • 原文地址:https://www.cnblogs.com/DayByDay/p/3864279.html
Copyright © 2011-2022 走看看