アルゴリズム:帯分数(再帰と繰返し)


構想
この問題では、1~9の辞書順を列挙し、3つの数の各数の桁数を列挙し、システムが与えた値と等しいかどうかを判断します.
問題の説明
100は帯分数の形式として表すことができる:100=3+69258714はまた、100=82+35461697注意特徴:帯分数のうち、数字1〜9がそれぞれ現れ、1回しか現れない(0を含まない)と表すことができる.
このような帯分数は,100に11種類の表現がある.
入力フォーマット
正の整数.
出力フォーマット
出力入力数字は、数字1〜9で帯分数表示の全種数を繰り返しなく構成する.
データ範囲
1≦N<106入力サンプル1:100出力サンプル1:11入力サンプル2:105出力サンプル2:6
コード#コード#
#include
#include
#include
using namespace std;
int number[10];
int main(){
     
    int n, m = 1;
    cin >> n;
    for(int i = 0; i < 9; ++i){
     
        number[i] = i + 1;
        m *= (i + 1);
    }
    double eps = 0.0000001;
    int cnt = 0;
    while(m--){
     
        for(int i = 1; i < 8; ++i){
     
            for(int j = 1; i + j < 9; ++j){
     
                int k = 9 - i - j;
                double a = 0, b = 0, c = 0;
                int x = 0;
                for(; x < i; ++x){
     
                    a = a * 10 + number[x];
                }
                for(; x < i + j; ++x){
     
                    b = b * 10 + number[x];
                }
                for(; x < 9; ++x){
     
                    c = c * 10 + number[x];
                }
                if(fabs((n - (a + (b / c)))) < eps){
     
                    cnt++;
                }
            }
        }
        next_permutation(number, number+9);
    }
    cout << cnt << endl;
    return 0;
}

原題リンクリンクリンク説明の追加