我编写了一个简短的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)
答案 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;
函数并检查错误宠物