C语言实现100位大数乘法

#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函数开始

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值