藍橋杯之帶分數(全排列+暴力)
題目連結:
http://oj.ecustacm.cn/problem.php?id=1426
Description
100 可以表示為帶分數的形式:100 = 3 + 69258 / 714。
還可以表示為:100 = 82 + 3546 / 197。
注意特徵:帶分數中,數字1~9分別出現且只出現一次(不包含0)。
類似這樣的帶分數,100 有 11 種表示法。
Input
從標準輸入讀入一個正整數N (N<1000*1000)
Output
程式輸出該數字用數碼1~9不重複不遺漏地組成帶分數表示的全部種數。
Sample Input
樣例輸入1
100
樣例輸入2
105
Sample Output
樣例輸出1
11
樣例輸出2
6
分析:
(1)直接暴力全排列
(2)全排列基礎上對每種排列方式,用2個隔板m、n隔出3個數x,y,z,將數按照 x + y / z == N 進行判斷即可
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N;
cin >> N;
int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int count = 0;
bool flag = false;
// 儘量只讓全排列只排1次,否則時間損耗太大,所以將全排列放在外迴圈
do {
for (int m = 1; m <= 7; m++)
{
for (int n = m + 1; n <= 8; n++)
{
// 以m,n為分割,1 ~ m 構成的是sum_head,
// m+1~n 構成的分子是sum_mid,n+1 ~ 9構成的是sum_tail
int sum_head = 0;
for (int j = 1; j <= m; j++)
sum_head = sum_head * 10 +a[j];
//cout << sum_head << endl;
int sum_mid = 0;
for (int j = m + 1; j <= n; j++)
sum_mid = sum_mid * 10 + a[j];
//cout << sum_head << endl;
int sum_tail = 0;
for (int j = n+1; j <= 9; j++)
sum_tail = sum_tail * 10 +a[j];
//cout << sum_tail << endl;
// 如果取餘為0才可下一步,畢竟都是整數,sum_mid / sum_tail會直接截斷小數部分,也可能等於N,造成不準確
if (sum_mid % sum_tail == 0)
if (sum_head + sum_mid / sum_tail == N)
count++;
}
}
// 注意我的a陣列是啊a[0]到a[9],則需要從a[1]到a[9]進行全排列
} while (next_permutation(a+1, a + 10));
cout << count << endl;
return 0;
}
相關文章
- 藍橋杯-帶分數
- 藍橋杯全排列專題
- 藍橋杯-排列序數
- 藍橋杯——暴力列舉篇
- 藍橋杯-分巧克力
- 藍橋杯 分巧克力(Java)Java
- 藍橋杯15年真題奇妙的數字暴力集合去重
- 藍橋杯 整數拼接
- 藍橋杯-M次方根(實數二分)
- 2017年藍橋杯A組-分巧克力(整數二分)
- 藍橋杯
- 藍橋杯-合併數列
- 藍橋杯-波動數列
- 藍橋杯例題-快速分揀
- 藍橋杯-子 2023 / 雙子數
- 藍橋杯-連號區間數
- 藍橋杯-買不到的數目
- 藍橋杯——特別數的和
- 藍橋杯真題:純質數
- 【藍橋杯練習--二分】789. 數的範圍
- 藍橋杯嵌入式之點燈
- 藍橋杯-N皇后
- 藍橋杯真題
- 藍橋杯 買瓜
- 藍橋杯 剪格子
- 藍橋杯真題之錯誤票據
- 藍橋杯:入門訓練 Fibonacci數列
- 閒聊藍橋杯JAVA - 生成迴文數Java
- [2019藍橋杯國賽B組c++][最優包含][排列數][第八大奇蹟]C++
- 藍橋杯-長草(BFS)
- 藍橋杯-日期問題
- 藍橋杯-翻硬幣
- 藍橋杯-座次問題
- 藍橋杯 計算方程
- 藍橋杯-螞蟻感冒
- 如何準備藍橋杯
- 藍橋杯年號字串字串
- 藍橋杯考點整理