【1】题目
【2】思路
(1)一般解法
(2)正确解法
【3】代码
#include <stdio.h>
#include <iostream>
#include<vector>
#include<time.h>
#include<cstring>
using namespace std;
bool Increment(char *number)
{
bool isOverflow = false;
int nTakeOver = 0;
int nLength = strlen(number);//输入的数组的长度
for (int i = nLength-1; i >=0; i--)//从最高位开始向最低位遍历
{
int nSum = number[i] - '0' + nTakeOver;
if (i== nLength-1)//若最后一位有数,即a[0],即数字的长度接近最大n位数。
{
nSum++;
}
if (nSum>=10)//nsum大于10,判断是溢出还是需要进位
{
if (i==0)//终止条件,数组的第一位变为0,溢出,之前为9999.....99
{
isOverflow = true;
}
else//进1位
{
nSum -= 10;
nTakeOver = 1;
number[i] = '0' + nSum;
}
}
else//小于10,无需进位
{
number[i] = '0' + nSum;
break;
}
}
return isOverflow;
}
//打印输出数组
void PrintNumber(char* number)
{
bool isBeginning0 = true;
int nLength = strlen(number);
for (int i = 0; i < nLength; ++i)
{
if (isBeginning0 && number[i]!='0')//打印终止条件
{
isBeginning0 = false;
}
if (!isBeginning0)
{
printf("%c", number[i]);
}
}
printf("\t");
}
void Print1ToMaxofNDigits(int n)
{
if (n<=0)
{
return;
}
char *number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
//Increment(number)判断是否到达最大位置
//只要当其达到最大值时,数组的第一位才会产生进位。
//n = 7时候的最大数字。数字从右向左读。右边是最高位,左边是最低位
//只有当达到最大值时,左边第一位a[0]才会等于9,再添加数据就会进位。
//9999999 0099999
//0123456 0123456
while (!Increment(number))
{
PrintNumber(number);
}
delete[]number;
}
void main()
{
Print1ToMaxofNDigits(3);
cin.get();
}