• 蓝桥杯-带分数


    问题描述
    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
    

    解题分析:

    100 = 82 + 3546 / 197
    num = left + up / down

    分两步遍历,先遍历left,再遍历down,up = (num - left) * down

    然后再验证up是不是符合条件。

    注意到数字不允许重复,还不允许出现0,可以使用下面的函数检测,并返回当前数的长度


    int
    is_same_num(int num, int *len) { int i,t; do{ t = num %10; if(t == 0) { return TRUE; } table[t] ++; (*len) ++; }while(num /= 10); for(i = 1; i < 10; i++) { if(table[i] > 1) { return TRUE; } } return FALSE; }

    完整代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TRUE 1
    #define FALSE 0
    
    char table[10];
    char backup_table[10];
    int is_same_num(int num, int *len)
    {
        int i,t;
        do{
            t = num %10;
            if(t == 0)
            {
                return TRUE;
            }
            table[t] ++;
            (*len) ++;
        }while(num /= 10);
    
        for(i = 1; i < 10; i++)
        {
            if(table[i] > 1)
            {
                return TRUE;
            }
        }
    
        return FALSE;
    }
    
    int main()
    {
        int num,left,up,down,cnt = 0,len = 0;
        int backup;
        scanf("%d", &num);
        for(left = 1; left < num; left++)
        {
            len = 0;
            memset(table, 0, 10);
            if(is_same_num(left, &len))
            {
                continue;
            }
            backup = len;
            memcpy(backup_table, table, 10);
            for(down = 1; down < 1e5; down++)
            {
                len = 0;
                memcpy(table, backup_table, 10);
                if(is_same_num(down, &len))
                {
                    continue;
                }
                up = (num - left) * down;
    
                if(is_same_num(up, &len))
                {
                    continue;
                }
    
                if(len + backup == 9)
                {
                    cnt ++;
                    //printf("%d:%d = %d + %d/%d
    ", cnt, num, left, up, down);
                }
            }
        }
    
        printf("%d", cnt);
    
        return 0;
    }
    View Code
  • 相关阅读:
    java8 list 删除元素 简单版
    java8 list 删除元素 结构复杂版
    xshell 连接 centos 中的 vi 配色
    Redis 运行出错
    电脑清理秘籍 [ 精心总结 ]
    团队项目之后的反思
    团队项目心得 [ 感想 ]
    团队项目心得 [ 第二阶段项目总结 ]
    团队项目心得 [ 第一阶段项目总结 ]
    《创新者》读书笔记
  • 原文地址:https://www.cnblogs.com/icez/p/4181972.html
Copyright © 2020-2023  润新知