寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #Volume5-0583 Common Divisors

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題
 入力ファイルの1行目に正整数 n が書いてあり, 2行目には半角空白文字1つを区切りとして, n 個の正整数が書いてある. n は 2 または 3 であり, 2行目に書かれているどの整数も値は 108 以下である.
 これら2個または3個の数の公約数をすべて求め, 小さい方から順に1行に1個ずつ出力せよ.
 自明な公約数(「1」)も出力すること.
 出力ファイルにおいては, 出力の最後行にも改行コードを入れること.

僕が作成、提出したコードは、以下のとおりです。

/*
 Volume5-0583 Common Divisors
 http://judge.u-aizu.ac.jp/
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
    int c;
    while((c=a%b)!=0){
        a=b;
        b=c;
    }
    return b;
}
vector<int> divisor(int n){
    vector<int> div;
    for(int i=1;i<=n;i++){
        if(n%i==0){
            div.push_back(n/i);
        }
    }
    sort(div.begin(),div.end());
    return div;
}
int main(void){
    int n,A[3],gcdA;
    vector<int> div;
    cin>>n;
    if(n==2){
        cin>>A[0]>>A[1];
        gcdA=gcd(A[0],A[1]);
        vector<int> div=divisor(gcdA);
        for(int i=0;i<div.size();i++){
            cout<<div[i]<<endl;
        }
    }else{
        cin>>A[0]>>A[1]>>A[2];
        gcdA=gcd(A[0],gcd(A[1],A[2]));
        vector<int> div=divisor(gcdA);
        for(int i=0;i<div.size();i++){
            cout<<div[i]<<endl;
        }
    }
    return 0;
}

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
Volume5-0583 Common Divisors