【问题标题】:deciding if a number is perfect or prime决定一个数字是完美的还是素数
【发布时间】:2011-05-24 08:46:58
【问题描述】:

问题是: “编写一个函数来判断一个数是质数还是完美数。”

到目前为止,我首先完成了完美的部分,这就是我所拥有的:

#include <iostream>
using namespace std;
bool perfectNumber(int);
int main()
{
 int number;

 cout<<"Please enter number:\n";
 cin>>number;
 bool perfectNumber(number);

 return 0;
}
bool perfectNumber(int number)
{
 int i;

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

但是,此代码似乎存在错误。 我看过这本书,但没有谈到这个话题。 我想获得有关如何修复此代码的建议。

谢谢!

【问题讨论】:

  • % 表示 number/i 的余数为 4%2=0
  • 听起来像是欧拉计划之一。但也许只有我;)
  • 您遇到了什么错误。查看代码示例,您将 perfectNumber(int) 定义为 bool,但返回的是 int。
  • @Ash Burlaczenko:这没有什么问题。问题在第 10 行(参见 James McNellis 的回答)。

标签: c++ numbers primes modulus perfect-numbers


【解决方案1】:
bool perfectNumber(number);

这不会调用perfectNumber 函数;它声明了一个名为perfectNumber 类型为bool 的局部变量,并使用转换为bool 类型的number 的值对其进行初始化。

为了调用perfectNumber 函数,您需要使用以下内容:

bool result = perfectNumber(number);

或:

bool result(perfectNumber(number));

另外注意:如果您要从流中读取输入(例如cin&gt;&gt;number),您必须检查以确保从流中提取值成功。就像现在一样,如果您输入 asdf,提取将失败,number 将保持未初始化状态。检查提取是否成功的最佳方法是简单地测试流的状态:

if (cin >> number) {
    bool result = perfectNumber(number);
}
else {
    // input operation failed; handle the error as appropriate
}

您可以在Semantics of flags on basic_ios 中了解有关如何设置和重置流错误状态的更多信息。您还应该咨询a good, introductory-level C++ book,了解更多流使用最佳实践。

【讨论】:

    【解决方案2】:
    void primenum(long double x) {
        bool prime = true; 
        int number2;
        number2 = (int) floor(sqrt(x));// Calculates the square-root of 'x'
    
        for (int i = 1; i <= x; i++) {
            for (int j = 2; j <= number2; j++) {
                if (i != j && i % j == 0) {
                    prime = false;
                    break;
                }
            }
            if (prime) {
                cout << " " << i << " ";
                c += 1;
            }
            prime = true;
        }
    }
    

    【讨论】:

    • 布尔素数 = true; // 计算 'x' 的平方根 真的吗?正确放置 cmets 也很重要。
    • 这是大错特错。如果您正在测试 x 是否为素数,请摆脱外部循环。如果您正在测试 [1,x] 中的所有素数,则内部循环的边界应该是 sqrt(i) 而不是 sqrt(x)。在这种情况下,这是测试该范围内的素数的一种非常低效的方法。请参阅en.wikipedia.org/wiki/Sieve_of_Eratosthenes 以获得更好的方法。
    【解决方案3】:
     bool isPerfect(  int number){
         int i;
         int sum=0;
         for(i=1;i<number ;i++){
             if(number %i == 0){
                 cout<<"  " << i ;
                 sum+=i;
             }
         }
    
         if (sum == number){
             cout<<"\n \t\t THIS NUMBER  >>>  "<<  number <<"   IS    PERFECT \n\n";
             return i;
         }else if (sum |= number) {
                   cout<<"\nThis number >>> " <<  number <<"   IS  NOT  PERFECT \n\n";
                   return 0;
         }
     }
    

    【讨论】:

      【解决方案4】:
      #pragma hdrstop
      
      #include <tchar.h>
      #include <stdio.h>
      #include <conio.h>
      //---------------------------------------------------------------------------
      
      
      bool is_prim(int nr)
      {
      
          for (int i = 2; i < nr-1; i++) {
      
          if (nr%i==0) return false;
      
          }
      
          return true;
      
      }
      
      bool is_ptr(int nr)
      {
          int sum=0;
      
          for (int i = 1; i < nr; i++) {
      
          if (nr%i==0) {
              sum=sum+i;
          }
      
          }
      
          if (sum==nr) { return true;
      
          }
          else return false;
      }
      #pragma argsused
      int _tmain(int argc, _TCHAR* argv[])
      {
          int numar;
      
          printf ("Number=");scanf("%d",&numar);
          if (is_prim(numar)==true) { printf("The number is prime");
      
          }
          else printf("The number is not prime");
      
          if (is_ptr(numar)==true) { printf(" The number is perfect");
      
          }
          else printf(" The number is not perfect");
          getch();
          return 0;
      }
      

      【讨论】:

      • is_ptr 为完美数返回 false 或 true,is_prim 为素数返回 true 或 false
      • 格式化您的代码。在发布答案之前,您没有查看预览并注意到“这是不可读的”吗?在编辑器中,选择源代码,然后单击101010 按钮。
      • @jalf 101010 表示 fine ?我不知道:-)
      • 好笑。 ;) 顺便说一句,为避免其他人阅读时造成混淆,{ } 按钮 用于 显示类似 10010 的内容。
      猜你喜欢
      • 2017-01-09
      • 2011-09-27
      • 1970-01-01
      • 2019-03-15
      • 2015-11-06
      • 2022-01-17
      • 2011-08-02
      相关资源
      最近更新 更多