帶分數 藍橋杯原題

2021-10-01 17:21:03 字數 1886 閱讀 9299

100可以表示為帶分數的形式:100=3+69258/714

還可以表示為:100=82+3546/197

注意特徵:帶分數中,數字 1∼9 分別出現且只出現一次(不包含 0)。

類似這樣的帶分數,100 有 11 種表示法。

輸入格式

乙個正整數。

輸出格式

輸出輸入數字用數碼 1∼9 不重複不遺漏地組成帶分數表示的全部種數。

資料範圍

1≤ n <10 ^ 6

輸入樣例1:

100
輸出樣例1:

11
輸入樣例2:

105
輸出樣例2:

6
題目中要求不包含0並且這三個位置肯定是得有數字的也就是可以看做為

n = a + b / c —> cn = ac + b

暴力列舉9個數字的全部排列組合,然後在八個空位插兩個板子看分出來的三個數是否符合題意來判斷共有多少種答案是一種求解方法

或者做一些簡化,乙個位置乙個位置的列舉

首先列舉所有的a,對每乙個確定了的a在列舉一遍c,在對每乙個c來確定這個唯一的b,如果這三個數成立的話,那麼就是一種符合題意的解

b可以用上面的式子,在知道了a和c的情況下求出來,判斷確定的a和c是否是乙個解,只需要判斷b中所有的數字是不是還沒有出現過的數字,並且是否1~9這9個數字已經全部使用過

**如下

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =10;

int n, ans;

//ans 用來記錄結果的數量

bool st[n]

, backup[n]

;//記錄狀態,這個數是否被用過

//backup是因為check函式中每次做判斷都要有改變,但是這個操作不能改之前的,所以新開乙個陣列

bool

check

(int a,

int c)

//檢查對特定的a,c是否符合題意

//判斷是否1-9所有的陣列都使用過

for(

int i =

1; i <

10; i++

)return

true;}

//對確定的a和已經使用了多少數字,來列舉剩下的所有可能的c

void

dfs_c

(int u,

int a,

int c)

}//列舉所有的a

void

dfs_a

(int u,

int a)

}int

main()

注: 一共1~9,9個數字,陣列長度開成10,我們從1開始標記而不是從陣列下標0開始標記,u代表的是當前用過了多少數字,一開始dfs_a(0,0),表示乙個數字都沒用過,a是0的時候開始,然後走dfs_a這個函式,如果a大於等於n了,顯然後面就不會再有正確的解了,直接return,然後開始對有了乙個確定的a開始列舉c列舉完了之後在換另一a,這裡用a * 10 + i來在a的後面加乙個數。因為是1到9這九個數並且不會重複出現,就讓他這樣在這裡充當乙個陣列的作用

*注:*關於dfs_c中的那個判斷,如果u==n表示所有的數字全部都用過了,那麼就不會有正確的解了,也直接return

藍橋杯 帶分數

問題描述 100 可以表示為帶分數的形式 100 3 69258 714。還可以表示為 100 82 3546 197。注意特徵 帶分數中,數字1 9分別出現且只出現一次 不包含0 類似這樣的帶分數,100 有 11 種表示法。輸入格式 從標準輸入讀入乙個正整數n n 1000 1000 輸出格式 ...

藍橋杯 帶分數

問題描述 100 可以表示為帶分數的形式 100 3 69258 714。還可以表示為 100 82 3546 197。注意特徵 帶分數中,數字1 9分別出現且只出現一次 不包含0 類似這樣的帶分數,100 有 11 種表示法。輸入格式 從標準輸入讀入乙個正整數n n 1000 1000 輸出格式 ...

藍橋杯 帶分數

100 可以表示為帶分數的形式 100 3 69258 714 還可以表示為 100 82 3546 197 注意特徵 帶分數中,數字1 9分別出現且只出現一次 不包含0 類似這樣的帶分數,100 有 11 種表示法。題目要求 從標準輸入讀入乙個正整數n n 1000 1000 程式輸出該數字用數碼...