如何找到 2 到 N 之间的数的最大约数和?
How to find largest sum of divsors of a number between 2 and N?
我有一道简单的数学题。我想在 [2,N]
范围内找到一个数字(从除数中排除 1 和 N),并且除数之和最大。例如,对于 N = 100
,2 到 100 之间的因数和最大的数是 96,它的所有因数和等于 155。
我编写了以下程序来显示该数字的除数之和,但无法弄清楚如何获取该数字本身。我如何找到并打印该号码?
int main(int argc, char const *argv[])
{
int N,
sum,
max=0;
scanf("%d", &N);
int i = 0,
d = 0;
for(i=2; i<=N; i++)
{
sum=0;
for(d = 2; d < i; d++)
{
if(i % d == 0)
{
sum += d;
}
}
if(sum > max)
{
max = sum;
}
}
printf("%d\n", max);
return 0;
}
应该很容易。再引入一个变量valueForMax
int N,
sum,
max=0,
valueForMax = 0;
并与max
一起更新
if(sum > max)
{
valueForMax = i;
max = sum;
}
那你可以
printf("best value %d, sum = %d\n", valueForMax, max);
当您保存 max
时,您只需将 i
的副本保存在一个单独的变量中。
这是一个工作程序:
#include <stdio.h>
int
main(int argc, char const *argv[])
{
int N,
sum,
max = 0;
int max_i = -1;
printf("Enter N: ");
fflush(stdout);
scanf("%d", &N);
int i = 0,
d = 0;
for (i = 2; i <= N; i++) {
sum = 0;
for (d = 2; d < i; d++) {
if (i % d == 0) {
sum += d;
}
}
if (sum > max) {
max = sum;
max_i = i;
}
}
printf("MaxSum:%d Index:%d\n", max, max_i);
return 0;
}
这是输出:
MaxSum:155 Index:96
其他人已经很好地展示了如何保存和报告出现最大值的i
。
但我想补充一下 OP 的方法如何 显着 更快:迭代到 N
而不是 N
的平方根。这种方式大约快 square_root(N) 倍。当 N
为 100 时不那么重要,但对于较大的值很重要。
#include <stdlib.h>
#include <stdio.h>
void print_maxsumdiv(int N, int mode) {
unsigned long long loop_count = 0;
int sum, max = 0;
int max_i = 0;
int i = 0, d = 0;
for (i = 2; i <= N; i++) {
sum = 0;
if (mode) {
// Iterate up to the just under the square root of `i`
for (d = 2; d < i/d; d++) {
loop_count++;
if (i % d == 0) {
sum += d + i/d; // Add both dividers
}
}
if (d == i/d) { // perfect square
sum += d;
}
}
else {
// Iterate up `i` (OP's original approach)
for (d = 2; d < i; d++) {
loop_count++;
if (i % d == 0) {
sum += d;
}
}
}
if (sum > max) {
max = sum;
max_i = i;
}
}
printf("i:%6d max:%9d (count:%12llu)\n", max_i, max, loop_count);
}
int main() {
for (int mode = 0; mode < 2; mode++) {
print_maxsumdiv(100, mode);
print_maxsumdiv(10000, mode);
//print_maxsumdiv(1000000, mode);
}
return 0;
}
输出
i: 96 max: 155 (count: 4851)
i: 9240 max: 25319 (count: 49985001)
i: 96 max: 155 (count: 480)
i: 9240 max: 25415 (count: 646800)
我有一道简单的数学题。我想在 [2,N]
范围内找到一个数字(从除数中排除 1 和 N),并且除数之和最大。例如,对于 N = 100
,2 到 100 之间的因数和最大的数是 96,它的所有因数和等于 155。
我编写了以下程序来显示该数字的除数之和,但无法弄清楚如何获取该数字本身。我如何找到并打印该号码?
int main(int argc, char const *argv[])
{
int N,
sum,
max=0;
scanf("%d", &N);
int i = 0,
d = 0;
for(i=2; i<=N; i++)
{
sum=0;
for(d = 2; d < i; d++)
{
if(i % d == 0)
{
sum += d;
}
}
if(sum > max)
{
max = sum;
}
}
printf("%d\n", max);
return 0;
}
应该很容易。再引入一个变量valueForMax
int N,
sum,
max=0,
valueForMax = 0;
并与max
if(sum > max)
{
valueForMax = i;
max = sum;
}
那你可以
printf("best value %d, sum = %d\n", valueForMax, max);
当您保存 max
时,您只需将 i
的副本保存在一个单独的变量中。
这是一个工作程序:
#include <stdio.h>
int
main(int argc, char const *argv[])
{
int N,
sum,
max = 0;
int max_i = -1;
printf("Enter N: ");
fflush(stdout);
scanf("%d", &N);
int i = 0,
d = 0;
for (i = 2; i <= N; i++) {
sum = 0;
for (d = 2; d < i; d++) {
if (i % d == 0) {
sum += d;
}
}
if (sum > max) {
max = sum;
max_i = i;
}
}
printf("MaxSum:%d Index:%d\n", max, max_i);
return 0;
}
这是输出:
MaxSum:155 Index:96
其他人已经很好地展示了如何保存和报告出现最大值的i
。
但我想补充一下 OP 的方法如何 显着 更快:迭代到 N
而不是 N
的平方根。这种方式大约快 square_root(N) 倍。当 N
为 100 时不那么重要,但对于较大的值很重要。
#include <stdlib.h>
#include <stdio.h>
void print_maxsumdiv(int N, int mode) {
unsigned long long loop_count = 0;
int sum, max = 0;
int max_i = 0;
int i = 0, d = 0;
for (i = 2; i <= N; i++) {
sum = 0;
if (mode) {
// Iterate up to the just under the square root of `i`
for (d = 2; d < i/d; d++) {
loop_count++;
if (i % d == 0) {
sum += d + i/d; // Add both dividers
}
}
if (d == i/d) { // perfect square
sum += d;
}
}
else {
// Iterate up `i` (OP's original approach)
for (d = 2; d < i; d++) {
loop_count++;
if (i % d == 0) {
sum += d;
}
}
}
if (sum > max) {
max = sum;
max_i = i;
}
}
printf("i:%6d max:%9d (count:%12llu)\n", max_i, max, loop_count);
}
int main() {
for (int mode = 0; mode < 2; mode++) {
print_maxsumdiv(100, mode);
print_maxsumdiv(10000, mode);
//print_maxsumdiv(1000000, mode);
}
return 0;
}
输出
i: 96 max: 155 (count: 4851)
i: 9240 max: 25319 (count: 49985001)
i: 96 max: 155 (count: 480)
i: 9240 max: 25415 (count: 646800)