思路:
m*n(顺序无关)
如果n 是偶数,显然有 n · m = n/2 · 2m
如果n 是奇数,则有 n · m = (n-1) / 2 · 2m + m
举例:35*72的计算过程过程
35 72
17 144
8 288
4 576
2 1152
1 2304
从上到下,对每一行,若左边的数字若为奇数,则将右边的数字取出,累加。
72+144+2304=2520
累加的结果2520即为乘积。
#include <stdio.h>
int main(void)
{
int m,n;
// 题目要求是多组数据输入所以用死循环
while(~scanf("%d%d",&m,&n))
{
// sum 用来记录累加后的值
int sum=0;
while(m!=0)
{
// 偶数情况
if(m%2==0)
{
n*=2;
m/=2;
}
// 奇数情况,就把n的值累加
else
{
// 为了格式要求判断是否累加到最后一步
if(m!=1)
{
printf("%d + ",n);
sum+=n;
}
else
{
printf("%d = %d\n",n,sum+n);
}
// 每次都要进行折半,加倍操作
m=(m-1)/2;
n*=2;
}
}
}
return 0;
}