我试图计算小于或等于正整数的 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("%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;
}
这是我的输入
1
3 2
4 5 6
8 30
输入130
的答案是正确的,但8
错误
我的输出是
8
1
8
1
8
1
48
30
3
30
3
30
3
163
答案 0 :(得分:1)
这是最近在另一个问题precision error in nth root of a number in C++中观察到的(并且最近在code blocks power function is not working in c中)代码块的幂函数。 libing of mingw在准确性方面是次优的。在转换为(long long)整数之前使用round
来解释exp(y*ln(x))
作为pow(x,y)
的实现的有限精度。
(long long int)round(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,因此不需要在代码中使用此函数。
答案 1 :(得分:-1)
您需要为变量分配内存
long *qrr;
qrr = (long*) malloc(q*sizeof(long));
编辑(其他猜测)
尝试两者:
pow(qrr[z], 0.33);
pow(qrr[z], 1/3);
我想这里发生了一些事情,您的1/3
被解释为0