回复 楼主 jj369258
#include<stdio.h>
#include<string.h>
void main()
{
char a[1000],b[1000],c[1001]={0},flag;
//flag用来判断结果的正负,c用来保存结果
int i,j,k,m,n,len;
printf("输入的a,b的位数在10位以上1000位以下\n");
printf("请输入第一个字符串a:\n");
scanf("%s",a);
printf("请输入第二个字符串b:\n");
scanf("%s",b);
//计算并比较两个字符串的长度,将长度大的作为减数,长度小的作为被减数。
m=strlen(a);
n=strlen(b);
len=(m>n)?m:n;
//相减时,先将右边对齐,即将i指向a的右端,j指向b的右端,然后i,j对齐,同时向左边移动,知道一个到头为止
for(i=m-1,j=n-1,k=len-1;i>=0&&j>=0;i--,j--,k--)
{
c[k]=(a[i]-'0'-b[j]-'0'+flag)%10+'0';
flag=(a[i]-'0'-b[j]-'0'+flag)/10;
}
for(;i>=0;i--,k--)
//若a更长,则处理a
{
c[k]=(a[i]-'0'+flag)%10+'0';
flag=(a[i]-'0'+flag)/10;
}
for(;j>=0;j--,k--)
//若b更长,则处理b
{
c[k]=(b[j]-'0'+flag)%10+'0';
flag=(b[j]-'0'+flag)/10;
}
if(flag!=0)
{
for(k=len-1;k>0;k--)
c[k]=c[k-1];
c[0]=flag+'0';
}
printf("%s",c);
}
void addition(char *numa, char *numb,char *result) // 计算两大数之和
{
char *pna = findend(numa); // 指向numa的一个指针。point numa pna 指向乘数的最低位,
char *pnb = findend(numb); //指向numb的一个指针 //pnb 指向被乘数的最低位,
int along=(int)strlen(numa); //标记数字a的长度;
int blong=(int)strlen(numb); //标记数字b的长度;
int times = 0; // 标致要计算多少次。
int carry=0,temp_result; //存贮进位 和临时结果的
Node *head, // 用于存贮头指针
*pstart, // 用于存贮计算时的首指针
*pnew; //作于申请新结点
head = pstart =new Node; //初始化首结点和头结点。
pstart -> data = 0;
pstart -> next = NULL;
pstart -> ahead = NULL;
if (abigerb(numa ,numb)>=1)
times = (int)strlen(numa); //比较两个字符串长度,以大的作为循环次数
else
{
times = (int)strlen(numb);
pna = findend(numb); //交换指针
pnb = findend(numa);
along=(int)strlen(numb); //标记数字a的长度;
blong=(int)strlen(numa); //标记数字b的长度;
}
while ((times-- && (times>=0))|| carry != 0)
{
if(!pstart->next) //如果当前为空结点,则申请新结点
{
pnew = new Node;
pnew -> data = 0;
pnew -> next = NULL;
pnew -> ahead = pstart;
pstart -> next = pnew;
}
else temp_result =(pstart->data +(*pna-48)+(*pnb-48)+carry) ; //自身的值+新值+进位 作为当前的新值
pstart -> data = temp_result%10; //存贮个位
carry = temp_result/10; //存贮进位
pstart = pstart -> next; //结点移动
blong--;
if(blong>0)pnb--; //指针移向被加数高位
else *pnb=48; //之后相减就变为了0不作任何运算;
pna--; //加数指针移动,
}
pstart =head; //寻找链表的结尾点
while(pstart->next != 0)
{
pstart->data += 48; //!!<<<因为我们的输出是字符。所以再此加上48>>>> 逆顺输出
pstart = pstart->next ;
}
int tip = 0; //转为字符串用
pstart = pstart->ahead ; //找有效字
//cout<<"n结果是 : ";
while(pstart != 0) //输出正序的结果;
{
result[tip++] = pstart->data;
//cout< data;
pstart = pstart->ahead ;
}
result[tip] = '';
pstart =head; //释放空间
while(pstart->next != 0)
{
pnew = pstart->next ;delete pstart;
pstart =pnew;
}
return ;
}