超级免免 2022-05-12 12:58 采纳率: 75%
浏览 90

C语言 大数求和 大数求积

要求如下

img


这是我写到一半的被引用函数

img


代码如下:
int f5(int )
{
char c1[80],c2[80];
int a1[80];a2[80];
int i,j k,d;
int n1=strlen(c1);int n2=stelen(c2);
scanf("%s%s",c1,c2);
for(i=n1-1;i>=0;i--)
{for(j=0;j<=80;j++)
a1[j]=c1[i]-'0';}
for(k=n2-1;k>=0;k--)
{for(d=0;d<=80;d++)
a2[d]=c2[k]-'0';}

}

后续不知道怎么写
我希望的是一个被引用函数用来实现大数相加,一个用来实现大数相乘。
求解答!

  • 写回答

4条回答 默认 最新

  • 关注

    img

    代码如下:

    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include <stdio.h>
    #include <string.h>
    
    #define MAXNUM (int)300
    
    //去除字符串前面的0
    void movePreZero(char c[])
    {
        int i;
        while (c[0] == '0')
        {
            for (i = 0; i < strlen(c) - 1; i++)
                c[i] = c[i + 1];
            c[strlen(c) - 1] = 0;
        }
    }
    
    
    //显示字符串
    void print(char c[])
    {
        int i = 0;
        int flag = 0;
        for (i = 0; c[i] != '\0'; i++)
        {
            if (c[i] != '0')
                flag = 1;
            if (flag)
                printf("%c", c[i]);
            else
                printf(" ");
        }
        printf("\n");
    }
    
    //大数相加 c = a + b
    void bigAdd(char a[], char b[], char c[])
    {
        int i = 0;
        int shift = 0, val;
        int l1 = strlen(a);
        int l2 = strlen(b);
        
        int len = l1 > l2 ? l1 : l2;
        len += 1; //多留一个进位
    
        c[len] = 0; //后一个位置为0
        //从后往前迭代
        l1--;
        l2--;
        len--;
        while (l1 >= 0 && l2 >= 0)
        {
            int t = (a[l1] - '0') + (b[l2] - '0') + shift;
            if (t >= 10)
            {
                shift = 1;
                t -= 10;
                c[len] = '0' + t;
            }
            else
            {
                shift = 0;
                c[len] = '0' + t;
            }
            len--;
            l1--;
            l2--;
        }
        //a
        while (l1 >= 0)
        {
            int t = (a[l1] - '0') + shift;
            if (t >= 10)
            {
                shift = 1;
                t -= 10;
                c[len] = '0' + t;
            }
            else
            {
                shift = 0;
                c[len] = '0' + t;
            }
            len--;
            l1--;
        }
        //b
        while (l2 >= 0)
        {
            int t = (b[l2] - '0') + shift;
            if (t >= 10)
            {
                shift = 1;
                t -= 10;
                c[len] = '0' + t;
            }
            else
            {
                shift = 0;
                c[len] = '0' + t;
            }
            len--;
            l2--;
        }
        if (shift != 0)
            c[0] = '0' + shift;
        else
            c[0] = '0';
        movePreZero(c);
        
    }
    
    
    //大数相乘 c = a * b
    void bigMul(char a[], char b[], char c[])
    {
        int i, j, t, k, val;
        int maxlen;
        int shift = 0;
        int l1 = strlen(a);
        int l2 = strlen(b);
        char tmp[MAXNUM] = { 0 };
    
        //结果最多是l1+l2位数
        maxlen = l1 + l2;
        c[maxlen] = 0; //字符串正常结束
        for (i = 0; i < maxlen; i++)
            c[i] = '0';
    
        if (l1 < l2)
        {
            //交换a和b
            strcpy(tmp, a);
            strcpy(a, b);
            strcpy(b, tmp);
    
            t = l1;
            l1 = l2;
            l2 = t;
        }
        for (t = 0, i = l2 - 1; i >= 0; i--, t++) //遍历b,乘以a的所有数
        {
            shift = 0;
            memset(tmp, '0', maxlen);
            tmp[maxlen] = 0;
            for (k = 0, j = l1 - 1; j >= 0; j--, k++)
            {
                val = (b[i] - '0') * (a[j] - '0') + shift;
                if (val >= 10)
                {
                    shift = val / 10;
                    val = val % 10;
                }
                else
                    shift = 0;
                tmp[maxlen - 1 - t - k] = '0' + val;
            }
            if (shift)
                tmp[maxlen - 1 - t - k] = '0' + shift;
    
    
            //print(tmp);
    
    
            shift = 0;
            //计算c与tmp的和
            for (k = maxlen - 1; k >= 0; k--)
            {
                if (tmp[k] == 0)
                    continue;
                else
                {
                    val = c[k] - '0' + tmp[k] - '0' + shift;
                    if (val >= 10)
                    {
                        shift = val / 10;
                        val = val % 10;
                    }
                    else
                        shift = 0;
                    c[k] = '0' + val;
                }
            }
        }
        movePreZero(c);
    }
    
    
    
    int main()
    {
        int n, m;
        char a[MAXNUM] = { 0 }, b[MAXNUM] = { 0 }, c[MAXNUM] = { 0 }, d[MAXNUM] = { 0 };
        scanf("%s %s", a, b);
        bigAdd(a, b, c);
        bigMul(a, b, d);
        printf("和:");
        print(c);
        printf("积:");
        print(d);
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 修改了问题 5月12日
  • 创建了问题 5月12日

悬赏问题

  • ¥15 前端echarts坐标轴问题
  • ¥15 CMFCPropertyPage
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳