gpt4 book ai didi

c - 长整型超出范围

转载 作者:行者123 更新时间:2023-11-30 15:15:48 24 4
gpt4 key购买 nike

我遇到以下问题。执行此代码时,变量 lonpk 的值超出了 long int 值的限制,并且程序打印了错误的值。问题在于计算加起来为 100 的数字的立方

#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
void main(void){

for (long i = -2000; i <= 2000; i++) {
long pi = i * i * i;
if ((i > 0) && (pi > 100)) {
break;
}
for (long j = i; j <= 2000; j++) {
long pj = (pi + (j * j * j));
if ((j > 0) && (pj > 100)) {
break;
}
for (long k = j; k <= 2000; k++) {
long pk = pj + (k * k * k);
if ((k > 0) && (pk > 100)) {
break;
}

if (pk == 100.0) {
printf("%ld",pk);
printf("primer numero=%ld segundo numero=%ld tercer numero=%ld\n",i,j,k);

}
}
}
}
getch();
}

结果不正确

    primer numero=-1971 segundo numero=-986  tercer numero=295    
correct result
primer numero=-1797 segundo numero=1870 tercer numero=-903

最佳答案

使用 long long 执行数学运算,因为它具有所需的 pow(2000,3) 范围。

注意下面的代码行。第一个可能会溢出,假设 ULNG_MAX == 2**32 - 1,而第二个则通过将初始乘以 1LL 强制 long long 数学要使用的 -=- 至少是 64 位。

 long i;
i * i * i
1LL * i * i * i

代码:

for (long i = -2000; i <= 2000; i++) {
long long pi = 1LL * i * (i * i);
if ((i > 0) && (pi > 100)) {
break;
}
for (long j = i; j <= 2000; j++) {
long long pj = (pi + (1LL*j * (j * j)));
if ((j > 0) && (pj > 100)) {
break;
}
for (long k = j; k <= 2000; k++) {
long long pk = pj + (1LL * k * (k * k));
if ((k > 0) && (pk > 100)) {
break;
}

if (pk == 100) {
printf("%lld",pk);
printf("primer numero=%ld segundo numero=%ld tercer numero=%ld\n"
,i,j,k);

}
}
}
}
getch();
}
<小时/>

OP 无法访问 long long,然后使用 double,它可能具有足够的范围/精度来完成此任务。

int main(void) {
for (long i = -2000; i <= 2000; i++) {
double pi = 1.0 * i * (i * i);
if ((i > 0) && (pi > 100)) {
break;
}
for (long j = i; j <= 2000; j++) {
double pj = (pi + (1.0 * j * (j * j)));
if ((j > 0) && (pj > 100)) {
break;
}
for (long k = j; k <= 2000; k++) {
double pk = pj + (1.0 * k * (k * k));
if ((k > 0) && (pk > 100)) {
break;
}

if (pk == 100) {
printf("%.0f", pk);
printf("primer numero=%ld segundo numero=%ld tercer numero=%ld\n", i, j, k);
fflush(stdout);
}
}
}
}
getch();
return 0;
}

100primer numero=-1797 segundo numero=-903 tercer numero=1870
100primer numero=-161 segundo numero=-139 tercer numero=190
100primer numero=-6 segundo numero=-3 tercer numero=7
<小时/>

[编辑]主要加速 - 减少for(k),可能快 50 倍

  // k*k*k + pj = 100;
// k = pow(100 - pj, 1.0/3)
long kmin = (long) pow(100 - pj, 1.0/3) - 1;
if (kmin < j) kmin = j;
for (long k = kmin; k <= 2000; k++) {
double pk = pj + (1.0 * k * k * k);
if ((k > 0) && (pk > 100)) {
break;
}

关于c - 长整型超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33381017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com