减半加倍求乘法
作者: XXX 时间限制: 10S 章节: 一维数组
问题描述 :
用减半和加倍两种运算就能求得任何两个整数的乘积。
其规则是:
左边不断除2,写下商,舍去余数;
右边不断加倍,直到左边变成1为止。
取结果的方法是:
如果某行左边是偶数,就划去整个这一行;
如果某行左边是奇数,右边剩下的数相加即可。
例如求13与15的乘积的过程是:
计算过程:
13--------15 :13除以2等于6,舍去余数1,15乘以2等于30;
6---------30 :6除以2等于3,30乘以2等于60;
3---------60 :3除以2等于1,舍去余数1,60乘以2等于120;
1---------120 :左边数字为1,停止计算。
取结果过程:
13--------15 :左边是奇数,取15;
6---------30 :左边是偶数,划去;
3---------60 :取60;
1---------120 :取120;
其结果就是: 13*15=15+60+120=195。
明给你两个整数,使用上面描述的乘法过程,输出最后的相加的式子。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组测试数据占一行,其中包含两个整数a和b(1 <= a, b <= 100)。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。格式参见样例。
输入范例 :
13 15
2 4
输出范例 :
1315=15+60+120=195
24=8=8
#include<stdio.h>
int main(){
int a,b;
int aa[100],bb[100];
while(scanf("%d %d",&a,&b)!=EOF){
aa[0]=a;
bb[0]=b;
int i=0,j=0;
while(aa[i]>1){
aa[i+1]=aa[i]/2;//存储左边减半的数
bb[j+1]=bb[j]*2;//存储右边加倍的数
i++;j++;
}
int k,m,n;
int sum=0;
int l=0,cc[100];
for(k=0;k<=i;k++){
if(aa[k]%2==1){//如果左边的数为奇数,则将右边的数累加
sum=sum+bb[k];
cc[l]=bb[k];//用数组c存储满足条件的右边的数
l++;
}
}
printf("%d*%d=",a,b);
for(m=0;m<l-1;m++){
printf("%d+",cc[m]);
}
printf("%d=",cc[m]);
printf("%d\n",sum);
}
//int k;
// for(k=0;k<=i;k++){
// printf("%d ",bb[k]);
// }
}