C语言实现高精度(大位数)乘法

简介: C语言实现高精度(大位数)乘法

1.正负号处理

int flaga=1;
    if(s1[0]=='-'){
        flaga=0;
        strcpy(s1,&s1[1]);
    }
if((flaga&&!flagb)||(!flaga&&flagb))
        putchar('-');

2.最不利原则

int len=lena+lenb;

3.进位处理

c[i+j]=a[i]*b[j]+jw+c[i+j];
            jw=c[i+j]/10;
            c[i+j]%=10;

源码

#include <stdio.h>
#include <string.h>
#define Max 3000
void multiply(char s1[],char s2[]);
int main()
{
    char s1[Max];
    char s2[Max];
    scanf("%s %s",s1,s2);
    multiply(s1,s2);
}
void multiply(char s1[],char s2[]){
    int flaga=1;
    if(s1[0]=='-'){
        flaga=0;
        strcpy(s1,&s1[1]);
    }
    int flagb=1;
    if(s2[0]=='-'){
        flagb=0;
        strcpy(s2,&s2[1]);
    }
    int a[Max];
    int b[Max];
    int c[Max]={0};
    int lena=strlen(s1);
    for(int i;i<lena;i++)
        a[i]=s1[lena-i-1]-'0';
    int lenb=strlen(s2);
    for(int i;i<lenb;i++)
        b[i]=s2[lenb-i-1]-'0';
    int len=lena+lenb;
    for(int i=0;i<lena;i++){
        int jw=0;
        for(int j=0;j<lenb;j++){
            c[i+j]=a[i]*b[j]+jw+c[i+j];
            jw=c[i+j]/10;
            c[i+j]%=10;
        }
        c[lenb+i]=jw;
    }
    if((flaga&&!flagb)||(!flaga&&flagb))
        putchar('-');
    for(int i=len-1;i>=0;i--){
        if(c[i]==0&&len>1)
            len--;
        else
            break;
    }
    for(int i=len-1;i>=0;i--)
        printf("%d",c[i]);
}

以上代码仅供参考


目录
相关文章
|
7月前
|
机器学习/深度学习 编译器 C语言
【C语言】数据输出的域宽控制(如何在输出数据时控制0占位)(如何输出前导0)(保留几位小数)(乘法口诀表打印不齐)等问题
【C语言】数据输出的域宽控制(如何在输出数据时控制0占位)(如何输出前导0)(保留几位小数)(乘法口诀表打印不齐)等问题
115 0
|
C语言
C语言之回文数的求解。回文数一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
C语言之回文数的求解。回文数一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
200 0
|
2月前
|
C语言
【C语言】三位数(1-4)不重复组合
【C语言】三位数(1-4)不重复组合
|
6月前
|
C语言
C语言打印乘法口诀表——超详细扫盲篇
C语言打印乘法口诀表——超详细扫盲篇
|
6月前
|
C语言
C语言---函数---请输入乘法口诀表的行,来打印几几乘法表
C语言---函数---请输入乘法口诀表的行,来打印几几乘法表
|
6月前
|
C语言
C语言学习记录——将三位数的个十百位单独打印,并求其和。
C语言学习记录——将三位数的个十百位单独打印,并求其和。
46 4
|
7月前
|
C语言
c语言编程练习题:7-28 求整数的位数及各位数字之和
c语言编程练习题:7-28 求整数的位数及各位数字之和
74 0
|
7月前
|
C语言
【C语言】如何只打印小数的有效数字位数且不补0
【C语言】如何只打印小数的有效数字位数且不补0
121 0
【C语言】如何只打印小数的有效数字位数且不补0
C语言十六弹 --求两个整数二进制位不同的位数
C语言十六弹 --求两个整数二进制位不同的位数
|
C语言
C语言每日一题 ---- 打印从1到最大的n位数(Day 1)
C语言每日一题 ---- 打印从1到最大的n位数(Day 1)
67 0