poj2389---大数乘法

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 100

int main()
{
    char s1[MAX],s2[MAX];
    int len1,len2,i,j,result[MAX]={0};
    scanf("%s %s",s1,s2);
    len1=strlen(s1);
    len2=strlen(s2);
    for(i=0;i<len1;i++)
    {
        for(j=0;j<len2;j++)
        {
            result[i+j]+=(s1[i]-'0')*(s2[j]-'0');
        }
    }
    for(i=len1+len2-2;i>=1;i--)//因为最后一项result[len1-1+len2-1]
    {
        if(result[i]>9)
        {
            result[i-1]+=(result[i]/10);
            result[i] %= 10;
        }
    }
    //当i=1,result[0]是进了位的,他有可能大于9,甚至result[1]给他进几十,所以直接输出
    for(i=0;i<=len1+len2-2;i++)
    {
        printf("%d",result[i]);
    }
    return 0;
}
View Code

算法思路:输入如:3456

         789

用3分别乘7、8、9,用4分别乘7、8、9,5分别乘7、8、9,

0123
3456
789 

6分别乘7、8、9

若按照res[i+j]=s1[i]*s2[j],得到res:

 

012345
212427   
 283236  
  354045 
   424854

res数组本身是1维的,只有一排,外部的for循环每进完一次,res数组就被更新一次

发现规律:len1=4,len2=3,最后一位是res[len1-1+len2-1]

将得到的res数组从最后一位开始进位,巧妙的是,逻辑上if(res[]>9)更好,不加,也没问题

result[i-1]+=(result[i]/10);
            result[i] %= 10;

让前一位进好位,又保留这一位的余数,我只让这段代码做到了res[1],但在res[0]处进了位

联系大数加法:poj1503

同样的定义一个res(fin)数组

转载于:https://www.cnblogs.com/gabygoole/p/4576891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值