资源限制
时间限制: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;
}