# 带分数 **问题描述** 100 可以表示为带分数的形式:100 = 3 + 69258 / 714。 还可以表示为:100 = 82 + 3546 / 197。 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100 有 11 种表示法。 **输入格式** 从标准输入读入一个正整数N (N<1000*1000) **输出格式** 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。 注意:不要求输出每个表示,只统计有多少表示法! **样例输入1** ``` 100 ``` **样例输出1** ``` 11 ``` **样例输入2** ``` 105 ``` **样例输出2** ``` 6 ``` 以下错误的一项是? ## aop ### before ```c #include using namespace std; ``` ### after ```c ``` ## 答案 ```c int main() { int n, ans = 0; scanf("%d", &n); string s = "123456789"; do { for (int i = 1; i <= 7; ++i) { string a = s.substr(0, i); int inta = atoi(a.c_str()); if (inta >= n) break; for (int j = i; j <= 9 - i; ++j) { string b = s.substr(i, j); string c = s.substr(i + j); int intb = atoi(b.c_str()); int intc = atoi(c.c_str()); if (intb % intc == 0 && inta + intb / intc == n) ans++; } } } while (next_permutation(s.begin(), s.end())); printf("%d\n", ans); return 0; } ``` ## 选项 ### A ```c int visit[10] = {0}; int s[10]; int ans = 0; int N; void found(int s[]) { int x, y, z; for (int i = 1; i < 9; i++) { for (int j = i + 1; j < 9; j++) { x = y = z = 0; for (int k = 0; k < 9; k++) { if (k < i) x = x * 10 + s[k + 1]; else if (k < j) y = y * 10 + s[k + 1]; else z = z * 10 + s[k + 1]; } if (y % z == 0 && x + y / z == N) { ans++; } } } } void dfs(int pos, int n) { if (pos == n) found(s); else { for (int i = 1; i <= 9; i++) { if (!visit[i]) { s[pos] = i; visit[i] = 1; dfs(pos + 1, n); visit[i] = 0; } } } } int main() { cin >> N; dfs(1, 10); cout << ans << endl; return 0; } ``` ### B ```c int parse(const char *arr, int pos, int len) { int ans = 0; int t = 1; for (int i = pos + len - 1; i >= pos; i--) { ans += (arr[i] - '0') * t; t *= 10; } return ans; } int main() { int N; cin >> N; int ans = 0; string s = "123456789"; do { const char *str = s.c_str(); for (int i = 0; i <= 7; i++) { int inta = parse(str, 0, i); if (inta >= N) break; for (int j = 1; j <= 9 - 1 - i; j++) { int intb = parse(str, i, j); int intc = parse(str, i + j, 9 - i - j); if (intb % intc == 0 && inta + intb / intc == N) { ans++; } } } } while (next_permutation(s.begin(), s.end())); cout << ans; return 0; } ``` ### C ```c int a[10] = {0}; int Division(int m) { int t; while (m) { t = m % 10; if (t == 0) { return 0; } a[t]++; m = m / 10; } return 1; } int main() { int i, k, j; int number, ans = 0, flag; cin >> number; for (i = 1; i < number; i++) { for (j = 1; j <= 4938; j++) { memset(a, 0, sizeof(a)); k = (number - i) * j; if (Division(i) && Division(j) && Division(k)) { flag = 1; for (int x = 1; x < 10; x++) { if (a[x] != 1) { flag = 0; break; } } if (flag == 1) ans++; } } } cout << ans; return 0; } ```