12-打印1到最大的n位数

一、题目描述

输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3、...、999,最大的3位数即999

二、解题思路

【题目陷阱】
当输入的n很大的时候,求最大的n位数不论用int还是long long都会溢出,所以,在表示大数问题时,最容易想到的方法是用字符串或者数组来表达大数。此题用字符串来存1到n位十进制数的所有输出数

代码编写时,要注意分清进位和溢出的处理

三、解题算法

/*************************************************************
Author:tmw
date:2018-6-30
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

/**increase_fun()
* 给当前字符串number做加法::溢出判断,进位判断
*/
bool increase_fun(char* number)
{
    /**溢出位判断**/
    bool isOverFlow = false;
    /**进位**/
    int carry_bit = 0;
    int len = strlen(number);

    int i;
    /**从最低位加起,逐步进位**/
    for( i=len-1; i>=0; i-- )
    {
        int current_number = number[i]-'0'+carry_bit;

        /**最低位做加法**/
        if( i == len-1 )
            current_number++;

        /**如果有进位的情况**/
        if( current_number >= 10 )
        {
            /**如果溢出--最高位已经是9**/
            if( i == 0 )
                isOverFlow = true;
            else
            {
                current_number = current_number-10;
                carry_bit = 1;
                /**更新进位后该位置的数字**/
                number[i] = current_number+'0';
            }
        }
        else /**有进位,填进位;无进位,填此位**/
        {
            number[i] = current_number+'0';
            break;
        }
    }
    return isOverFlow;
}

/**Print_rule()
* 打印当前字符串里的数字---去掉前面的0
*/
void Print_rule( char* number )
{
    int len = strlen(number);
    /**记录前一位是不是0**/
    bool beginis0 = true;
    int i;
    for(i = 0; i < len; i++)
    {
        /**找到第一个当前位不为0的位置,然后从该位置起打印**/
        if( number[i] != '0' && beginis0 )
            beginis0 = false;
        if( !beginis0 )
            printf("%c",number[i]);
    }
    printf("\n");
}

/**Print1_ToMax_Digits()
* 打印1到最大n位数
*/
void Print1_ToMax_Digits( int n )
{
    /**入参检查**/
    if(n<=0)
        return;

    /**定义存储返回结果的字符串,最后一位留给\0**/
    char* number = (char*)malloc((n+1)*sizeof(char));
    memset(number,'0',n);
    number[n] = '\0';

    /**increase_fun给当前字符串number做加法::溢出判断,进位判断**/
    while( !increase_fun(number) )
    {
        /**当前字符串number打印::去掉前面的0**/
        Print_rule(number);
    }
    free(number);
}



梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值