牛客网KJ18 特殊乘法

牛客网KJ18 特殊乘法

描述

写个算法,对2个小于1000000000的输入,求结果。
特殊乘法举例:123 * 45 = 1 * 4 + 1 * 5 +2 * 4 + 2 * 5 + 3 * 4 + 3 * 5,要求多组输入,对每组数据都有输出结果

输入描述:

两个小于1000000000的数

输出描述:

输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
在这里插入图片描述

分析

这道题要求我们将两个整型的输入数按数位拆分成单个数字,然后将这些数字排列组合一一相乘,最后累加起来。

首先观察题目的乘法算法

123 * 45 = 1 * 4 + 1 * 5 + 2 * 4 + 2 * 5 + 3 * 4 + 3 * 5

我们可以利用结合律可以简化为

(1 + 2 + 3) * (4 + 5)

这样思路就很清晰了,无非就是把输入的a和b数位上的数字拆开,然后把这些单独的数字分别相加起来,最后相乘得到结果,即:

最终结果 = (a的百位数 + a的十位数 + a的个位数) * (b的十位数 + b的个位数)
= a的数位和 * b的数位和

如果a和b值很大,根据最高位的位数补全多项式就可以了

分析好了,我们一步步循序渐进解决问题

解决步骤

1.写好代码框架

首先把输入代码写好,注意要求的多组输入:

int a, b;
while (scanf("%d %d", &a, &b) != EOF)
{
   
    
}

2.获得数位上的单个数字

我们要先拆分a和b,获得它们数位上的单个数字,就以题目给的两个数字为例,首先要将123拆分为1,2和3,45拆分为4和5

一旦和拆数有关的问题我们就容易联想到整除"/“和求模”%",这里我们先考虑求模获得单个数的方式。

我们将a以10为基数进行求模,这里我们获得其中的个位数3是轻而易举的,只需要a%10就可以了,值为123%10=3,这里先用一个变量num1存放个位数。

int num1=a%10;//用num1存放个位数的值

但是百位的1和十位的2要如何单独获得呢?

很简单,我们如果让a整除10,把它的数位右移一位,这个时候3作为余数被舍去了。将右移后的a重新作为被除数,再以10为基数进行求模,就获得了十位的2

a/=10;//将a右移,值由123变为12

int num2=a%10;//12%10=2,用num2存放十位数的值
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大 布 丁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值