新手问个问题!求高手解答!
编程实现可以用于如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));
}
这是论坛里的另外一个人做的