abcde/fghij=n,其中a~j为数字0~9的不同排列.n的值从2到79。统计这样的组合一共有多少个。
输入:无
思路:通过循环找到n和n*i内满足条件的数。将a/b=i的问题转化为在i和b的范围内寻找满足a的条件的值。又通过i和n*i将i和b联系起来,缩小循环求解的范围。然后就是判断n和i*n是否由0-9十个不同地数字排列组合而成的两个五位数。设置一个判断函数,在函数内定义一个长度为十的一维数组,用来存储十个数字,并将其初始化为除0-9以外的数值。函数的形参是n和i*n。通过除10取余的五次循环,依次求出五位数的各位数字,并将其存到与其自身相等的数组的位置中p[m]=m。然后通过循环判断当0<=K<=9时是否都有p[k]!=k,如果都有则函数返回1,否则返回0。在主函数中设置累加变量sum,用来累计这样的组合一共有多少个
#include<iostream>
using namespace std;
int Panduanbudeng(int a,int b)//判断两个数是不是由十个数字排列组合而成
{
int p[10]={11};//设置一个数组,用来存放数字;初始化数组,数组中不能出现的数值至少应该大于等于十,否则会对接下来的求位数造成干扰;
int m=0;//过度变量
for(int i=0;i<5;i++)//用循环的方法依次求出五位数a的各个位数
{
m=a%10;//求余,取余数
p[m]=m;//将对应的数字放到数组中对应的位置,如a[1]=1
a=a/10;//求下一位的数字
}
for(int j=0;j<5;j++)//求形参b的各位数字
{
m=b%10;
p[m]=m;
b=b/10;
}
for(int k=0;k<10;k++)//判断a和b的各位数字是否有重复
{
if(p[k]!=k)//若有重复,则必有a[n]=11;其中n属于0-9;
return 0;
}
return 1;//若各位数字都不同,则返回1
}
int main()
{
int n,i;
int sum=0;//累计次数,并初始化
for(i=2;i<=79;i++)//求i范围内的循环
for(n=1234;n*i<=98765;n++)//嵌套循环,两个五位数相除变为分母乘以商,并控制循环范围
if(Panduanbudeng(n,i*n))//判断是否
sum=sum+1;
printf("%d\n",sum);
}
输出结果: