/*问题描述 这是学C语言3个月的时候写的,如果有需要,我敲一份全排列给大家。都是新手很理解迷茫的感觉。欢迎大家评论
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*/
#include<stdio.h>
int found( int , int , int , int );
int highcheck( int [] , int , int , int );
int check( int [] , int );
int check_0( int );
int check_cf( int [] , int );
int lastcheck( int [] , int );
int main(void)
{
int N;
scanf("%d",&N);
int right,up,down;
printf("%d",found(N,right,up,down));
return 0;
}
int lastcheck( int rem[] , int cs )
{
int num = cs;
do
{
if( num % 10 == 0 )
{
return 1;
}
}
while( num /= 10 );
do
{
rem[cs % 10 - 1] ++;
}
while( cs /= 10 );
int i;
for( i = 0 ; i < 9 ; i ++ )
{
if( rem[i] != 1 )
{
return 1;
}
}
return 0;
}
int check_cf( int rem[] , int cs ) //检查重复
{
do
{
rem[cs % 10 - 1] ++;
}
while( cs /= 10 );
int i;
for( i = 0 ; i < 9 ; i ++ )
{
if( rem[i] > 1 )
{
return 1;
}
}
return 0;
}
int check_0( int num ) //有0的舍弃
{
do
{
if( num % 10 == 0 )
{
return 1;
}
}
while( num /= 10 );
return 0;
}
int check( int rem[] , int num )//站 1 2
{
int value = num;
if( check_0(num) )
{
return 1;
}
return check_cf(rem,value);
}
int highcheck( int rem[] , int y , int x , int s ) // 最后检查站
{
return check(rem,y) || check(rem,x) || lastcheck(rem,s);//前面两个在为最后一个的检查重复做准备
}
int found( int n , int y , int s , int x )//右 上 下
{
int count = 0;
for( y = 1 ; y < n ; y ++ )
{
int re[9] = {0};//站点1
if( check(re,y) )
{
continue;
}
for( x = 1 ; x < 5000 ; x ++ )
{
int r[9] = {0}; //站点2
if( check(r,x) )
{
continue;
}
s = ( n - y ) * x;
int rem[9] = {0}; //站点3 功能是 针对S数0项和重复,
if( highcheck(rem,y,x,s) )
{
continue;
}
// printf("%d = %d + %d / %d\n", n, y, s, x);
count ++;
}
}
return count;
}
带分数 新手必看
最新推荐文章于 2021-05-21 16:53:06 发布