ブルーブリッジカップ前の質問の質問混合数
問題記述
100は、混合画分の形で表すことができる:69 258 + 3 = 714分の100。
82 + 100 = 197分の3546:それはまた、のように表すことができます。
注前記分数、番号1〜9に見える一度だけ、それぞれ(0を含みません)。
このような混合割合は、11 100の表記があります。
入力フォーマット
、標準入力からの正の整数N(N <×1000 1000)
出力フォーマット
によってデジタル出力の番組デジタル1〜9は、すべての表現の種の数からなる漏れ分数なし省略する。
注:各々の出力に数値表現でのみ統計を言っ必要ありません!
サンプル入力1
100
サンプル出力1
11
サンプル入力2
105
出力例2
。6
粗分析:
アイデアは完全アレイ9に被検体1であり、その後、「+」と「\」挿入し、その後、カウントプラスワンため、確立されたならば、確立に算出式かどうかを判定する。
詳細な分析:
例:
データ入力N <* 1000 1000は、従って、「+」は6アンダー第2アンダーその範囲内に挿入することができるので_1_2_3_4_5_6_7_8_9、「+」とは、「\」、下線に挿入されています(二点を含む)との間、及び「/」桁の特定の数の前の桁数に等しい除算結果が0の後ろ、後者よりも大きい場合、または!
そして、我々は、実際には、数字の文字列のように、3つのセクションにカット、カットのように、最初のナイフは、単にデジタル、会うAに1番目と6番目の、その文字列の間にカットする必要があると思います式が確立されています。
ここでは、次の問題に対処する必要があります。
- 完全な配列
- デジタルへの部分文字列
問題解決のために
- 全体の構成は:: next_permutation(str.begin()、str.endは())STD C ++アルゴリズムで機能することにより、この問題を解決することができます。
- 文字列 - デジタルの場合は、そうでない場合は、これは比較的簡単ですが、文字列が最初にI I、デジタル(両方を含む)への文字の間にJ、クラスがデジタル変換に渡された文字列のパラメータではないです文字列の一部を撮影した(ただし、各機能)の添加に
ここに私のコードです
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
string str = "123456789";//1~9个数字
int Exchange(int i, int j)//将str中第i, j之间的字符转化为数字(包括两端点)
{
int number = 0;
for (; i <= j ; i++)
{
number = number * 10 + str[i] - '0';
}
return number;
}
int main()
{
int i, j, k, num, sum = 0;
int a, b, c;
cin >> num;
while (next_permutation(str.begin(), str.end()))//全排列
{
for (i = 0 ; i <= 4 ; i++)//第一刀的选取
{
a = Exchange(0, i);
for (j = (8 - i) / 2 + i ; j < 8 ; j++)//第二刀的选取
{
b = Exchange(i + 1, j);
c = Exchange(j + 1, 8);
if (num == a + b / c && b % c == 0)//限制条件,不要忘了b % c == 0,不然b / c 同意也会得到一个值,但不满足题意
{
sum++;
}
}
}
}
cout << sum << endl;
return 0;
}
間違った場合は、トラブルアウトポイント!ありがとうございます!