【问题标题】:Function that returns the sum of the number of dividers without remainder of a number, C返回除数之和而没有余数的函数,C
【发布时间】:2016-03-09 22:09:58
【问题描述】:

我可以轻松地在循环中打印我想要的内容,但我是函数新手,我需要将没有余数的除数之和保存或返回给作为用户输入的数字。

例子:

输入 - 6

输出 - 1+2+3=6

我是如何开始的:

int NumberOfDividers(int number)
{
    int i,num, count = 0;
    num = number;
    for ( i = 0; i < num; i++)
    {
        if ((num % i) == 0) //so now I know i is one of the dividers i want to save.

    }
}

所以如果i 是我想要的分隔符之一,我该如何将它保存到变量中?还是数组?

【问题讨论】:

  • 您已经声明了一堆变量,只需声明另一个变量来保存总和并随时添加,最后返回。
  • @EricRenouf 我想他想保存这些数字(分隔符)。
  • @Gilad 数字的总和是否必须等于输入?
  • @asfandahmed1 我只是从想要返回这些数字的总和的标题出发,这可以通过保存一个数组然后在稍后对其求和来完成,但如果你想要返回看起来没有必要的总和
  • 我想保存每个分隔符,例如数字 6。我需要保存 1、2、3。我可以在数组中执行此操作吗?不知道号码?

标签: c function loops modulus divide


【解决方案1】:

要返回正确除数的总和,请执行以下操作:

int sum_of_proper_divisors (int number)
{
    int sum = 0;
    int i;
    for (i = 1; i < number; i++)
    {
        if ((number % i) == 0) 
           sum += i;
    }
    return sum;
}

你只需要使用return关键字来返回值。

【讨论】:

  • 我想保存每个分隔符,例如数字 6。我需要保存 1、2、3。我可以在数组中执行此操作吗?不知道号码?
  • @Gilad ,我已经给出了答案。请看一看。
【解决方案2】:

因为这个任务看起来很有趣,所以不想带走编码经验。而是提出了一个示例算法,应该相当直接地用 C 语言编写代码。

伪代码

int *NumberOfDividers(int number)
  find isqrt(number) --> sqrt_number
  sqrt_number*2 + 2 --> max_array_count
  allocate int[] with max_array_count elements
  validate allocation
  starting at divisor = 1, in a loop ...
    quotient = number/divisor
    remainder = number%divisor
    if (remainder == 0)
      add divisor to list
      if (divisor != quotient) add quotient to list
    if (divisor >= quotient) quit loop
    divisor++
  append 0 to list to indicate the end
  shrink array to needed size if desired
  validate shrink result
  return array pointer.

请注意,循环最多进行sqrt(number) 次迭代,因此可以在使用任何除数之前计算所需数组大小的合理上限。

另请参阅How many positive integers are factors of a given number? 了解更高级的想法。

【讨论】:

    【解决方案3】:

    您可以看到另一种方法来做到这一点。对于大量数据,这将非常快速。这是我的方法,您可以按照此方法以最快的方式找到它,以找到一个数字的因子之和。这是我的代码:

    int number_of_divisor(int n)
    {
        int sum_of_factors=0;
        sum_of_factors+=1;//as 1 is factor of all num
        //sum_of_factors+=n;//n will always a factor of n
    
        for(int i = 2; i * i <= n; ++i)
        {
            if(n % i == 0)
            {
                sum_of_factors+=i;
                if(i * i != n)
                    sum_of_factors+=(n/i);
            }
        }
        return sum_of_factors;
    }
    

    如果您的输入是long,则将所有int 更改为long。

    谢谢。

    【讨论】:

      【解决方案4】:

      你可以这样做......

      //other headers as you need
      #include<string.h>//this header is for memset
      int dividers[1000];//global array
      int currPos;//global variable
      int NumberOfDividers(int number)
      {
      
         int i,num, count = 0;
         num = number;
         for ( i = 1; i < num; i++)//you should start counting from 1 otherwise you will get floating point exception
         {
             if ((num % i) == 0)
             {
                 dividers[currPos]=i;//putting the dividers in the array
                 currPos++;//updating the pivot where the next dividers will stay
             }
         }
         return 0;
      }
      
      int main()
      {
          memset(dividers,0,sizeof(dividers));//initializing the array
          currPos=0;//initializing the variable to point at the start of the array
          NumberOfDividers(6);
          int i;
          int sum=0;
          for(i=0;i<currPos;i++)
          {
             printf("%d",dividers[i]);
             sum+=dividers[i];
             if(i!=currPos-1)
             {
                 printf("+");
             }
         }
         printf("=%d\n",sum);
         return 0;
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-02
        • 2017-06-25
        • 1970-01-01
        相关资源
        最近更新 更多