题目:
输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3 ,则打印1,2,3 一直到999
当然有程序员会很容易想出一个答案:循环数字相乘-->打印
仔细分析:如果相乘的数字溢出怎么办?
那我们就得另外想办法了。
code:
<span style="font-size:14px;">void Print_1_To_Max(int n)
{
if (n <= 0)
return;
char *number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
while (!Increase(number , n ))
{
Print(number , n);
}
delete[] number;
}</span><span style="font-size:18px;">
</span>
上面的另外两个函数code:
bool Increase(char* number , int len )
{
bool Isoverflow = false; //是否越界
int step = 0; //进位
for (int i = len - 1; i >= 0; --i)
{
int Sum = number[i] - '0' + step;
if (i == len - 1)
Sum++;
if (Sum >= 10)
{
if (i == 0)
Isoverflow = true; //sum>=10,i==0 说明在第一个字符产生越界
else
{
Sum -= 10;
step = 1;
number[i] = '0' + Sum;
}
}
else
{
number[i] = '0' + Sum;
break;
}
}
return Isoverflow;
}
void Print(char* number , int n )
{
if (number == NULL || n <= 0)
return;
bool flag = true;
for (int i = 0; i < n; ++i)
{
//采用flag主要是为了不打印前面的0 , 而可以打印数字后面的0 例如:20,200 。。。
if (flag&&number[i] != '0')
flag = false;
if (!flag)
{
printf("%c", number[i]);
}
}
printf("\t");
}
这样看起来是不是不是能解决问题了呢?
哈哈 ,我已经测试过 ,妥妥的。
如果有测试失败的话,记得留言,一起探讨。
AllOfCode:
bool Increase(char* number , int len )
{
bool Isoverflow = false; //是否越界
int step = 0; //进位
for (int i = len - 1; i >= 0; --i)
{
int Sum = number[i] - '0' + step;
if (i == len - 1)
Sum++;
if (Sum >= 10)
{
if (i == 0)
Isoverflow = true; //sum>=10,i==0 说明在第一个字符产生越界
else
{
Sum -= 10;
step = 1;
number[i] = '0' + Sum;
}
}
else
{
number[i] = '0' + Sum;
break;
}
}
return Isoverflow;
}
void Print(char* number , int n )
{
if (number == NULL || n <= 0)
return;
bool flag = true;
for (int i = 0; i < n; ++i)
{
//采用flag主要是为了不打印前面的0 , 而可以打印数字后面的0 例如:20,200 。。。
if (flag&&number[i] != '0')
flag = false;
if (!flag)
{
printf("%c", number[i]);
}
}
printf("\t");
}
void Print_1_To_Max(int n)
{
if (n <= 0)
return;
char *number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
while (!Increase(number , n ))
{
Print(number , n);
}
delete[] number;
}