(C语言)高精度乘法

来源:互联网 发布:适合孕妇的软件 编辑:程序博客网 时间:2024/05/21 01:46

题目描述

这道题很简单,只需要计算a*b即可,唯一有点麻烦的就是a和b的长度可能有点长,什么int啊,long long啊,double啊都可能从不下,怎么办?启明星软件组组长给了我一堆数据让我帮他计算结果,你们谁来帮帮我。。。

输入

输入有多组数据。

对于每组测试数据,在一行中给出两个整数a,b(a,b的位数小于等于1000),中间用一个空格隔开。

保证输入没有前导0;


当读到文件结尾时输入结束

输出

对于每组输入,在一行中输出两个整数相乘的结果(注意输出格式控制)。

样例输入

123456 789123456789 123456123456 1234567891234567891234567891234567984489413 3254698745621556461151

样例输出

9740678415241481342784152414813427844018146566985798265744855610651282705766247201905294363

个人认为这个考虑的情况比较多,首先应判断两个数有没有为零,然后判断两个数之前有没有负号,如果有负号,则不考虑负号将字符串倒置转换成数字类型放入一个数组中,然后将两个数组的每一位对应相乘,进位与之前的高精度加法一样,最后输出的时候的将数组前面的零去掉然后带上符号输出结果即可

#include<stdio.h>

#include<string.h>
int main() {
char n[1000],m[1000];
int a[1000],b[1000];
while (scanf("%s%s",n,m) != EOF) {
int n1,m1;
int i,j;
int k1,k2;
int c[2000] = {0};
n1 = strlen (n);
m1 = strlen (m);
if ((n1 == 1 && n[0] == '0') || (m1 == 1 && m[0] == '0')) {
printf("0\n");

else {
if (n[0] == '-') {
k1 = -1;
for (i = 0,j = n1-1; i < n1-1; i++,j--)
a[i] = n[j]-'0';
n1--;
}
else {
k1 = 1;
for (i = 0,j = n1-1; i < n1; i++,j--)
a[i] = n[j]-'0';
}
if (m[0] == '-') {
k2 = -1;
for (i = 0,j = m1-1; i < m1-1; i++,j--)
b[i] = m[j]-'0';
m1--;
}
else {
k2 = 1;
for (i = 0,j = m1-1; i < m1; i++,j--)
b[i] = m[j]-'0';
}
for (i = 0; i < n1; i++)
for (j = 0; j< m1;j++)
c[i+j] += a[i]*b[j];
for (i = 0; i< n1+m1; i++) {
if (c[i] >= 10) {
c[i+1] += c[i]/10;
c[i] %= 10;
}
}
j = 1999;
while (!c[j])
j--;
if (k1*k2 == -1)
printf("-");
for (i = j; i >= 0; i--)
printf("%d",c[i]);
printf("\n");
}

return 0;
}
1 0
原创粉丝点击