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';}

}

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

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;
}

先把字符串拆分出来,变成字符串数组,然后字符串转int,对字符串数组进行操
不能直接字符串转int吗? 如有帮助望采纳

   atoi 是把字符串转换成int型的一个c语言函数,很方便的进行使用。
   其函数参数是一个字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。

int main(void)
{
    int n;
    char* str = "23.5";
    n = atoi(str);
    printf("string=%s,n=%d\n",str,n);
    return0;
}

可以参考我之前的这个回答
https://ask.csdn.net/questions/7715333?answer=53787379

public static void main(String[] args) {
    String a = "75";
    String b = "75";
    while((a.length() - b.length()) != 0){
        if(a.length() > b.length()) {
            b = "0" + b;
        } else {
            a = "0" + a;
        }
    }
    StringBuilder sb = new StringBuilder();
    int flag = 0;
    for(int i = a.length() - 1; i >= 0; i--) {
        int s = Integer.parseInt(String.valueOf(a.charAt(i))) + Integer.parseInt(String.valueOf(b.charAt(i))) + flag;
        if(s > 9) {
            flag = s / 10;
            s = s % 10;
        } else {
            flag = 0;
        }
        sb.append(s);
    }
    if(flag > 0) {
        sb.append(flag);
    }
    System.out.println(sb.reverse().toString());
}

仅供参考