高精度乘法
本文最后更新于 522 天前,其中的信息可能已经有所发展或是发生改变。

两个很大的数字做乘法,必然得写高精,不然炸。

两个数做乘法,可以这样来考虑,A*B,相当于从B的最小位开取,分别乘以A的每一位,然后向左平移一定长度,然后加到对应位,最后再来考虑进位。

上代码

void hm(char*a,char*b,char*ans)
{
    int arr1[2002]={0};
    int arr2[2002]={0};
    int arr3[4004]={0};
    int i,t,s=0,c,sum;
    int len1,len2,len;
    len1=strlen(a);         //判断第一个数字的长度
    len2=strlen(b);         //判断第二个数字的长度
    len=len1+len2;          //判断相乘之后的最大可能长度
    for(i=len1-1;i>=0;i--)      //把第一个数字转换为数组
    arr1[len1-i-1]=*(a+i)-'0';
    for(i=len2-1;i>=0;i--)      //第二个数字转为数组
    arr2[len2-i-1]=*(b+i)-'0';
    for(i=0;i<len2;i++)         //逐位取第二个数字
    {
       for(t=0;t<len1;t++)
       {
        arr3[i+t]+=arr2[i]*arr1[t]; //计算
       }
    }
    for(i=0;i<len;i++)
    {                               //进位
        arr3[i]+=s;
        s=arr3[i]/10;
        arr3[i]=arr3[i]%10;
    }
    len=1;
    for(i=4003;i>=0;i--)
    {                               //判断结果的位数
        if(arr3[i]!=0)
        {
        len=i+1;
        break;
        }
    }
    *(ans+len)='\0';
    for(i=len-1;i>=0;i--)           //将结果存储为字符串
    {
        *(ans+len-i-1)=arr3[i]+'0';
    }

}

评论

  1. Avatar photo
    博主
    1 年前
    2024-3-28 23:17:07

    菜鸡呜呜

  2. pczpcz
    1 年前
    2024-3-28 23:19:41

    牛逼👍

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇