1、简单枚举
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好位数字0~9的一个排序(可以有前导0),2<=n<=79.
样例输入:
62
样例输出;
79546 / 01283 = 62
94736 / 01528 = 62
思路:只要枚举fghij就可以算出abcde,然后判断所有数字是否相同,超过10位时终止枚举。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n;
char a[99];
while(scanf("%d",&n)&&n>1)
{
for(int fghij=1234;fghij<98765;fghij++)//fghij最小为01234,abcde最大为98765
{
int flag=1;
int abcde=n*fghij;
sprintf(a,"%05d%05d",abcde,fghij);//将abcde和fghij的值存入数组a中
if(strlen(a)>10)//若数组长度超过10,不满足条件
break;
sort(a,a+10);//将数组从小到大排序
for(int i=0;i<10;i++)
{
if(a[i]!='0'+i)//判断是否为0~9
{
flag=0;
break;
}
}
if(flag)
{
printf("%05d/%05d=%d\n",abcde,fghij,n);
}
}
}
return 0;
}
2、分数拆分
输入正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y。
样例输入:
2
12
样例输出:
2
1/2=1/6+1/3;
1/2=1/4+1/4;
8
1/12=1/156+1/13;
1/12=1/84+1/14;
1/12=1/60+1/15;
1/12=1/48+1/16;
1/12=1/36+1/18;
1/12=1/30+1/20;
1/12=1/28+1/21;
1/12=1/24+1/24;
分析:既然要求找出所有的x,y,枚举对象自然就是x,y了。枚举的范围从1/12=1/156+1/13可以看出,x可以比y大很多。由于x>=y,有1/x<=1/y,因此1/k-1/y<=1/y,即y<=2k.只要在2k范围之内枚举y即可。
代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int k;
while(cin>>k)
{
int sum=0;
int y;
float x;
for(y=1;y<=2*k;y++)
{
x=(float(k*y)/float(y-k));
if((int)x==x&&x>0)
{
sum++;
}
}
cout<<sum<<endl;
for(y=1;y<=2*k;y++)
{
x=(float(k*y)/float(y-k));
if((int)x==x&&x>0)
{
cout<<"1/"<<k<<"=1/"<<x<<"+1/"<<y<<endl;
}
}
}
return 0;
}