2 baby00qi baby00qi 于 2016.03.14 00:06 提问

C语言 带分数问题 求大神帮忙看看
 /*------------------------------------------------------------------------------------------------------------------
标题:带分数
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;
}

4个回答

renlong0829
renlong0829   2016.03.14 00:47

带分数的概念不是这样的吧,分数部分必须是分子小于分母才对

baby00qi
baby00qi 不过题目中没有这项规定
接近 2 年之前 回复
renlong0829
renlong0829   2016.03.14 17:27

100真能分解成11组?我怎么只能得到4组?
105只有5组……

renlong0829
renlong0829 回复baby00qi: 你有这11组的分解值吗,我看看
接近 2 年之前 回复
baby00qi
baby00qi 是的,就是11组
接近 2 年之前 回复
renlong0829
renlong0829   2016.03.14 18:44

N = a+b/c

N = 100, a = 3, b = 69258, c= 714
>> N = 100, a = 81, b = 5643, c= 297
>> N = 100, a = 81, b = 7524, c= 396
>> N = 100, a = 82, b = 3546, c= 197

>> N =    105, a =     72, b =   6534, c=   198
>> N =    105, a =     87, b =   3456, c=   192
>> N =    105, a =     87, b =   9612, c=   534
>> N =    105, a =     92, b =   5681, c=   437
>> N =    105, a =     92, b =   6734, c=   518
renlong0829
renlong0829   2016.03.14 22:13
 N =    100, a =      3, b =  69258, c=   714
 N =    100, a =     81, b =   5643, c=   297
 N =    100, a =     81, b =   7524, c=   396
 N =    100, a =     82, b =   3546, c=   197
 N =    100, a =     91, b =   5742, c=   638
 N =    100, a =     91, b =   5823, c=   647
 N =    100, a =     91, b =   7524, c=   836
 N =    100, a =     94, b =   1578, c=   263
 N =    100, a =     96, b =   1428, c=   357
 N =    100, a =     96, b =   1752, c=   438
 N =    100, a =     96, b =   2148, c=   537

 N =    105, a =     72, b =   6534, c=   198
 N =    105, a =     87, b =   3456, c=   192
 N =    105, a =     87, b =   9612, c=   534
 N =    105, a =     92, b =   5681, c=   437
 N =    105, a =     92, b =   6734, c=   518
 N =    105, a =     98, b =   3647, c=   521
renlong0829
renlong0829 回复baby00qi: 说来听听
接近 2 年之前 回复
baby00qi
baby00qi 我已经知道我的代码哪里错了o( ̄▽ ̄)d
接近 2 年之前 回复
baby00qi
baby00qi 对呀,应该就是这些
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!