【问题标题】:Can't print out sociable numbers properly无法正确打印社交号码
【发布时间】:2016-11-06 13:53:42
【问题描述】:

我有一个代码可以找到一个数字的除数之和,但我无法将它应用于我不断增加的 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 的 ac 数字,即 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 的对,并且没有超过。而且它甚至没有正确打印它,因为它说 Cycle of length 0: 在所有结果中没有增加。我认为问题出在第一次打印之前的 f 中,但我无法让它以一种只要 my
(n == sum) 它打印 长度为 1 的循环:xx 对
(n == res && sum 它打印 长度为 2 的循环:xyx 对
(res 它打印 Cycle of length c: xyz ... x(包括第一个 x 的 c 个对数) p>

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

【问题讨论】:

  • 这个程序的输入是什么?
  • @thecoder 运行的时候,应该是从 n = 2 开始,一直走到 n
  • 并打印任何长度的所有周期,直到 28?
  • 就是这样,先生。

标签: c


【解决方案1】:

好的,如果我很好地理解了您的要求,这段代码应该可以工作。

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

【讨论】:

  • 我的代码有类似的问题,它重复了一些结果:长度为 5 的循环:12496 14288 15472 14536 14264 12496 长度为 5 的循环:14264 12496 14288 15472 14536 14264。
  • 嗯,我看到了,但我把它作为练习留给你,应该不难;)重要的是它解决了问题,你应该做这个更正。
  • 我尝试将 while(cycles--){ 更改为 while(cycles-- && n 但我只得到了一个答案现在。
  • 提示:循环中的每个数字都不应再检查。每个形成循环的数字,不要将其用作另一个序列的开始(循环中n 的值)。 PS:如果有帮助,您也可以接受并投票。
  • 我投了赞成票,但由于我是该网站的新手,它说它不会公开显示,只是将其保存在记录中。我从 printf("Cycle of length %d: %d", c, n); 行将 n 更改为 a 以停止重复从第 1 和第 2 周期开始,但我仍然得到上述数字。
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多