0

So, I tried to write a simple C program which would calculate multiplication of two numbers without using * operator. But the result is not coming as expected. I can't understand why. This is the code:

#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

4 回答 4

4

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,然后添加 on 的值asum如下所示:

sum = 0;
for (i=0; i<b; i++)
    sum += a;

顺便说一句,+=运算符是一个很棒的运算符,它只是将自身右侧的值添加到其左侧的变量上。它比具有误导性的方程式要好得多,也不那么丑陋a = a + a,除非a = 0.

于 2013-09-14T04:04:45.520 回答
2

使用移位和加法相乘。O(log(b))。注意溢出。

我推荐这种方法而不是for (t = 0; t < b; t++). 想象一下,如果您使用 64 位数学,for循环会花费很长时间,即使在计算机上也是如此。的 OP 加倍方法a=a+a是正常的,但不完整。

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); 
于 2013-09-14T04:05:56.210 回答
2
int a=1,b=1,c=0,i;

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

printf("\n result=%d",c);
于 2013-09-14T04:03:04.577 回答
1
int a=1,b=1,c=0,i;
for(i=0;i<b;i++)
    {
        c=c+a;
    }
printf("\n result=%d",c);
于 2013-09-14T04:02:31.280 回答