在c中为相同的数学运算获取错误的值?
我试图计算小于或等于正整数第I个根的最大整数。这是我的密码:在c中为相同的数学运算获取错误的值?,c,math,C,Math,我试图计算小于或等于正整数第I个根的最大整数。这是我的密码: #include <stdio.h> #include <math.h> #include <stdlib.h> int main() { int t; scanf("%d",&t); while(t>0) { long long n,q,a,b,res=0,den,x,y,z; int w; scanf
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int t;
scanf("%d",&t);
while(t>0)
{
long long n,q,a,b,res=0,den,x,y,z;
int w;
scanf("%lld",&n);
long *arr = (long*) malloc(n*sizeof(long));
scanf("%lld",&q);
long *qrr = (long*) malloc(q*sizeof(long));
for(x=0;x<n;x++)
{
scanf("%ld",&arr[x]);
}
for(y=0;y<q;y++)
{
scanf("%ld",&qrr[y]);
}
for(z=0;z<q;z++)
{
res = 0;
for(w=1;w<=n;w++)
{
printf("%ld\n",qrr[z]);
printf("%lld\n",(long long)(pow(qrr[z],1.0/(3))));
res += ((long long)(pow(qrr[z],1.0/(w)))*arr[w-1]);
}
printf("%lld\n",res%1000000007);
}
}
return 0;
}
输入130
回答正确,但输入8
回答错误。我的输出是
8
1
8
1
8
1
48
30
3
30
3
30
3
163
您需要为变量分配内存
long *qrr;
qrr = (long*) malloc(q*sizeof(long));
编辑(附加猜测)
尝试两种方法:
pow(qrr[z],0.33)代码>
pow(qrr[z],1/3)代码>
我猜这里发生了一些事情,你的1/3
被解释为0
这是最近在另一个问题中观察到的(不是最近在代码块的幂函数中)。就精度而言,mingw的libm是次优的。在转换为(长-长)整数之前使用round
,以解释exp(y*ln(x))
作为pow(x,y)
的实现的有限精度
由于这只解决了一半的问题,因为期望的结果是floor(pow(x,1.0/k))
,并且如果x是精确的幂n^k,则会出现问题,由于精度问题,结果应该是n,而不是n-1。。。修改输入,以便计算
floor(pow(x+0.5, 1.0/k))
然后,63.5仍然明显小于64,因此floor(pow(63.5,1.0/3))=3
,但64.5现在明显大于64,因此pow(64.5,1.0/3)
也将明显大于4(远远超出5的范围)
当然,转换为整数会隐式应用floor,因此无需在代码中使用此函数。应首先将哪个变量(long-long)(pow(8,1.0/(3))放入variable@user3714283您的长数组qrr直到答案不匹配。您的qrr[z]
中的z
是什么?printf(“%ld\n”,qrr[z])
在执行powers并让我们知道它是多少之前,请使用new
不是C,使用malloc
浮点运算是不精确的。您的计算可能存在舍入错误。pow
适用于浮点数,立方根的结果将不精确。(虽然1.0/3
已经不精确了。)但这并不能解释为什么当qrr[z]==8
时两个输出会不同。我在这两个方面都得到2
。检查qrr[z]
是否确实是8
;我觉得不是。我已经检查了qrr[z]很多次了。我会再试一次。
(long long int)round(pow(x,y))
floor(pow(x+0.5, 1.0/k))