一、题目描述
输入数字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);
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~