我正在解决SPOJ上的this问题
我们要计算((P ^ N)+(Q ^ N)),我们给出 P + Q和P * Q.
输入: 第一行将包含表示测试用例数的整数T(< = 15) 将在单独的行中为每个测试用例给出三个整数p + q,p * q和n 为每个测试用例输出相应的 在单独的行中输出(p ^ n)+(q ^ n)
过了一段时间我想出了这种复发
p^n + q^n = (p^n-1 + q^n-1)(p+q) - pq(p^n-2 + q^n-2)
and in my code i have
a = p + q and b = p.q
这是我的解决方案
public Long computeExponential(int n)
{
//base cases
if(n == 0)
{
return 1L;
}
else if(n == 1)
{
return new Long(a);
}
else
{
return (a * computeExponential(n-1) - b * computeExponential(n-2));
}
我在给定的测试用例中得到的答案是
2125764
4383653
-3
175099
28160
我派生的公式是错误的吗?
答案 0 :(得分:1)
不,你的派生方程是正确的。我可以看到你的实现中的一个小错误:
如果n=0
,p^0 + q^0 = 1 + 1 = 2
。 computeExponential
n=0
的{{1}}会返回1
。
[edit]为了将来的参考,我觉得非常有用,对于复杂的算法,特别是编写我自己的测试用例,特别是对于基本情况,简单情况和异常值,我已经手动计算了结果,然后首先运行这些来检查我的功能正在做我认为应该做的事情。例如,用n = 0,p = 2,q = 3(即p + q = 5,pq = 6)测试你的方法会很快抛出这个错误。只有当它通过我自己的测试用例后,我才能将其提交给其他测试数据,这些测试数据可能对我有意义,也可能没有。