蓝桥杯——带分数

问题描述

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 <iostream>
#include <cstring>
using namespace std;
int vis[10];
int old[10];
int check(int x)
{
    do
    {
        int tmp = x % 10;
        if(tmp == 0)
        {
            return 0;
        }
        if(vis[tmp]!=0)
            return 0;
        vis[tmp]++;
    }
    while(x = x / 10);
    return 1;
}
int checkOk(void)
{
    if(vis[0] != 0)
    {
        return 0;
    }
    for(int i = 1; i < 10; i++)
    {
        if(vis[i] != 1)
        {
            return 0;
        }
    }
    return 1;
}
int main(void)
{
    int num;
    cin >> num;
    int left, up, down;
    int count = 0;
    for(left = 1; left < num; left++)
    {
        memset(vis, 0, sizeof(vis));
        if(!check(left))
        {
            continue;
        }
        for(down = 1; down < 10000; down++)
        {
            memcpy(old, vis, sizeof(vis));
            if(!check(down))
            {
                memcpy(vis, old, sizeof(vis));
                continue;
            }
            up = (num - left) * down;
            if(!check(up))
            {
                memcpy(vis, old, sizeof(vis));
                continue;
            }
            if(!checkOk())
            {
                memcpy(vis, old, sizeof(vis));
                continue;
            }
            memcpy(vis, old, sizeof(vis));
            //cout << left << " + " << up << " / " << down << endl;
            count++;
        }
    }
    cout << count << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xf_zhen/article/details/69230252
今日推荐