带分数 新手必看

/*问题描述  这是学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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值