在CSDN上看到的题,说是华为的上机题。第一次写的时候忘了最高位的进位。被一哥们指出。然后又加了两行。大整数加法应该是大数运算里最简单的,减法稍难,乘法还要难一些,除法最难。学计算机组成原理的时候,除法也是最烦的,运行速度最慢的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #include <stdio.h> #include <string.h> #include <stdlib.h> //按小学学的方法做。 void add_big(const char *num1, const char * num2, char *result, int len) { char *p1 = num1 + strlen(num1) - 1; char *p2 = num2 + strlen(num2) - 1; char *r = result + len; int carry = 0; result[len+1] = '\0'; while (p1>=num1 && p2>=num2) { int tmp = (*p1-'0')+(*p2-'0')+carry; if (tmp>=10) { carry = 1; tmp = tmp - 10; *r = tmp + '0'; } else { carry = 0; *r = tmp + '0'; } r--; p1--; p2--; } while (p1>=num1) { int tmp = *p1-'0'+carry; if (tmp>=10) { carry = 1; tmp = tmp - 10; *r = tmp + '0'; } else { carry = 0; *r = tmp + '0'; } r--; p1--; } while (p2>=num2) { int tmp = *p2-'0'+carry; if (tmp>=10) { carry = 1; tmp = tmp - 10; *r = tmp + '0'; } else { carry = 0; *r = tmp + '0'; } r--; p2--; } if(carry==1) *r = '1'; //这儿是新加的。 else *r = '0'; } int main() { char *result; char *num1 = "99999999999999"; char *num2 = "99999999999999"; int len = 0; int num1_len = strlen(num1); int num2_len = strlen(num2); if (num1_len > num2_len) len = num1_len; else len = num2_len; result = (char *)malloc(len+2); memset(result, '0', len+2); if (result!=NULL) { char *p = result-1; add_big( num1, num2, result, len); while (*(++p)=='0'); printf("%s\n", p); } return 0; } |
August 24, 2010

谢谢你啊!我跟着你学,呵呵!
呵呵, 你自己肯定会写的。如果你有时间,可以去http://acm.timus.ru/problemset.aspx 看看,这个网页上给一些题分了类,可以做做Problems for Beginners和Data Structures Problems,练练手。肯定有帮助的。
这个好像有错误:char *p1 = num1 + strlen(num1) – 1;将const指针赋值给非const指针将出现编译期错误
#include
#include
#define N1 6
#define N2 6
using namespace std;
void addbig (int* num1, int* num2,int* result, int len);
int main ()
{
int num1[N1]={1,2,3,4,5,6};
int num2[N2]={2,3,4,5,6,7};
int len;
if (N1>N2)
len = N1+1;
else
len = N2+1;
int* result=new int[N2+1];
memset(result, 0, sizeof(int)*len);
addbig (num1, num2,result,len);
for (int i=0; i<len; i++)
{
if (i==0 && result[i]==0)
continue;
cout<<result[i]<<" ";
}
cout<=0 && j>=0)
{
result[leng]=num1[i]+num2[j];
i–;
j–;
leng–;
}
if(i==-1 && j!=-1)
{
while(j>=0)
{
result[leng]=num2[j];
j–;
leng–;
}
}
if(j==-1 && i!=-1)
{
while(i>=0)
{
result[leng]=num1[i];
i–;
leng–;
}
}
for (int k=len-1; k>0; –k)
{
if (result[k]>=10)
{
result[k-1]+=result[k]/10;
result[k]%=10;
}
}
}
代码发我邮件吧,因为我一拷出来,出了很多字符的错误。发我邮箱,我晚上再看。
是我写的代码,呵呵