非日常デコレーション

一般 web developer の雑記です

関数内で求めた複数の値を最小限のサイズの配列に格納する

動的な配列生成と関数が絡んだ問題が苦手なので自分用に記録。
約数、公約数を求めて必要最小限の配列に格納し、そのサイズを返す関数を作りました。

#include <iostream>
#include <queue>
using namespace std;

//約数の個数を求める
int f(int a, int*& temp){
    queue<int> qu;
    int n=0;
    for(int i=1; i<a+1; i++){
        if(a%i==0){
            qu.push(i);
            n++;
        }
    }
    
    temp = new int [n];
    
    for(int i=0; i<n; i++){
        temp[i]=qu.front();
        qu.pop();
    }
    return n;
}

//2数の公約数を求める
int Common(int x, int y, int*& com){
    int *x_div, *y_div;
    int x_num = f(x, x_div);
    int y_num = f(y, y_div);
    
    int n=0;
    queue<int> qu;
    
    for(int i=0; i<x_num; i++){
        for(int j=0; j<y_num; j++){
            if(x_div[i]<y_div[j]) break;
            if(x_div[i]==y_div[j]){
                qu.push(x_div[i]);
                n++;
            }
        }
    }
    com = new int [n];
    for(int i=0; i<n; i++){
        com[i]=qu.front();
        qu.pop();
    }
    return n;
}

int main(void){
    //約数を求める
    int *c;
    int c_num = f(24,c);
    //公約数を求める
    int *common;
    int num = Common(24,30,common);

}

配列を関数内でnewして、呼び出し元に変更内容を反映させるために仮引数にポインタの参照をとっています。
こんな使い方があったんですな。

自分で実装するとなると結構、めんどくさいですね。
c++は配列のサイズを変えるのだけでも一苦労。
リストを使えばいい話?

~その翌日~

動的な配列はvectorを使おうな

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//約数
vector<int> f(int n){
    vector<int> vec;
    for(int i=1; i*i<=n; i++){
        if(n%i==0){
            vec.push_back(i);
            if(i!=(n/i)){
                vec.push_back(n/i);
            }
        }
    }
    sort(vec.begin(), vec.end());
    return vec;
}

//最大公約数を求める
int Common(int m, int n){
    
    int k;
    if(m<n) swap(m,n);
    while(k!=0){
        k = m%n;
        m = n;
        n = k;
    }
    return m;
}

int main(void){
    
    vector<int> a = f(8);
    for(vector<int>::iterator it = a.begin(); it!=a.end(); ++it) cout << *it << endl;
    
    cout << Common(20, 8) << endl;

}

ようやくvectorの存在意義を理解しました(遅)
そもそもc++の標準ライブラリを知らなさすぎた
こんなに短くまとめられることに感動

おまけ

python楽すぎる

# coding: utf-8

#約数を求める
def f(n):
    result = []
    for i in range(1, n+1):
        if i*i>n:
            break
        if n%i==0:
            result.append(i)
            if i!=n/i:
                result.append(int(n/i))
    return sorted(result)
    
#最大公約数を求める
def Common(m, n):
    k=-1
    if m<n:
        m,n=n,m
    while(k!=0):
        k=m%n
        m=n
        n=k
    return m

print (f(30))
print (Common(20,8))

c++はいかに綺麗にかけるかの技量が問われるのに対して、pythonは書き方のスタイルがある程度固められているから書きやすいといった印象。
お手軽実装言語としてpythonがんばりたい。