[英]Unexpected output in a simple C program
因此,我嘗試編寫一個簡單的C程序,該程序無需使用*
運算符即可計算兩個數字的乘法。 但是結果並沒有達到預期。 我不明白為什么。 這是代碼:
#include<stdio.h>
int main()
{
int a=1,b=1,c=1,i;
printf("\n 1st element=");
scanf("%d",&a);
printf("\n 2nd element=");
scanf("%d",&b);
for(i=0;i<b;i++)
{
a=a+a;
}
printf("\n result=%d",a);
return 0;
}
實際上,您的循環使a
呈指數增長了一倍。
例如,假設b = 3
和a = 5
。 然后循環將運行三次。
展開循環將產生:
a = 5; /* initial value of a */
/* now run a=a+a; three times */
a = 5 + 5 = 10;
a = 10 + 10 = 20;
a = 20 + 20 = 40;
所以您不會得到15,但是您將得到40。
取而代之的是,使一個新的變量,就像sum = 0
,然后添加的值a
到sum
,如下:
sum = 0;
for (i=0; i<b; i++)
sum += a;
順便說一句, +=
運算符是一個很棒的運算符,它只是將自身右側的值添加到左側的變量上。 它比誤導性方程a = a + a
更好,更丑陋,除非a = 0
否則它甚至沒有數學意義。
int a=1,b=1,c=0,i;
a=a+a; ==>c=c+a ;
printf("\n result=%d",c);
使用移位和加法相乘。 O(log(b))。 注意溢出。
我建議在for (t = 0; t < b; t++)
使用此方法。 想象一下,如果您使用的是64位數學運算,則即使在計算機上, for
循環也將花費很長時間。 a=a+a
OP加倍方法已步入正軌,但不完全。
unsigned a;
unsigned b;
unsigned product = 0;
scanf("%u%u", &a, &b);
while (b > 0) {
if (b & 1) {
unsigned OldProduct = product;
product += a;
if (product < OldProduct) {
printf("\nOverflow\n");
break;
}
b >>= 1; // Halve b
a += a; // Double a - avoid using multiplication
}
printf("\nProduct = %u\n", product);
int a=1,b=1,c=0,i;
for(i=0;i<b;i++)
{
c=c+a;
}
printf("\n result=%d",c);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.