您的位置:首页 > 其它

打印1到最大的n位数

2015-10-18 19:30 357 查看
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。如输入3,则打印1 、2 、3一直到最大的3位数,即999。

分析:本题要考虑如何表达一个大数(即超出计算机所能表示的范围)的问题。常用的方法是用字符串来表示一个较大的数。本题可以先分配一个n+1大小的字符串数组,然后在该字符串数组上,模拟+1操作,并打印出结果。

void  Print1ToMaxofDigits(int iN)
{
if (iN <= 0){
return ;
}

char *number = new char[iN+1];
memset(number,'0', iN);//将字符串的初始值设置为'0'
number[iN]='\0';
while(!Increment(number)){//递增
PrintNumber(number);//打印
}
delete [] number;
}


void PrintNumber(char* number)
{
int i=0;
while(number[i] == '0'){
i++;
}
printf("%s\n",&number[i]);
}

bool Increment(char* number)
{
bool iOverflow = false;
int  iTakeOver = 0;
int  iLen = strlen(number);

for (int i=iLen-1; i>=0; i--)
{
int iSum = number[i]-'0'+iTakeOver;
if (i == iLen -1){
iSum++;
}

if (iSum >= 10){
if (i == 0 ){
iOverflow = true;
}else{
iSum -= 10;
iTakeOver = 1;
number[i] = iSum + '0';
}

}else{
number[i] = iSum + '0';
break;
}
}

return iOverflow;
}


扩展:用字符串模拟大数相加(正数)。

bool BigDataSum(char* num1, char* num2)
{
int iNum1Len = strlen(num1);
int iNum2Len = strlen(num2);
int iLen = 0;
iNum1Len>iNum2Len?(iLen=iNum1Len):(iLen=iNum2Len);

char* strNum1 = new char[iLen+1];
char* strNum2 = new char[iLen+1];
memset(strNum1,'0',iLen);
memset(strNum2,'0',iLen);
strNum1[iLen]='\0';
strNum2[iLen]='\0';

strcpy(strNum1+iLen-iNum1Len,num1);
strcpy(strNum2+iLen-iNum2Len,num2);
puts(strNum1);
int iTakeOver = 0;
bool bOverflow = true;
for (int i=iLen-1; i>=0; i--)
{
int iValue1 = strNum1[i]-'0';
int iValue2 = strNum2[i]-'0';
int iSum = iValue1+iValue2+iTakeOver;

if (iSum >= 10){
if (i == 0){
bOverflow = false;
}else{
iSum -= 10;
iTakeOver = 1;
strNum1[i] = iSum+'0';
}
}else{
strNum1[i] = iSum+'0';
}
}

puts(strNum2);
puts(strNum1);

delete[] strNum1;
delete[] strNum2;

return bOverflow;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: