无法正确打印社交号码

我有一个代码可以找到一个数字除数的总和,但我无法将它应用于我的增加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; } 

在我的main()上,我需要有一个从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的循环:xx对
(n == res && sum <res)它打印长度为2的循环:xyx对
(res <= MAXNUM)它打印长度为c的循环:xyz … x (c包括第一个x的对的数量)

你们认为我应该改变什么?

好吧,如果我理解你的要求,这段代码应该有用。

 #include  #include  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; }