牛客网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存放十位数的值