其他分享
首页 > 其他分享> > 90. 带分数 (15分)

90. 带分数 (15分)

作者:互联网

              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;
}

  

标签:10,15,temp,int,带分数,down,90,left
来源: https://www.cnblogs.com/zhumengdexiaobai/p/10852686.html