我正在编写一段代码,将幂的基数和幂作为参数,并检查是否存在幂数较低且幂数等于它的幂(最大幂为100),到目前为止,我已经编写了此代码:
#include <stdio.h>
#include <math.h>
int equalPower(int base, int esp);
int main(){
if(equalPower(100,40))
printf("Unique\n");
else
printf("Not unique\n");
return 0;
}
int equalPower(int base, int esp){
int i, j;
for(i = 2; i <= sqrt(base); i++){
for(j = 2; j <= 100; j++){
if(pow(base,esp) == pow(i,j))
return 0;
}
}
return 1;
}
(我知道,就性能而言,它可以进行改进,但是它也应该以这种方式工作。)
如您所见,我正在测试100 ^ 40,等于10 ^ 80,但是程序会打印出“ Unique”。我显然缺少了一些东西。起初我以为100 ^ 40之类的幂太大而无法执行测试,但是我对此进行了单独测试,并且效果很好。我不知道为什么函数不返回0。
该解决方案并不暗示使用,pow()
因为比较浮点数几乎总是不准确的。取而代之的是,您必须回到代数知识,并且由于您使用的是整数值,因此我将为您提供仅整数的解决方案,这将使您的精度没有问题。
您必须考虑基础,看看它本身是否就是力量。否则,您将一无所获。拿着这个:
a ^ b == c ^ d
一个基本的代数事实是,对于两个相等的数字,分解该数字应得出相同的结果。因此,要检查两个幂实际上是否相同,您需要:
a ^ b == (a1 * a2 * a3 * ... * an) ^ b = c ^ d
值a1,a2,a3,...,an是赋给正整数指数的质因子(不允许为0)。这将与以下内容相同:
a ^ b = a1 ^ b * a2 ^ b * a3 ^ b * ... * an ^ b
让我们检查一下它们是否与相同c ^ d
:
c ^ d = c1 ^ d * c2 ^ d * c3 ^ d * ... * cn ^ d
假设an和cn的排序方式相同,则这是一个定理,如果两个数相等,您将获得完全相同的表示形式。因此,您将要检查是否:
an ^ b = cn ^ d
对于每个n,您将很快发现cn ^(something)== an。这意味着log(cn,an)将是一个(数学上的)整数值。这意味着root(x, an) == cn
(我不记得实际的名称)或pow(cn, x) == an
,每个an和cn都有一个固定的整数x值。但是,由于存在浮点错误,因此我将不使用pow()。
这意味着:您只需要检查底数,而不是指数,并对照另一个底数进行检查:
int check_power(int base, int exponent) {
if (base == 1) {
puts("Dude! for 1, the trivial solution is 1^x for every x!");
return 1;
}
for(int newbase=0, newbase<100; newbase++) {
int newexponent = 0;
int power = 1;
while (power < base) {
power = power * newbase;
exponent++;
}
if (power == base) {
printf("found! base: %d, exponent: %d", newbase, newexponent * exponent);
return 1;
}
}
puts("nothing found");
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句