100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
#include <iostream> #include <algorithm> using namespace std; // 拿数字 int toNum(int *data,int s, int e) { int ret = 0; for (int i = s; i <= e; i++) { ret = ret*10+data[i]; } return ret; } int main() { int data[10]; int n, ans,s,e,a,b,c,flag; while(~scanf("%d", &n)) { for (int i = 0; i < 10; i++) data[i] = i; ans = 0; do { s = e = 1; while(1) { a = toNum(data, s, e);// 确定a得值 if (a >= n) break; // 当a截取得值大于n时,说明已经是错误得,直接进行下一个排列 // 让分数线从左往右一位数一位数的移动 for (int i = e+1; i < 10-1; i++) {// 必须保证c有一位数,不然分母为零,所以i<10-1 b = toNum(data, e+1, i); c = toNum(data, i+1, 9); if (b%c != 0) continue; if (a+b/c==n) ans++; } e++;// 移动 } }while(next_permutation(data+1, data+10)); // 全排列 cout << ans << endl; } return 0; }
此处无声胜有声。
原文:https://www.cnblogs.com/hello-dummy/p/12178757.html