【发布时间】:2017-06-28 09:42:24
【问题描述】:
我遇到了俄罗斯农民指数 (RPE) Link is here 的问题,它计算指数的速度比寻找 x 的 n 次方的传统方法快得多。
传统方法强>
int power(int base, int exponent) {
int result = 1;
for(register int i = 1; i <= exponent; i++) {
result *= base;
}
return result;
}
我实现了复数算法,考虑到乘法可能导致溢出,我将re(z) mod m 和im(z) mod m 打印为 2 个空格分隔的整数,但我的实现不正确,因为它会导致一些奇怪的答案任何人指出问题,以及如何纠正它。这是我的代码
#include<iostream>
#include<complex>
using namespace std;
class Solution {
int m;
long long int k;
complex<long long int> num;
complex<long long int> russianPeasantExponentiation(), multiply(complex<long long int>, complex<long long int>);
public:
void takeInput(), solve();
};
void Solution::takeInput() {
int a, b;
cin >> a >> b >> k >> m;
num = complex<long long int> (a, b);
}
void Solution::solve() {
complex<long long int> res = russianPeasantExponentiation();
cout << real(res) << " " << imag(res) << endl;
}
complex<long long int> Solution::russianPeasantExponentiation() {
complex<long long int> temp1(1, 0), temp2 = num;
while(k) {
if(k % 2) {
temp1 = multiply(temp1, temp2);
}
temp2 = multiply(temp2, temp2);
k /= 2;
}
return temp1;
}
complex<long long int> Solution::multiply(complex<long long int> a, complex<long long int> b) {
long long int ar = real(a), ai = imag(a), br = real(b), bi = imag(b);
complex<long long int> result(((ar * br) % m - (ai * bi) % m) % m, ((ar * bi)%m + (ai * br)%m)%m);
return result;
}
int main() {
int q;
cin >> q;
while(q--) {
Solution obj;
obj.takeInput();
obj.solve();
}
return 0;
}
问题表明输入由一个整数q 组成,它定义了编号。的查询。每个查询由 4 个用空格分隔的数字组成 a, b, k, m。对于每个查询,我必须找到z = (a + ib)^k,因为re(z) 和im(z) 的值可能非常大,所以我必须打印re(z) mod m 和im(z) mod m
问题出现在测试用例中
8 2 10 1000000000 预期输出是 880332800 927506432 而我的输出是 -119667200 -72493568
【问题讨论】:
-
什么是奇怪的答案?展示一些你得到的预期输出/输出的例子
-
补充一下 gdelab 的建议,如果您为此编写测试工具,它可能会为您提供很好的服务。
-
请花点时间阅读How to debug small programs。为了帮助您进行调试,请尝试将大型表达式分解为较小的表达式,以便更轻松地查看中间结果。
-
您对代码进行了过度设计。这不应该是一个类。读取输入是一个与求解幂完全无关的问题。我也不清楚您使用复数的原因:它们不会让溢出神奇地消失。
-
使用调试器!
标签: c++ algorithm integer-overflow