#include<stdio.h>
#include<string.h>
//两个最大100位的大数乘法
int num=0,time=0;
void bigadd(int c[200],int t[102],int k) //实现乘法当中的大数加法 c=c+t
{
int m=0,i; //m记录加法的进位
while(t[k-1]==0)
{
k--;//省略最高位的0,因为我的乘法有时最高位会得到0
}
for(int j=0;j<time;j++) //数组的右移对应数据的乘10倍 其实也就是乘法当中的错位相加
{
for(int i=k;i>0;i--)
t[i]=t[i-1];
t[0]=0; //最低位补0
k++; //加数的位数增加
}
//for(int i=0;i<k;i++)
// printf("%d",t[i]);
//printf("\n");
for(i=0;i<k;i++) //k是被加数的位数
{
int temp=c[i]+t[i]+m;
m=temp/10%10;
c[i]=temp%10;
}
if(m!=0)
{
c[i]=m; //将最后得到的进位加上 并且结果的总位数增加
num=k+1;
}
else
num=k; //没有进位则不处理
time++; //右移次数自增
}
int main()
{
int a[102]={0},b[102]={0},c[202]={0},g[102]={0},tip=0; //a和b存储从字符串获得的两个大数 c存储a和b相加以后的运算结果
char e[102],f[102];
scanf("%s%s",e,f);
int lene,lenf;
lene=strlen(e);
lenf=strlen(f);
if(e[0]=='-') //分别对两个字符串回收前面的负号 如果有的话
{
tip++;
for(int i=0;i<lene;i++)
{
e[i]=e[i+1]; //注意: \0的值也被复制了
}
--lene;
}
if(f[0]=='-')
{
tip++;
for(int i=0;i<lenf;i++)
{
f[i]=f[i+1];
}
--lenf;
}
//printf("%s %s",e,f);
//tip=1表示结果为负数 需要记得判断
int k=0;
for(int i=lene-1;i>=0;i--)
{
a[k++]=e[i]-'0';
}
k=0;
for(int i=lenf-1;i>=0;i--)
{
b[k++]=f[i]-'0';
}
//将字符串中的两个大数e和f分别保存在数组a和数组b中 且a的最低位对应大数的最低位 b同
int len;
if(lene>lenf)
len=lene;
else
len=lenf;
int m=0; //m表示进位
//for(int i=0;i<lene;i++)
// printf("%d",a[i]);
//printf("\n");
//for(int i=0;i<lenf;i++)
// printf("%d",b[i]);
//printf("\n");
for(int i=0;i<len;i++)
{
k=0;
m=0;
for(int j=0;j<len;j++)
{
int temp = a[i]*b[j]+m;
m=temp/10%10;
g[k++]=temp%10;
}
g[k++]=m;
//for(int m=0;m<k;m++)
// printf("%d ",g[m]);
//printf("\n");
bigadd(c,g,k);
}
if(tip==1)
printf("-");
for(int i=num-1;i>=0;i--)
{
printf("%d",c[i]);
}
}
代码水平一般,欢迎各位大佬评价指正。浅浅总结一下,本题目的难点主要在于如何将输入的最多100位数据转换成合理的数据结构,我这里使用字符串进行输入,再去掉并保存好正负号信息后将数据逆序保存在100个单元大小的整形数组中,该整形数组的每一个单元保存需要进行计算的每一位。
接下来对两个整形数组进行乘法的运算即可,中间又需要使用到大数加法,方法类似,我写了一个函数来实现,看代码时建议先从main函数开始