题目:
输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
思路:
首先注意这是个大数问题,n很大的时候c++的int和long long都吃不消,所以数字的存储要用字符串
这里我模拟了大数相加,只不过每次都是加1
另外要注意打印的问题,cout比较慢,要用printf,还有打印的时候要从第一个非0数字开始打印
#include <iostream>
using namespace std;
void Print(char* numbers,int n)
{
int flag = 0;//flag为0,说明还没遇到第一个非0数字
for (int i = 0; i < n; ++i)
{
if (!flag&&numbers[i] != '0')
flag = 1;
if (flag)
printf("%c", numbers[i]);
}
printf("\t");
}
void Print1ToMaxDigits(int n)
{
if (n <= 0)
return;
char* numbers = new char[n + 1];
for (int i = 0; i < n + 1; ++i)
numbers[i] = '0';
int carry = 0;
while (!(numbers[0]-'0'))
{
int temp = numbers[n] - '0';
int plus = (temp + 1 + carry) % 10;
carry = (temp + 1 + carry) / 10;
numbers[n] = plus + '0';
if (carry != 0)
{
for (int i = n - 1; i >= 0&&carry; i--)
{
int t = numbers[i] - '0';
int x = (t + carry) % 10;
carry = (carry + t) / 10;
numbers[i] = x + '0';
}
}
if (!(numbers[0]-'0'))
Print(numbers,n+1);
}
}
// ====================测试代码====================
void Test(int n)
{
printf("Test for %d begins:\n", n);
Print1ToMaxDigits(n);
printf("\nTest for %d ends.\n", n);
}
int main(int argc, char* argv[])
{
//Test(1);
Test(2);
Test(3);
Test(0);
Test(-1);
system("pause");
return 0;
}