アルゴリズム:帯分数(再帰と繰返し)
構想
この問題では、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
コード#コード#
原題リンクリンクリンク説明の追加
この問題では、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;
}
原題リンクリンクリンク説明の追加