
剑指offer面试题12 打印从1到最大的n位10进制数 。陷阱在于 当输入的n很大时,不管用int 或 long long 都会溢出。这个代码 剑指offer源码上已经给出。于此相关的题目是
定义一个函数,实现任意两个整数的加法,因为没有限定两个数的大小范围,所以也要当做大数问题处理,既用字符串表示。
代码如下:
[cpp] view plain copy
void BigNumberPlus(char * number1,char* number2)
{
char* Sum = new char[MAXSIZE +2]; //MAXSIZE 为宏定义
int len1 = strlen(number1);
int len2 = strlen(number2);
int maxLen = len1 > len2 ?len1 :len2;
char* temp1 = new char[maxLen +1];
char* temp2 = new char[maxLen +1];
memset(temp1,'0',maxLen); //初始化的过程已经补齐字符串
temp1[maxLen] = '\0';
memset(temp2,'0',maxLen);
temp2[maxLen] = '\0';
int nSum = 0;
int isCarryBit = 0;
int isOverflow = 0;
int i=0,j =0;
//////////////////////反转字符串
for (i = len1 -1;i>=0;i--)
{
temp1[j++] = number1[i];
}
temp1[j] = '\0';
j =0;
for (i = len2 -1;i>=0;i--)
{
temp2[j++] = number2[i];
}
//////////////////////字符串相加,从低位到高位
for (i= 0; i< maxLen;i++)
{
nSum = temp1[i] -'0'+ temp2[i] - '0' + isCarryBit;
//////是否有进位
if ( nSum >9)
{
if (i == maxLen -1)
{
isOverflow = 1; //是否溢出
}
isCarryBit = 1;
Sum[i] = nSum - 10 + '0';
}
else
{
isCarryBit = 0;
Sum[i] = '0' + nSum;
}
}
if (isOverflow)
{
Sum[maxLen++] = '0'+ isCarryBit;
}
Sum[maxLen] = '\0';
///////////////打印
for (i = maxLen -1;i>=0;i --)
{
cout << Sum[i];
}
cout<<endl;
delete[] temp1;
delete[] temp2;
delete[] Sum;
}
main函数为:
[cpp] view plain copy
int main()
{
char* number1 = new char[MAXSIZE +1];
char* number2 = new char[MAXSIZE +1];
number1 = new char[MAXSIZE +1];
number2 = new char[MAXSIZE +1];
cout<<"please input a number:"<<endl;
gets(number1);
cout<<"please input a number:"<<endl;
gets(number2);
BigNumberPlus(number1,number2);
cout<<"please input a number:"<<endl;
gets(number1);
cout<<"please input a number:"<<endl;
gets(number2);
BigNumberPlus(number1,number2);
cout<<"please input a number:"<<endl;
gets(number1);
cout<<"please input a number:"<<endl;
gets(number2);
BigNumberPlus(number1,number2);
system("pause()");
return 0;
}
运行结果为: