140. 带分数 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
例如:
用户输入:
100
程序输出:
11
输入描述
从标准输入读入一个正整数N (N<1000*1000)
输出描述
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
输入样例
100
输出样例
11
思路:将表达式表示为: n = left + up / down; 的形式,然后枚举 left, down, 即可算出:up = (n - left) * down;
注意枚举的范围.
#include <iostream> #include <algorithm> #include <set> #include <vector> using namespace std; //int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int main(){ int n; cin >> n; int ans = 0; int left, up, down; for(int left = 1; left < n; left++){ for(int down = 1; down < 10000; down++){ int up = (n - left) * down; int flag = 1; int temp = 0, f = left, d = down, u = up; int a[10] = {0}; while(f != 0){ temp = f % 10; if(a[temp] != 0){ flag = 0; break; } a[temp] = 1; f /= 10; } while(d != 0 && flag == 1){ temp = d % 10; if(a[temp] != 0){ flag = 0; break; } a[temp] = 1; d /= 10; } while(u != 0 && flag == 1){ temp = u % 10; if(a[temp] != 0){ flag = 0; break; } a[temp] = 1; u /= 10; } if(a[0] == 1){ flag = 0; } for(int j = 1; j <= 9 && flag; j++){ if(a[j] == 0){ flag = 0; break; } } if(flag == 1){ // cout << left << " " << up << " " << down << "; " << up * 1.0 / down << endl; ans++; } } } cout << ans << endl; return 0; }