#include <stdio.h>
#include <string.h>
#include <memory.h>
//两大数相加,值存放第一个参数
void AddStr(char *_first,char *_second,int size)
{
if(!_first||!_second) return ;int minLength,maxLength;bool tag=false;char *first,*second;maxLength = strlen(_first)>=strlen(_second)?strlen(_first):strlen(_second); //记录两数组中最长的数组的长度minLength = strlen(_first)<=strlen(_second)?strlen(_first):strlen(_second);//记录较小的长度if(strlen(_first)>=strlen(_second)){
first = _first;//若数组_first比_second长度长,first指向长的数组second = _second;//second指向较短数组
}
else{tag = true; //该标志为真,则是first指向_second(_second比_first长)first = _second;second = _first;}
int flag=0; //相加产生进位标志for (int i = maxLength-1;i>=(maxLength-minLength);i--){int data = (first[i]-'0')+(second[i-(maxLength-minLength)]-'0');//计算同一位的两个数相加的值first[i] = (data + flag)%10+'0'; //记录余数flag = (data + flag)/10; //记录进位if (i==(maxLength-minLength)&&flag!=0){for (int j =(maxLength-minLength)-1;j>=0;j--) //剩余高位进行判断是否产生进位,并且相加{if (first[j]-'0'+flag==10){first[j] = '0';flag =1;}else{first[j]+=1;flag = 0;break;}
}if (flag!=0){for (int k = maxLength;k>0;k--)first[k]=first[k-1];first[0] = '1';}}}
if (tag==true) strcpy(_first,first);
}
//大数相乘,值存放第一个参数
void MultiStr(char *ary,char *ard,int size)
{
int i,counts = strlen(ard),flag = 0;//进位标志char record[1000];//记录被乘数memset(record,0,1000);strcpy(record,ary);//复制被乘数
for(i = counts-1;i>=0;i--){int len = strlen(record)-1; //从低位开始计算char middle[1000];//用于记录被乘数 被 乘数 乘后的结果memset(middle,0,1000);if(i!=counts-1){len+=1; //乘数往高位走时,被乘数补0(扩大十倍)record[len]='0';strcpy(middle,ary);//复制每一个乘数位乘以被乘数的结果strcpy(ary,record);//将扩大后的被乘数的值复制到ary}for (int j = len;j>=0;j--){int data = (ary[j]-'0')*(ard[i]-'0');//两个位相乘ary[j] = (data + flag)%10+'0';//记录余数flag = (data + flag)/10;//记录进位if (j==0&&flag>0){for (int k = len+1; k>0;k--) ary[k] = ary[k-1];//后移一位ary[0] = flag+'0';flag=0;}}if(i!=counts-1) AddStr(ary,middle,size);//奖将上一次计算结果与本次计算结果相加,存放在ary(middle的值可能变动)
}
}
int main()
{
char ary[1001],ard[1001];
while(1){memset(ary,0,1001);memset(ard,0,1001);printf("请输入相加的两个正整数A、B(两者之间空格):\n");printf("A:");scanf("%s",ary);printf("B:");scanf("%s",ard);printf("\t%s + %s = ",ary,ard);AddStr(ary,ard,1001);printf("%s\n\n",ary);memset(ary,0,1001);memset(ard,0,1001);printf("请输入相乘的两个正整数A、B(两者之间空格):\n");printf("A:");scanf("%s",ary);printf("B:");scanf("%s",ard);printf("\t%s * %s = ",ary,ard);MultiStr(ary,ard,1001);printf("%s\n\n",ary);}
return 0;
}