トピック
説明
1-n内の完全な数を見つけます。いわゆる完全な数は、すべての要素が合計された数です。たとえば、6には3つの要素1,2,3,1 + 2 + 3 = 6、次に6があります。終わりました。つまり、最終的な数値は、そのすべての要素の合計に等しくなります。
入力
テストデータのセットは複数あり、入力n、nデータ範囲は大きくありません。
出力
入力のグループごとに、1-n内のすべての数値を出力してください。出力に複数の数字がある場合は、スペースで区切ります。出力の最後に余分なスペースを入れないでください。
サンプル入力コピー
6
サンプル出力コピー
6
アイデア
- 言うことは何もありません。1-n/ 2の係数を見つけて合計します(最大係数はn / 2(最小係数)でなければなりません)
- 時間を節約したい場合は、完成した番号のリストを作成できます
コード
#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
vector<int> full;//完数打表
const int maxn=10005;
int main(){
int n=0;
while(scanf("%d",&n)!=EOF){
if(!full.empty()&&n<=full[full.size()-1]){
for(int i=0;i<full.size()&&full[i]<=n;i++)
printf("%d ",full[i]);
printf("\n");
continue;
}
for(int i=0;i<full.size()&&full[i]<=n;i++)
printf("%d ",full[i]);
int start=3;
if(!full.empty())
start=full[full.size()-1]+1;
for(int j=start;j<=n;j++){
int sum=0;
for(int i=1;i<=j/2;i++){
if(j%i==0){
sum+=i;
}
}
if(sum==j){
printf("%d ",j);
full.push_back(j);
}
}
printf("\n");
}
return 0;
}