/*------------------------------------------------------------------------------------------------------------------
标题:带分数
100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
例如:
用户输入:
100
程序输出:
11
再例如:
用户输入:
105
程序输出:
6
left=1时,down每调试到一定的数值后就返回了,不知道为什么,求大神帮忙看看
---------------------------------------------------------------------------------------------------------------------------*/
#include<stdio.h>
#include<math.h>
int check(int n);
int check_allHave();
int qiu_wei_shu(int n);
int flag[10]={0};
int main()
{
int N=0; // N=left+up/down
int left=0;
int up=0;
int down=0;
int count=0; //计数
int wei_shu_left=0;
int temp[10]={0};
scanf("%d",&N);
for(left = 1;left < N;left++){
if(check(left)) continue; //不合理
wei_shu_left = qiu_wei_shu(left);
for(int i = 0;i < 10;i++)
temp[i] = flag[i];
for(down = 1;down < pow(10,9-wei_shu_left-1);down++){ //down最多 9-wei_shu_left-1 位数
up = (N - left) * down;
for(int i = 0;i < 10;i++) //重置为left循环时的flag,为新一轮down做准备
flag[i] = temp[i];
if(check(down) || check(up))
continue; //不合理
else if(check_allHave() == 0)
count++;
}
}
printf("%d\n",count);
return 0;
}
int check(int n)
{
while(n){
flag[n%10]++;
n/=10;
}
if(flag[0]) return 1; //判断是否有0
for(int i = 1;i <= 9;i++){ //判断1~9是否重复
if(flag[i] > 1) return 1;
}
return 0;
}
int check_allHave() //最后判断1~9是否都包含了
{
for(int i = 1;i <= 9;i++){
if(flag[i] != 1)
return 1;
}
return 0;
}
int qiu_wei_shu(int n)
{
int wei_shu=0;
while(n){
n%10;
n/=10;
wei_shu++;
}
return wei_shu;
}