新手问个问题!求高手解答!
编程实现可以用于如99999999999999999999999999999999999999999999999
+
99999999999999999999999999999999999999999999999
这样之类的超长数的加法
上面的数字只是参考
就是说此类的超长的数
要求短数业对才行
#include<stdio.h> #define maxlen 50 typedef int elemtype; typedef elemtype sqlist[maxlen]; int input(sqlist A) { int i; for(i=0;i<maxlen;i++) A[i]=0; printf("请输入数据:\n"); printf("请输入一个正整数的各位(以-1为结束符):\n"); i=0; while(1) { scanf("%d",&A[i]); if(A[i]<0) break; i++; } return i; } void output(sqlist A,int low,int high)//输出顺序表中的值 { int i; for(i=low;i<high;i++) printf("%d",A[i]); printf("\n"); } void move(sqlist A,int na)//把线性表中的元素一道后面 { int i; for(i=0;i<na;i++) A[maxlen-i-1]=A[na-i-1]; } int add(sqlist A,int na,sqlist B,int nb) { int nc,i,j,len; if(na>nb) nc=na; else nc=nb; move(A,na); move(B,nb); for(i=maxlen-1;i>=maxlen-nc;i--) { j=A[i]+B[i]; if(j>9) { A[i-1]=A[i-1]+1; A[i]=j-10; } else A[i]=j; if(i==(maxlen-nc)) { if(j>9) { A[i-1]=1; len=nc+1; } else len=nc; } } return len; } void main() { sqlist A,B; int na,nb,nc; na=input(A); nb=input(B); printf("整数A:"); output(A,0,na); printf("整数B:"); output(B,0,nb); nc=add(A,na,B,nb); printf("相加:"); output(A,maxlen-nc,maxlen); }这个是我自己做的
#include<stdio.h> #include<stdlib.h> #include<string.h> int t; char* getnum(char*p)// 输入字符串 { int i=0; p=(char*)malloc(sizeof(char));//开辟一个区间先 while ((p[i++]=getchar())!='\n')//判断 并 输入p[i] { p=(char*)realloc(p,(i+1)*sizeof(char));// } p[i]='\0'; //把最后一项 变成'\0’ 这个我还是不懂 printf("验证i=%d\n",i);//验证1 printf("%d\n",p[i-1]); return p; } int* bigadd(int*num,char*p1,char*p2)//相加 { int n=0; int ch1_n,ch2_n; ch1_n=strlen(p1);//判断p1的长度 减去多分配的一个区间 ch2_n=strlen(p2);//判断p2的长度 减去最后那个多余无值区间 num=(int*)malloc(sizeof(int)); while (ch1_n>=0||ch2_n>=0) { --ch1_n; //其实这个判断可以省略 --ch2_n; printf("ch1_n=%d\n",ch1_n); printf("ch2_n=%d\n",ch2_n); if (ch1_n>=0&&ch2_n>=0) num[n]=(p1[ch1_n]-'0')+(p2[ch2_n]-'0');//如果两个都还有数没有加 printf("num[0]=%d\n",num[0]); if (ch1_n<0&&ch2_n>=0)num[n]=p2[ch2_n]-'0';//如果p1已经取完数 if(ch1_n>=0&&ch2_n<0)num[n]=p1[ch1_n]-'0'; //p2取完数 num=(int*)realloc(num,(n+2)*sizeof(int));//只要两个不同时已经取完数 就要继续分配一个区间,那么最后有一个多余 n++; } t=n-1; / printf("n=%d\n",n);//验证2 num[t]=0;//把最后那区域赋值给0 预防上一位也要进位 //先记下num一共多少位。 return num; } int* carry(int*num) //进位 { int n=0; for ( n=0;n<=t;) //从第一位开始到第t位 一直进位 帮我看看这个n<=t 有没有错 { while (num[n]>=10)//当num的值大于10时候 { num[n++]-=10;// num自减10; num[n]+=1;// 下一位数+1; continue; } n++;//判断下一位数 } return num; //返回num指针 } void printnum(int*num)//输出num的数组 { t=(num[t]==0)?t-1:t; while(t>0) {printf("%d",num[t]); t--; } } main() { int *num; char*p1,*p2; p1=getnum(p1); p2=getnum(p2); num=bigadd(num,p1,p2); printnum(carry(num)); }这是论坛里的另外一个人做的