NC14353. 带分数
描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入描述
从标准输入读入一个正整数N (N<1000*1000)
输出描述
程序首先输出正整数N,然后在输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数n。
注意:不要求输出每个表示,只统计有多少表示法!
输出格式:N n
示例1
输入:
100
输出:
100 11
示例2
输入:
105
输出:
105 6
C++(g++ 7.5.0) 解法, 执行用时: 97ms, 内存消耗: 544K, 提交时间: 2022-10-01 19:20:16
#include<iostream> #include<algorithm> using namespace std; int num[9] = {1,2,3,4,5,6,7,8,9}; int lenof(int x){ int len = 0; while(x){ x/=10; len++; } return len; } int numof(int a,int b){ int num_x=0; for(int i=a;i<=b;i++){ num_x = num_x*10 + num[i]; } return num_x; } int main() { int n; cin >> n; int size = lenof(n); int sum=0,a,b,c; do{for(int i=0;i<=size;i++){ for(int j=i+1;j<8;j++){ a = numof(0,i); b = numof(i+1,j); c = numof(j+1,8); if((long long)(n*c) == (long long)(a*c+b)) sum++; } } }while(next_permutation(num,num+9)); cout << n << " " << sum << endl; system("pause"); return 0; }
C++14(g++5.4) 解法, 执行用时: 105ms, 内存消耗: 404K, 提交时间: 2020-07-09 17:04:45
#include<iostream> using namespace std; int num[10]; bool used[10]; int ans; int n; int calc(int l, int r){ int res = 0; for(int i = l; i <= r; i++) res = res * 10 + num[i]; return res; } void dfs(int v) { if(v==10) for(int i=1;i<8;i++) for(int j=i+1;j<9;j++) { int a = calc(1, i); int b = calc(i + 1, j); int c = calc(j + 1, 9); //注意判断条件,因为C++中除法是整除,所以要转化为加减乘来计算 if(a * c + b == c * n) ans++; } for(int i = 1; i <= 9; i++) if(!used[i]){ used[i] = true; //标记使用 num[v] = i; dfs(v + 1); used[i] = false; //还原现场 } } int main() { cin>>n; dfs(1); cout<<n<<" "<<ans<<endl; }
C++(clang++ 11.0.1) 解法, 执行用时: 357ms, 内存消耗: 416K, 提交时间: 2023-07-06 12:10:08
#include<bits/stdc++.h> using namespace std; #define ll long long int n,cnt; int x, y, z; int main() { cin >> n; cout<<n<<' '; string s = "123456789"; do { for (int i = 1; i <= 7; i++) { x = stoi(s.substr(0,i)); if (x > n)break; for (int j = i+1; j <= 8; j++) { y = stoi(s.substr(i, j - i)); z = stoi(s.substr(j)); if (x + y / z == n && y % z == 0) { cnt++; } } } } while (next_permutation(s.begin(),s.end())); cout << cnt; return 0; }
Python3 解法, 执行用时: 611ms, 内存消耗: 6588K, 提交时间: 2023-03-18 10:41:42
a = input('') b= int(a) x = 0 for i in range(1, int('9' * (6 - len(a)))): for n in range(1, b): c = str(n) + str((b - n) * i) + str(i) bj = 1 for j in range(9): if str(j + 1) not in c: bj = 0 break if bj == 1 and len(c) == 9: x += 1 print(a,x)