如何解决使用重复加法的乘法
为什么这段代码有效?我的意思是,如果“b”是负数,那么“c”永远不会达到“if语句”中“b”的值,答案不应该是正确的,但仍然不管“b”是什么(正或负),乘法总是来对了。为什么?
#include <stdio.h>
int main()
{
int a,b,c=1,d=0;
scanf("%d %d",&a,&b);
for( ; ; ){
d=d+a;
if(c==b)
break;
c++;
}
printf("%d",d);
return 0;
}
解决方法
我尝试输入 3 * -4 并且得到了 b 和 c 的输出:
b: -4 c: 1
b: -4 c: 2
b: -4 c: 3
b: -4 c: 4
b: -4 c: 1431655762
b: -4 c: 1431655763
b: -4 c: 1431655764
b: -4 c: 1431655765
b: -4 c: 1431655766
b: -4 c: 1431655767
b: -4 c: 1431655768
b: -4 c: 1431655769
b: -4 c: -1431655769
b: -4 c: -1431655768
b: -4 c: -1431655767
b: -4 c: -1431655766
b: -4 c: -1431655765
b: -4 c: -1431655764
b: -4 c: -1431655763
b: -4 c: -1431655762
b: -4 c: -4
如您所见,它多次抛出所有整数值并最终获得所需的结果。 (我仅在 d 处于 [-12,12] 范围内时才打印以简化消息)。
,long long int mult(int a,int b)
{
long long int result = 0;
for(int x = 0; x < abs(b); x++)
{
result += abs(a);
}
if((a < 0 && b > 0) || (a > 0 && b < 0)) result = -result;
return result;
}
long long int mult(int a,int b)
{
long long int result = 0;
int c = a;
while(c)
{
result += b;
c += (a > 0 ? -1 : 1);
}
if((a < 0 && b > 0) || (a > 0 && b < 0)) result = result < 0 ? result : - result;
else result = result < 0 ? -result : result;
return result;
}
,
为什么此代码有效?
由于有符号整数溢出,您的程序有未定义行为。它似乎有效 - 因为这是未定义行为的一种可能结果。同一段代码——在你程序的不同部分——可能表现得完全不同。
如果您输入 3
-4
:
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
bool overflow(int d,int a) {
if(a > 0) {
if(d > INT_MAX - a) return true;
} else if(a < 0) {
if(d < INT_MIN - a) return true;
}
return false;
}
int main() {
int a,b,c = 1,d = 0;
if(scanf("%d %d",&a,&b) != 2) {
printf("input failure\n");
return 1;
}
for(;;) {
if(overflow(d,a)) {
printf("%d + %d would result in signed integer overflow\n"
"undefined behavior avoided by exiting instead\n",d,a);
return 1;
}
d = d + a;
if(c == b) break;
c++;
}
printf("%d\n",d);
return 0;
}
输入 3
-4
时可能的输出:
2147483646 + 3 would result in signed integer overflow
undefined behavior avoided by exiting instead
,
与其他答案类似,您的 for 循环版本“for( ; ; )”本质上是一个无限循环。有趣的是,您的代码有效的原因是因为您的无限循环。
在第 10 行,使用您的“c++”;语句,当我们为 b 输入否定答案时,我们会超过整数最大限制 2147483647。一旦我们超过该限制 1,c 变为 -2147483648(整数最小限制)。这一直持续到 c 增加到任何负 b 值。
您的“d”整数给出正确答案的原因与上述逻辑相同。 a 的增量将变为整数 max 和 min(取决于您的 a 是正数还是负数)以使用您当前的代码获得正确的值。
例如: 进入: 3 -4
在程序中: d = 0 + 3 c = 2
... d = -2(此时我们已经超过了整数最大值两次和最小值一次) c = 2147483647
... d = -12 c = -4
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。