简单C程序中的意外输出

简单C程序中的意外输出,c,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&

因此,我尝试编写一个简单的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;
}
#包括
int main()
{
int a=1,b=1,c=1,i;
printf(“\n第1个元素=”);
scanf(“%d”和“&a”);
printf(“\n第二个元素=”);
scanf(“%d”和“b”);
对于(i=0;i
inta=1,b=1,c=0,i;

对于(i=0;i你实际上是在用你的循环将
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;
sum=0;

对于(i=0;i使用移位和加法进行乘法。O(log(b))。注意溢出

对于(t=0;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); 
无符号a;
无符号b;
无符号乘积=0;
scanf(“%u%u”、&a和&b);
而(b>0){
国际单项体育联合会(b&1){
未签名的OldProduct=产品;
产品+=a;
if(产品<旧产品){
printf(“\nOverflow\n”);
打破
}
b>>=1;//将b减半
a+=a;//双a-避免使用乘法
}
printf(“\n产品=%u\n”,产品);

打印时a和b是什么?在for循环之前a和b是什么?@Mistu4u因为您使用的是
b
,所以最好的第一步是找出它等于什么。“但结果并不像预期的那样。”这也是一个完全的谜。介意告诉我们它是什么吗?这个问题的答案只有代码。现在已经是星期五了吗?@Havenard有些人喜欢*=2其他人,当然,但是如果想法是不使用乘法,那
*
在那里做什么?明白我的意思了吗?@Havenard我已经摘下了模糊的眼镜,我看到了光明错误引导
a=a+a
可能是比这个答案所建议的增量for循环更有效的方法的一部分。标准习惯用法是每次通过循环将
a
乘以两倍。问题是每个循环应将b减半,并且需要一个条件积和。这种方法可能需要五分之一的时间64位数学运算。
sum = 0;
for (i=0; i<b; i++)
    sum += 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);