C语言大数相乘的问题
2014-02-28 16:12
323 查看
给你两个整数,请你计算A × B。
输入
数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。
接着有T组数据,每组数据只有一行,包括两个非负整数A和B。
但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。
但A和B的位数最大不会超过100位。
输出
对应每组测试数据,你都要输出两行:
第一行为:"Case #:", # 代表这是第几组测试数据。
第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。
你要注意这个等式里包含了几个空格。
要求每组数据之间都需要保留一个空行。
样例输入
2
1 2
123456789 987654321
样例输出
Case 1:
1 * 2 = 2
Case 2:
123456789 * 987654321 = 121932631112635269
很显然对于100位的数据我们无法定义他的类型,因此只能用数组一位一位计算,然后输出结果,但应注意要把字符转换成数字,同样运算时千万要注意0的运算
#include<stdio.h>
#include<string.h>
#define MAX 10005
int main()
{
int n,i,j,t,s;
char a[102],b[102],temp[105]={0},sum[MAX]={0};
int lena,lenb,flag;
scanf("%d",&n);
while(n--)
{
flag=0;
scanf("%s%s",a,b);
lena=strlen(a);
lenb=strlen(b);
for(j=lenb-1;j>=0;j--)
{
for(t=lena,i=lena-1;i>=0;i--,t--)
{
temp[t]=(a[i]-0x30)*(b[j]-0x30);
}
for(t=lena;t>=1;t--)
{
if(temp[t]>9)
{
temp[t-1]+=temp[t]/10;
temp[t]%=10;
}
}
for(s=lena+lenb-flag,t=lena;t>=0;t--,s--)
sum[s]+=temp[t];
for(t=lena;t>=0;t--)
temp[t]=0;
for(s=lena+lenb;s>=1;s--)
{
if(sum[s]>9)
{
sum[s-1]+=sum[s]/10;
sum[s]%=10;
}
}
flag++;
}
sum[lena+lenb+1]='\0';
for(s=0;s<=lena+lenb;s++)
sum[s]=sum[s]+0x30;
for(s=0;s<lena+lenb;s++)
if(sum[0]==0x30)
{
for(t=0;t<=lena+lenb-s;t++)
sum[t]=sum[t+1];
}
else break;
printf("Case %d:\n",m);
printf("%s * %s = %s\n",a,b,sum);
if(n!=0)
printf("/n");
for(s=lena+lenb+1;s>=0;s--)
sum[s]=0;
}
return 0;
}
问题还可以扩展成大数相减,相加,阶乘问题。
输入
数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。
接着有T组数据,每组数据只有一行,包括两个非负整数A和B。
但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。
但A和B的位数最大不会超过100位。
输出
对应每组测试数据,你都要输出两行:
第一行为:"Case #:", # 代表这是第几组测试数据。
第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。
你要注意这个等式里包含了几个空格。
要求每组数据之间都需要保留一个空行。
样例输入
2
1 2
123456789 987654321
样例输出
Case 1:
1 * 2 = 2
Case 2:
123456789 * 987654321 = 121932631112635269
很显然对于100位的数据我们无法定义他的类型,因此只能用数组一位一位计算,然后输出结果,但应注意要把字符转换成数字,同样运算时千万要注意0的运算
#include<stdio.h>
#include<string.h>
#define MAX 10005
int main()
{
int n,i,j,t,s;
char a[102],b[102],temp[105]={0},sum[MAX]={0};
int lena,lenb,flag;
scanf("%d",&n);
while(n--)
{
flag=0;
scanf("%s%s",a,b);
lena=strlen(a);
lenb=strlen(b);
for(j=lenb-1;j>=0;j--)
{
for(t=lena,i=lena-1;i>=0;i--,t--)
{
temp[t]=(a[i]-0x30)*(b[j]-0x30);
}
for(t=lena;t>=1;t--)
{
if(temp[t]>9)
{
temp[t-1]+=temp[t]/10;
temp[t]%=10;
}
}
for(s=lena+lenb-flag,t=lena;t>=0;t--,s--)
sum[s]+=temp[t];
for(t=lena;t>=0;t--)
temp[t]=0;
for(s=lena+lenb;s>=1;s--)
{
if(sum[s]>9)
{
sum[s-1]+=sum[s]/10;
sum[s]%=10;
}
}
flag++;
}
sum[lena+lenb+1]='\0';
for(s=0;s<=lena+lenb;s++)
sum[s]=sum[s]+0x30;
for(s=0;s<lena+lenb;s++)
if(sum[0]==0x30)
{
for(t=0;t<=lena+lenb-s;t++)
sum[t]=sum[t+1];
}
else break;
printf("Case %d:\n",m);
printf("%s * %s = %s\n",a,b,sum);
if(n!=0)
printf("/n");
for(s=lena+lenb+1;s>=0;s--)
sum[s]=0;
}
return 0;
}
问题还可以扩展成大数相减,相加,阶乘问题。
相关文章推荐
- C语言大数相乘问题普通算法->acm.scu.edu.cn:1002
- 一道C语言面试题——大数相乘的问题
- C语言实现两个大数相乘问题
- C语言中的大数相乘问题
- C语言实现两个大数相乘
- 大数相乘的问题——大数阶乘(整数)
- 大数相乘问题
- 大数相乘问题
- 算法题-大数相乘问题
- C语言实现大数相乘
- 算法题-大数相乘问题
- 数学问题3:两个大数相乘
- 大数相乘C语言代码
- C语言大数相乘
- 大数处理问题(二)(大数相乘)
- 算法理解——大数相乘问题
- C语言大数相乘A × B problem
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
- 算法理解之大数相乘问题
- C 语言 实现大数相乘问题(包括正、负整数,另外还附有详细注释)