您的位置:首页 > 其它

历届试题 带分数

2017-04-06 20:55 330 查看
问题描述

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

解题思路:

N=A+B/C;

A,B,C位数相加为9,且每位数都不同。

考虑每个数的范围

A: 1-n;可以确定

但是B和C就不好确定

但是B C有关系

B=(N-A)*C;

C??不好确定

所以枚举A和C,A的范围已经知道啦,

我们只有A至少为一位

那么B+C最多为8为,又因为B要大于C,所以C最多为4,即1-9999

我的代码:

//
#include<iostream>
#include<math.h>
#include<memory.h>
#include<algorithm>
using namespace std;
int n;
int check(int x,int y,int z)
{
int k=0,a[10]={0};
while(x)
{
a[x%10]++;
if(a[x%10]>1)
return 0;
x=x/10;
}
while(y)
{
a[y%10]++;
if(a[y%10]>1)
return 0;
y=y/10;
}
while(z)
{
a[z%10]++;
if(a[z%10]>1)
return 0;
z=z/10;
}
if(a[0]!=0)//判断是否存在0
return 0;
for(int i=1;i<=9;i++)
{
if(a[i]!=1)
return 0;
}
return 1;
}
int main()
{
cin>>n;
int x,y,z,i,j,sum=0;
for(i=1;i<n;i++)//枚举整数
{
for(j=1;j<=9999;j++)//枚举分母 因为分子+分母<=8且分子>分母 所以分母最多四位
{
if(i!=j&&(n-i)*j>=j)
{
if(check(i,j,(n-i)*j)==1)
{
sum++;
}
}
}
}
cout<<sum<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: