查找整数

时间:2018-01-08 01:51:55

标签: c++ debugging

我编写了一个简短的C ++函数,它尝试返回类似于radical of an integer的函数,而是返回给定数字的某个根的最小整数。一般逻辑是函数将整数分解为素数幂,寻找素数幂的所有指数的gcd,然后通过将所有指数除以该gcd来找到基数。我认为函数按预期工作,但是我注意到当函数13作为参数传递它返回12时,我将输出放在2到20之下;除了13之外,一切都是正确的。当试图调试这两个" primes"和"权力"保持正确的值(分别为13和1,两个大小为1的向量)以及" power"应该是1。所以问题必须在最后一个循环中,但我真的很困惑,因为它应该计算pow(13,1 / 1)。

#include<vector>
#include<cmath>

int radical(int n){
    int power = 0;
    std::vector<int> primes;
    std::vector<int> powers;
    for(int i = 2; n != 1 ; ++i){
        int t_pow = 0;
        while(n % i == 0){
           ++t_pow;
            n /= i;
        }
        if(t_pow != 0){
            primes.push_back(i);
            powers.push_back(t_pow);
        }
        power = (power == 0 ? t_pow : gcd(power, t_pow));
    }

    int rad = 1;
    for(unsigned i = 0u; i < primes.size(); ++i){
        rad *= pow(primes.at(i), powers.at(i)/power);
    }
    return rad;
}

2 2

3 3

4 2

5 5

6 6

7 7

8 2

9 3

10 10

11 11

12 12

13 12

14 14

15 15

16 2

17 17

18 18

19 19

20 20

编辑: The most efficient way to implement an integer based power function pow(int, int)

2 个答案:

答案 0 :(得分:0)

天真算法实际上看起来非常简单:

rad = 1
i = 1
While n > 1:
    increase i
    if i divides n:
        multiply rad by i
        while i divides n, divide n by i

你已经完成了所有这些步骤,事实上你做的远不止这些(并且使用了更多的空间),那么为什么不去除不必要的行动呢?

答案 1 :(得分:0)

定义您自己的typedef struct rule_struct_u { unsigned char inbound_outbound; unsigned int source_ip; unsigned int source_netmask; unsigned int source_port; unsigned int destination_ip; unsigned int destination_netmask; unsigned int destination_port; unsigned char protocol; unsigned char action; } rule_struct_u; 函数并检查错误宠物