2010年12月8日 星期三

C語言之百位數乘法

最近在重新複習C語言......
試著寫一個百位數乘法~~
這是一個用加法取代乘法的作法
例如:5X2 ....將5加二次
99X100 .....將99連加100次

程式如下....

Source CODE:

# include
# include <stdlib.h>
# include <string>
# include <string.h>
int main(void)
{
char aaa[100]; //定義文字陣列
int temp[100]; //定義數字陣列
int temp2[100];
int temp3[100];
int bbb, i ,j, k , l ,bu , e;
system("clear");
for ( ; ; )
{
// system("clear");
printf("Please input NUM: ");
scanf("%s",aaa);
//輸入一個數字,以文字方式表示
printf("Please Input NUM (1-2147483647) :");
scanf("%d",&bbb);
//輸入一個數字,以數字方式表示
if (atoi(aaa)==0 && bbb==0) break; //輸入二個0就結束程式
for (i=strlen(aaa)-1;i>=0;i--)
{
temp[strlen(aaa)-i-1]=aaa[i]-48;
temp2[strlen(aaa)-i-1]=aaa[i]-48;
//temp 存放被乘數,數字倒著放
//如:12345 --> 54321
}
k=0;
bu=strlen(aaa); //取得被乘數的文字長度
for (l=1;l<=bbb-1;l++) //以乘數作迴圈,相加的次數
{
temp[bu]=0;temp2[bu]=0;
for(i=0;i<=bu-1;i++)
{
j=temp[i]+temp2[i]+k; //一位數一位數相加=j
if (j>=10)
{ //J是否大於10
temp2[i]=j%10; //將餘數放入暫存陣列中
k=j/10; //K=進位數
}
else
{
temp2[i]=j%10; //將餘數放入暫存陣列中
k=0; //進位數K=0
}
}
if (k>=1) //最後如果還有進位
{
if (temp2[bu]>=1)
temp2[bu]=temp2[bu]+k;k=0;}
else {temp2[bu]=k;k=0;}
temp[bu]=0;bu=bu+1;k=0;
//如果最後有數字,則將數字加上進位數K ,如果是0,則將進位數K放在最後一問數
}

}
printf("\n");
printf("%s X %d = ",aaa,bbb);
if (strlen(aaa)==1)
{
if (atoi(aaa)==0 || bbb==0) //如果乘數宇被乘數為0,答案顯示為0
{ printf("0\n");}
else
{
if (k!=0) printf("%d",k);
for (i=bu-1;i>=0;i--)
printf("%d",temp2[i]);
printf("\n");
//將答案倒過來顯示
//如54321 --> 12345
}
}
else if (bbb==0)
{
printf("0\n");
}
else
{
if (k!=0) printf("%d",k);
for (i=bu-1;i>=0;i--)
printf("%d",temp2[i]);
printf("\n");
}
printf("\n");
}
return 0;
}


數字倒著放,是因為這樣在進位時,才有空間放進位後的數字

例如:
123X10

如果正著放:temp陣列擺放如下
[1][2][3][][][].....[].....這樣百位數要進位就沒有空間
倒著放:
[3][2][1][][][].....[].....這樣百位數要進位就有空間了,顯示答案就再倒一次就OK了

這樣確實可以實現百位數乘法,只是乘數最大只能到2147483647整數宣告的關係
最大的缺點是......乘數位數大於8位數時.....會算很久...幾乎像無窮迴圈一樣
後續再改善速度的問題吧

沒有留言: