高精度加法和高精度乘法

来源:互联网 发布:如何计算算法复杂度 编辑:程序博客网 时间:2024/06/03 19:12

题目描述:

谷学长有一个非常简单的问题给你,给你两个整数A和B,你的任务是计算A+B。

输入:

输入的第一行包含一个整数T(T<=20)表示测试实例的个数,然后2*T行,分别表示A和B两个正整数。注意整数非常大,那意味着你不能用32位整数来处理。你可以确定的是整数的长度不超过1000。

输出:

对于每一个样例,你应该输出两行,第一行是"Case #:",#表示第几个样例,第二行是一个等式"A+B=Sum",Sum表示A+B的结果。注意等式中有空格。

样例输入

2
1
2
112233445566778899
998877665544332211

样例输出

Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110


#include"stdio.h"
#include"string.h"
int num1[1010];
int num2[1010];
int sum[1100];
char char1[1010];
char char2[1010];

int main()
{
int T;
int i;
int Case;
Case=1;
scanf("%d",&T);
while(T--)
{
memset(char1,0,sizeof(char1));
memset(char2,0,sizeof(char2));
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
scanf("%s",char1);
scanf("%s",char2);
for(i=strlen(char1)-1;i>=0;i--)
num1[i]=char1[strlen(char1)-1-i]-'0';
for(i=strlen(char2)-1;i>=0;i--)
num2[i]=char2[strlen(char2)-1-i]-'0';
int len;
len=strlen(char1)>strlen(char2)?strlen(char1):strlen(char2);
memset(sum,0,sizeof(sum));
for(i=0;i<len;i++)
{
sum[i]=sum[i]+(num1[i]+num2[i])%10;
sum[i+1]=sum[i+1]+(num1[i]+num2[i])/10;
}
green no ac yellow ac

//sum[i]=num1[i]+num2[i]+m;
m=sum[i]/10;
sum[i]=sum[i]%10;
if(sum[len])len++;
//output
printf("Case %d:\n",Case++);
for(i=strlen(char1)-1;i>=0;i--)
printf("%d",num1[i]);
printf(" + ");
for(i=strlen(char2)-1;i>=0;i--)
printf("%d",num2[i]);
printf(" = ");
for(i=len-1;i>=0;i--)
printf("%d",sum[i]);
printf("\n");
}
return 0;
}
收获:绿色通不过,forget it,黄色算法更robust,以后处理进位问题,采用黄色算法,不会 进行越界操作。
更新:黄色算法就是错了,处理进位有问题,999+1=9910进位必须拉出来单练
再优化:进位不拉出来考虑
sum[i]=sum[i]+num1[i]+num2[i];
sum[i+1]=sum[i]/10;
sum[i]=sum[i]%10;

题目描述:

给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。

输入:

读入两个用空格隔开的正整数

输出:

输出A*B的值

样例输入

3 12

样例输出

36

#include<stdio.h>
#include<string.h>
#define byteMax 505
#define dbm 1010
 int main()
 {
  char c1[byteMax],c2[byteMax];
  int num1[byteMax],num2[byteMax];
  int multi[dbm];
  int i,j;
  scanf("%s",c1);
  scanf("%s",c2);
  int len1,len2,len;
  len1=strlen(c1);
  len2=strlen(c2);
  len=len1+len2;
  for(i=len1-1;i>=0;i--)
num1[i]=c1[len1-1-i]-'0';
for(i=len2-1;i>=0;i--)
num2[i]=c2[len2-1-i]-'0';
memset(multi,0,sizeof(multi));
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
{
multi[i+j]+=num1[i]*num2[j];
multi[i+j+1]+=(multi[i+j])/10;
multi[i+j]=multi[i+j]%10;
}
if(multi[len]!=0)len++;
if(multi[len]==0)len--;
for(i=len-1;i>=0;i--)
printf("%d",multi[i]); 
 return 0;
}