C++ 如何有效地得到给定范围内的除数之和?
我试图找到给定范围a,ba中C++ 如何有效地得到给定范围内的除数之和?,c++,algorithm,time-complexity,C++,Algorithm,Time Complexity,我试图找到给定范围a,ba中c的所有除数之和注:问题不清楚我们是需要除数(在描述中)还是可除整数(在代码示例中)。答案总结了可分割的项目 这很简单 从中查找,使从%c==0&&from>=a的最小值 查找to,最大值,以便to%c==0&&to注意:问题不清楚我们是否需要求和除数(在说明中)或可除整数(在代码示例中)。答案总结了可分割的项目 这很简单 从中查找,使从%c==0&&from>=a的最小值 找到to,最大值,以便to%c==0&&to首先识别所有作为c的除数的素数。这将给您留下一
c
的所有除数之和注:问题不清楚我们是需要除数(在描述中)还是可除整数(在代码示例中)。答案总结了可分割的项目
这很简单
- 从中查找
,使
从%c==0&&from>=a的最小值
- 查找
,最大值,以便to
中查找to%c==0&&to注意:问题不清楚我们是否需要求和除数(在说明中)或可除整数(在代码示例中)。答案总结了可分割的项目 这很简单
- 从
,使
从%c==0&&from>=a的最小值
- 找到
,最大值,以便to
to%c==0&&to首先识别所有作为c的除数的素数。这将给您留下一个数字列表[w,x,y,z…]。然后保留一个哈希表集,其中包含该列表中所有整数的倍数,这些整数也是除数
int a, b, c; cin >> a >> b >> c; long long sum = 0; std::vector<int> all_prime_factors = // Get all prime factors of c std::unordered_set<int> factorSet; for (int primefactor : all_prime_factors) { int factor = primefactor; while (factor <= b) { if (factor % c == 0) factorSet.insert(factor); factor += primefactor; } } for (int x : factorSet) { sum += x; } cout << sum << endl;
inta、b、c; cin>>a>>b>>c; 长和=0; std::vector all_prime_factors=//获取c的所有素数因子 std::无序集因子集; for(整型素数因子:所有素数因子) { int因子=基本因子;
while(factor首先确定所有作为c的除数的素数。这将给您留下一个数字列表[w,x,y,z…]。然后保留一个哈希表集,该列表中所有整数的倍数也是除数int a, b, c; cin >> a >> b >> c; long long sum = 0; std::vector<int> all_prime_factors = // Get all prime factors of c std::unordered_set<int> factorSet; for (int primefactor : all_prime_factors) { int factor = primefactor; while (factor <= b) { if (factor % c == 0) factorSet.insert(factor); factor += primefactor; } } for (int x : factorSet) { sum += x; } cout << sum << endl;
inta、b、c; cin>>a>>b>>c; 长和=0; std::vector all_prime_factors=//获取c的所有素数因子 std::无序集因子集; for(整型素数因子:所有素数因子) { int因子=基本因子;
(因子)你可以尝试找到<代码> C< <代码>的素数分解,然后从它们中导出所有可能的除数(范围<代码> [a,b] < /代码>)。(例如,如果您将任何因子与任何其他因子配对,4将多次出现,且素因子分解为2、2、2)。@Aconcagua“工作”如果您没有指定接受标准,则是一个主观形容词。在这里,OP清楚地说明了它们的实现性能不够:然后需要更正。这是主题。如果您不确定,可以询问它。您可以尝试找到
的素因子分解,然后导出所有可能的因子(范围c
这在O((b-a)*log(c)/log(c)中运行。这比O(1)的替代实现慢得多你能更快吗?首先,向集合中添加任何素数因子,然后添加两个素数因子的任何乘积,然后添加三个素数因子中的任何一个,然后…当然,这不是很简单-获得素数因子会有所不同:虽然最初的方法更倾向于避免重复,但这个方法需要保留重复项…为什么a=12,b=18,c=6会打印12?没有无论我多么努力地解释这个问题,这个结果对于用[a,b]这是非常复杂的……而且你需要考虑可能的重复(例如,如果你与任何其他因素配对,4将出现2, 2, 2倍的素数分解)。@阿空加瓜山“工作”如果你没有指定接受标准,这是一个主观形容词。在这里,OP清楚地说明了它们的实现不够好:然后需要更正。这是主题。如果你不确定,你可以问它。你确定没有乘法吗?c=6,a=5,b=30->from=6,to=30->to+c=30-6+6=30;n可分割的数字:6,12,18,24,30,和是90。@Aconcagua Fixed你确定没有缺少乘法吗?c=6,a=5,b=30->from=6,to=30->from+c=30-6+6=30;可分割的数字:6,12,18,24,30,和是90。@Aconcagua Fixed你能更快吗?首先,在集合中添加任何素数,然后再添加两个p的任何乘积素数因子,然后是3中的任何一个,然后……当然,这不是小事——而得到素数因子则不同:虽然最初的方法更倾向于避免重复,但这一方法需要保留重复项……为什么对于a=12,b=18,c=6,它打印12?无论我多么努力地解释这个问题,这个结果对于用
factor+=primefactor
来测量修复没有意义,它在O((b-a)*log(c)/log(c)中运行。这比O(1)的替代实现慢得多。factor+=primefactor
if (c < 0) c *= -1; // works unless c == MIN_INT if (a % c == 0) from = a; else if (a >= 0) from = (a / c * c) + c else from = a / c * c;
int a, b, c; std::cin >> a >> b >> c; if (!std::cin) { std::cout << "input error\n"; return 0; } if (c < 0) c*= -1; const int from = [a,c] { // no rounding needed if (a % c == 0) return a; // division rounds down to zero if (a > 0) return (1 + a / c) * c; // division rounds up to zero return a / c * c; }(); const int to = [b,c] { // no rounding needed if (b % c == 0) return b; // division rounds down to zero if (b > 0) return (b / c) * c; // division rounds up to zero return (b / c - 1) * c; }(); int64_t sum = 0; if (from <= to) { const int n = (to - from) / c + 1; sum = n * (to + from) / 2; } std::cout << sum << '\n';
int a, b, c; cin >> a >> b >> c; long long sum = 0; std::vector<int> all_prime_factors = // Get all prime factors of c std::unordered_set<int> factorSet; for (int primefactor : all_prime_factors) { int factor = primefactor; while (factor <= b) { if (factor % c == 0) factorSet.insert(factor); factor += primefactor; } } for (int x : factorSet) { sum += x; } cout << sum << endl;