問題描述 :
明明熱愛數學,他的爸爸也有意培養明明對數學的興趣。
一次,爲了拓展明明的知識面,爸爸給明明講了一個原始部落人計算乘法的方法:
據說原始部落人以小石子作爲計算工具,並用減半和加倍兩種運算就能求得任何兩個整數的乘積。
其規則是:
左邊不斷除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
c源碼:
#include<stdio.h>
int main()
{
int n,m,a[2][100]={0},i=0,j=0,s,t;
while(scanf("%d%d",&n,&m)!=EOF)
{
a[0][0]=n;
a[1][0]=m;
t=1;
while(n!=1)
{
n=n/2;
m=m*2;
a[0][t]=n;
a[1][t]=m;
t++;
}
s=0;
for(i=0;i<t;i++)
if(a[0][i]%2==1)
s=s+a[1][i];
printf("%d*%d=",a[0][0],a[1][0]);
for(i=0;i<t-1;i++)
if(a[0][i]%2==1)
printf("%d+",a[1][i]);
if(a[0][t-1]%2==1)
printf("%d=%d\n",a[1][t-1],s);
}
return 0;
}