2010-03-15 71 views
2

我需要一些幫助修改此。它只保持顯示0作爲臨時值。謝謝。C++完美編號。需要一些幫助修改

// A program to determine whether the input number is a perfect number 
// A perfect number is defined by the sum of all its positive divisors excluding itself 
// 28: 1+2+3+7+14 = 28. 

int perfect, limit, divisor; 

cout << "Please enter a positive integer in order to define whether it is a perfect integer or not: " ; 
cin >> perfect; 
cout << endl; 

int temp = 0; 
int prevtemp = 0; 
    limit = 1; 
    divisor = 1; 
while (limit < perfect) 
{ 

    if ((perfect % divisor) == 0) 
    { 
    divisor = prevtemp; 
    temp = prevtemp + temp; 
    } 

    limit++; 
    divisor++; 
} 

if (perfect == temp) 
    cout << "Your number is a perfect number!" << endl; 
else 
    cout << "Your number is not a perfect number" << endl; 

return 0; 

回答

1

我不知道,但我猜代碼:

if ((perfect % divisor) == 0) 
    divisor = prevtemp; 

您預期這是prevtemp=divisor代替。這解決了一個明顯的問題,但仍然留下了很多,看起來並不像你想要的那樣做。例如,我不能完全弄清楚limit的意圖是什麼 - 你初始化它並增加它,但據我所知,你永遠不會使用10它的值(嗯,我想你用它,但是,它的價值總是和divisor一樣,所以我不確定爲什麼你認爲你需要這兩者,或者limit如何作爲它的名字)。

編輯:這是有道理的有一個limit。特別是,因素總是成對出現:一個小於或等於數字的平方根,一個匹配第一個總是大於或等於數字的平方根。因此,您不需要一直掃描數字本身尋找因素 - 您可以將數字的平方根設置爲限制,並且只掃描到該點。對於您找到該點的每個因素,匹配因子將爲perfect/divisor。既然你已經得到了一個工作的例子,我想我可能也只是希望這不是功課,並張貼的例子還有:

bool is_perfect(int number) { 
    int limit = sqrt((double)number); 
    int sum = 1; 

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

我使用while循環的限制,以便我可以找到所有的因數,不留餘數直到完美-1 – Sagistic 2010-03-15 20:25:31

+0

我明白了,我需要把temp = prevtemp + temp;在if塊內,否則,它將繼續添加。我編輯過,以使其正確。 – Sagistic 2010-03-15 20:41:55

+0

哈哈,這是作業。獲得某些幫助有什麼問題?再次感謝您的幫助,我很感激。我正在考慮使用sqrt作爲限制,我只是想首先使用一個工作原型。 – Sagistic 2010-03-15 21:01:45

5

你永遠設置prevtemp爲0以外任何東西,所以它添加到temp什麼都不做。

我相信你的意思是說

if ((perfect % divisor) == 0) 
    temp += divisor; // not "divisor = prevtemp;" 

行 「TEMP = prevtemp +溫度」 也應與此溶液中取出;不再需要prevtemp變量。

此外,沒有必要單獨保留limitdivisor變量,因爲它們總是相同的。只需刪除limit並將環路條件更改爲使用divisor

另外,正如Mark Byers指出的那樣,如果將循環重構爲for循環而不是while,該循環將更易於理解。

+0

我被毆打了。 :) – 2010-03-15 20:21:26

+0

啊..這就是它,我仍然需要修復一些算法,使這項工作。謝謝! – Sagistic 2010-03-15 20:24:18

+0

是的,即使有這個修復它說28是不完美的。 – 2010-03-15 20:28:23

0

在將其初始化爲0後,您永遠不會分配任何東西給prevtemp,因此在temp = prevtemp + temp行上沒有任何內容可以添加到temp

2

好像你正在它太複雜了。這裏是你如何能做到這一點:

int total = 0; 
for (int i = 1; i < perfect; ++i) 
{ 
    if (perfect % i == 0) 
     total += i; 
} 

if (perfect == total) 
    cout << "Your number is a perfect number!" << endl; 
else 
    cout << "Your number is not a perfect number" << endl; 

注意,運行總計被保存在一個名爲total變量(你叫這個變量temp),當數是一種精確除數它僅增加。

+0

謝謝。但是,我仍然對使用for循環的局部變量感到困惑,所以我還沒有使用它。 – Sagistic 2010-03-15 20:44:05

+0

我會學習你簡單而簡潔的方法。 – Sagistic 2010-03-15 20:44:47

0
#include<iostream> 
#include<iomanip> 
using namespace std; 

int main(){ 
    int n,i=1,sum=0; 
    cout<<"Enter a number: "; 
    cin >> n; 
    while(i<n){ 
     if(n%i==0) 
      sum=sum+i; 
     i++; 
    } 
    if(sum==n) 
     cout << i << " is a perfect number"; 
    else 
     cout << i << " is not a perfect number"; 
    system("pause"); 
    return 0; 
} 
+0

這個問題已經有了一個可接受的答案。如果有什麼特別的東西讓你的答案有所改進,你應該提供一些解釋。 – 2014-03-05 09:35:54