打印1到最大的n位数
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3,一直到最大的3位数即999.
思路:看是简单,但是需要注意数据超出类型范围,会溢出。所以较大的数如何表示,才是需要思考的问题。
进一步思路:用字符串表示大数。在字符串上模拟数字加法的解法。字符串里每个字符都是‘0’到‘9’之间的数字。因为数字最大时n位的,所以需要长度n+1的字符串。当实际数字不够n位时在字符串前半部分补0。
具体思路:从字符串末位开始依次加一,然后直接输出。当加到10则进位。当第一位字符为’10’则退出。
字符串输出应该跳过开始的0字符。
bool add(char * number)
{
bool isOverflow = false; //溢出
int TakeOver = 0; //进位
int Length = strlen(number);
for(int i=Length-1;i>=0;i--)
{
int sum=number[i]-'0'+TakeOver;
if(i==Length-1)
sum++;
if(sum == 10){
if(i==0)
isOverflow = true;
else{
sum-=10;
TakeOver = 1;
number[i]='0'+sum;
}
}
else{
number[i]='0'+sum;
break;
}
}
return isOverflow;
}
void Printf(char* number)
{
bool begin0 = true;
int length = strlen(number);
for(int i=0;i<length;i++){
if(begin0&&number[i]!='0')
begin0 = false;
if(!begin0)
{
printf("%c",number[i]);
}
}
printf("\t");
}
int main(int argc, _TCHAR* argv[])
{
int n;
cin>>n;
char *number = new char[n+1];
memset(number,'0',n);
number[n]='\0';
cout<<number<<endl;
while(!add(number)){
Printf(number);
}
return 0;
}