簡體   English   中英

簡單C程序中的意外輸出

[英]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 = 3a = 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 ,然后添加的值asum ,如下:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM