简单C程序中的意外输出

时间:2013-09-14 03:58:59

标签: c

所以,我试着编写一个简单的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;
}

4 个答案:

答案 0 :(得分:4)

你的循环实际上是{@ 1}的指数倍增。

例如,说出ab = 3。然后循环将运行三次。

展开循环会产生:

a = 5

所以你不会得到15,但你会得到40。

而是创建一个新变量,例如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; ,然后将sum = 0的值添加到a,如下所示:

sum

顺便说一句,sum = 0; for (i=0; i<b; i++) sum += a; 运算符是一个很好的运算符,它只是将自身右侧的值添加到左侧的变量上。它比误导的等式+=更好,更难看,除非a = a + a,否则它甚至没有数学意义。

答案 1 :(得分:2)

int a=1,b=1,c=0,i;

a=a+a; ==>c=c+a ;    

printf("\n result=%d",c);

答案 2 :(得分:2)

使用轮班和加法相乘。 O(日志(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); 

答案 3 :(得分:1)

int a=1,b=1,c=0,i;
for(i=0;i<b;i++)
    {
        c=c+a;
    }
printf("\n result=%d",c);