我有一个代码可以找到一个数字除数的总和,但是我不能将它应用于我的增加n并分别打印所有数字。
代码是
long div(int n) {
long sum = 0;
int square_root = sqrt(n);
for (int i = 1; i <= square_root; i++) {
if (n % i == 0) {
sum += i;
if (i * i != n) {
sum += n / i;
}
}
}
return sum - n;
}
在我的主要()上,我需要从1开始的交流号码,然后转到我的MAXCYC,即28.n从2变为MAXNUM,即10000000.该程序需要找到所有完美,友好和善于交际的数字并用各自的对打印出来。
示例输出:
周期长度2:12285 14595 12285
周期长度5:12496 14288 15472 14536 14264 12496
for (int n = 2; n <= MAXNUM; n++) {
long sum = div(n);
long res = div(sum);
if (res <= MAXNUM) { // Checking if the number is just sociable
int c = 0;
while (c <= MAXCYC && n != res) {
res = div(sum);
c++;
}
if (c <= MAXCYC) {
printf("Cycle of length %d: ", c);
printf("%ld ", sum);
do {
printf("%ld ", res);
res = div(res);
}
while (sum < res);
printf("%ld ", sum);
c += c - 2;
printf("\n");
}
}
}
我只得到成对的循环长度为1,2,并且没有高于此值。它甚至不能正确打印它,因为它表示长度为0的循环:在所有结果中没有增加。我认为问题出现在第一次打印之前的 f 中,但我不能让它以一种只要我的方式工作
(n == sum)打印长度为1的循环:x x对
(n == res&amp;&amp; sum&lt; res)打印长度为2的周期:x y x对
(res&lt; = MAXNUM)它打印周期长度c:x y z ... x (c包括第一个x的对数)
你们认为我应该改变什么?
答案 0 :(得分:0)
好的,如果我理解你的要求,这段代码应该有效。
#include <stdio.h>
#include <stdlib.h>
int div_sum(int n)
{
long sum = 0;
int square_root = sqrt(n);
for (int i = 1; i <= square_root; i++)
{
if (n % i == 0)
{
sum += i;
if (i * i != n)
{
sum += n / i;
}
}
}
return sum - n;
}
int MAX_N = 10000000;
int MAX_CYCLES = 28;
int main()
{
int cycles;
for(int n = 2; n < MAX_N; n++){
int found = 0;
for(int c = 1; !found && c <= MAX_CYCLES; c++){
cycles = c;
int aliquote = n;
while(cycles--) aliquote = div_sum(aliquote);
//it is a cycle of length c
cycles = c;
if(n == aliquote){
printf("Cycle of length %d: %d", c, n);
while(cycles--){
aliquote = div_sum(aliquote);
printf(" %d", aliquote);
}
printf("\n");
found = 1;
}
}
}
return 0;
}