
C++求余数问题
constunsignedlonglonglong_long_max=18446744073709551615;constunsignedlonglongint_max=...
const unsigned long long long_long_max=18446744073709551615;
const unsigned long long int_max=4294967296;
unsigned long long get(unsigned long long a,unsigned long long b,unsigned long long m)
{
a=a%m;
b=b%m;
unsigned long long A1,A2,B1,B2;
A1=a/int_max;
A2=a%int_max;
B1=b/int_max;
B2=b%int_max;
//将a*b拆分成(A1*2^32+A2)*(B1*2^32+B2)=(A1*B1)*(2^64-1+1)+(A1*B2+A2*B1)*2^32+A1*B1%m
unsigned long long result=(A1*B1)%m*(((long_long_max%m)+1)%m)+(A1*B2%m+A2*B1%m)%m*(int_max%m)%m+A2*B2%m;
//cout<<A1<<" "<<A2<<" "<<B1<<" "<<B2<<" "<<result%m<<endl;
return result%m;
}
为什么get(get(a,a,m),x0,m)和(get(get(a,x0,m),a,m))答案不一样?? 展开
const unsigned long long int_max=4294967296;
unsigned long long get(unsigned long long a,unsigned long long b,unsigned long long m)
{
a=a%m;
b=b%m;
unsigned long long A1,A2,B1,B2;
A1=a/int_max;
A2=a%int_max;
B1=b/int_max;
B2=b%int_max;
//将a*b拆分成(A1*2^32+A2)*(B1*2^32+B2)=(A1*B1)*(2^64-1+1)+(A1*B2+A2*B1)*2^32+A1*B1%m
unsigned long long result=(A1*B1)%m*(((long_long_max%m)+1)%m)+(A1*B2%m+A2*B1%m)%m*(int_max%m)%m+A2*B2%m;
//cout<<A1<<" "<<A2<<" "<<B1<<" "<<B2<<" "<<result%m<<endl;
return result%m;
}
为什么get(get(a,a,m),x0,m)和(get(get(a,x0,m),a,m))答案不一样?? 展开
展开全部
代码没问题,应该输出也是对的。我注意到你的第二个(get(get(a,x0,m),a,m)),这个外面加了一个括号,没看到你的全部代码,你是不是用宏了?你带入的参数是long long型的吗?没有用double吧。
更多追问追答
追问
没有 我把主要的算法写在上面了 下面只是运算而已。 double不够用。。
追答
你是怎么输出的。。。
展开全部
get函数中的三个参数都不同啊。
get(get(a,a,m),x0,m) 参数一是get(a,a,m),参数二是x0
get(get(a,x0,m),a,m)) 参数一是get(a,x0,m),参数二是a
你这a,x0,m都相等吗?如果不相等的话,输出答案不一样就是对的吧。
get(get(a,a,m),x0,m) 参数一是get(a,a,m),参数二是x0
get(get(a,x0,m),a,m)) 参数一是get(a,x0,m),参数二是a
你这a,x0,m都相等吗?如果不相等的话,输出答案不一样就是对的吧。
追问
取余数运算?(a*a*x)%m 和(a%m)*(a%m)%m*(x0%m)%m 和 (a%m)*(x0%m)%m*(a%m)%m不一样么??
追答
试了一个比较小的整数,结果是一样。
那还是参考那两位的答案吧,越界?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你有debug过没?这俩答案是一样的。。。。
更多追问追答
追问
我都输出来过。。。就是不一样。。。我就是不知道。。我get()函数没问题吧
追答
你参数a,m,x0多是什么?我怎么debug就一样呢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询