试题 历届试题 带分数

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

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

暴力枚举加一定程度的剪枝。check这些函数写得不好,其实归为一个也可以,直接都check_all的时候判断也不错

#include<iostream>
#include<vector>
#include<string>
#include<sstream> 
#include<algorithm>
#include<cstring>
#include<iostream>

using namespace std;
string i2s(long long &num)
{
    
    
	stringstream ss;
	string tem;
	ss.clear();
	ss<<num;
	ss>>tem;
	return tem;
}
bool check_a(long long &a)//有同数字返回false 
{
    
    
	string tem;
	bool flag[10];
	memset(flag, false, sizeof(flag));
	tem = i2s(a);
	for(int i = 0;i<tem.size();i++)
	{
    
    
		if(tem[i] == '0')
			return false;
		if(tem[i] != '0'&&flag[tem[i] - '0'])
			return false;
		else if(!flag[tem[i] - '0'])
			flag[tem[i] - '0'] = true;
	}
	return true; 
}
bool check_ac(long long &a, long long &c)//有同数字返回false 
{
    
    
	string A, C, tem;
	bool flag[10];
	memset(flag, false, sizeof(flag));
	A = i2s(a);
	C = i2s(c);
	tem = A + C;
	for(int i = 0;i<tem.size();i++)
	{
    
    
		if(tem[i] == '0')
			return false;
		if(tem[i] != '0'&&flag[tem[i] - '0'])
			return false;
		else if(!flag[tem[i] - '0'])
			flag[tem[i] - '0'] = true;
	}
	return true; 
}

bool check_all(long long &a, long long &b, long long &c)//有同数字返回false 
{
    
    
	string A,B,C, tem;
	bool flag[10];
	memset(flag, false, sizeof(flag));
	A = i2s(a);
	B = i2s(b);
	C = i2s(c);
	tem = A + B + C;
	for(int i = 0;i<tem.size();i++)
	{
    
    
		if(tem[i] == '0')
			return false;
		if(tem[i] != '0'&&flag[tem[i] - '0'])
			return false;
		else if(!flag[tem[i] - '0'])
			flag[tem[i] - '0'] = true;
	}
	for(int i = 1;i<10;i++)//是否都用上 
		if(!flag[i])
			return false;
	return true;
}

bool check_length(long long &a, long long &b, long long &c)
{
    
    
	string A,B,C,tem;
	int length = 0;
	A = i2s(a);
	B = i2s(b);
	C = i2s(c);
	tem = A + B + C;
	for(int i = 0;i<tem.size();i++)
	{
    
    
		if(tem[i] != '0')
			length++;
	}
	return length>9;
}

 int main(int argc,char *argv[])
 {
    
    
 	long long number = 0;
    long long n, a, b, c; // n = a + b/c;
    cin>>n;
    for(a = 1;a<n;a++)
    {
    
    
    	if(!check_a(a))
    		continue;
    	for(c = 1;;c++)
    	{
    
    
    		if(!check_ac(a,c))//a,c是否同字母 
    			continue;
    		b = c * (n - a);
    		if(check_length(a,b,c))//太长了,加起来超过9个字符肯定有问题 
    			break;
    		if(check_all(a, b,c))
    		{
    
    
    			number++;
    			//cout<<a<<"+"<<b<<"/"<<c<<endl;
    		}
    	}
    }
    cout<<number;
	return 0;
	
 }

猜你喜欢

转载自blog.csdn.net/qq_39117858/article/details/104636929
今日推荐