所以,我试着编写一个简单的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;
}
答案 0 :(得分:4)
你的循环实际上是{@ 1}的指数倍增。
例如,说出a
和b = 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);