简单C程序中的意外输出
因此,我尝试编写一个简单的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&
*
运算符就可以计算两个数字的乘法。但结果并非如预期的那样。我不明白为什么。代码如下:
#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;iinta=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);