蓝桥杯-带分数

                                    带分数

    100 可以表示为带分数的形式:100 = 3 + 69258 / 714

    还可以表示为:100 = 82 + 3546 / 197

    注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

    类似这样的带分数,100 有 11 种表示法。

题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!


例如:
用户输入:
100
程序输出:
11

再例如:
用户输入:
105
程序输出:
6

 1 #include<cstdio>
 2 #include<string.h>
 3 
 4 int diff(int i,int j,int k)//判断i j k中每位数字都不同(简单!!!!!!!!)
 5 {
 6     int a[10];
 7     memset(a,0,sizeof(a));
 8     int m;
 9     while(i)
10     {
11         m=i%10;
12         a[m]++;
13         if(a[m]>1)
14             return 0;
15         i/=10;
16     }
17     while(j)
18     {
19         m=j%10;
20         a[m]++;
21         if(a[m]>1)
22             return 0;
23         j/=10;
24     }
25     while(k)
26     {
27         m=k%10;
28         a[m]++;
29         if(a[m]>1)
30             return 0;
31         k/=10;
32     }
33     if(a[0]!=0)   //数字1~9,不能取0
34         return 0;
35     for(i=1;i<=9;i++)
36     {
37         if(a[i]==0)       //数字1~9分别出现且只出现一次
38             return 0;
39     }
40     return 1;
41 }
42 
43 int main()
44 {
45     int n,i,j,k;
46     int count=0;
47     scanf("%d",&n);
48     for(i=1;i<n;i++)//n-i>0
49     {
50         for(k=1;k<9999;k++)//i最少取1位,所以j和k最多取8位,因为j/k=整数,所以k不能比j大,k不能超过5位
51         {
52             if(i!=k)
53             {
54                 j=(n-i)*k;              // 原式100=82+3546/97
55                 if(diff(i,j,k))              //  n  i   j  k         所以j=(n-i)*k   只要推到这步就好做了
56                 {
57                     printf("%d=%d+%d/%d
",n,i,j,k);
58                     count++;
59                 }
60             }
61         }
62     }
63     printf("%d
",count);
64     return 0;
65 }
原文地址:https://www.cnblogs.com/youdiankun/p/3616724.html