列表

详情


NC14353. 带分数

描述

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

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

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

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

输入描述

从标准输入读入一个正整数N (N<1000*1000)

输出描述

程序首先输出正整数N,然后在输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数n。
注意:不要求输出每个表示,只统计有多少表示法!
输出格式:N n

示例1

输入:

100

输出:

100 11

示例2

输入:

105

输出:

105 6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 97ms, 内存消耗: 544K, 提交时间: 2022-10-01 19:20:16

#include<iostream>
#include<algorithm>
using namespace std;
int num[9] = {1,2,3,4,5,6,7,8,9};

int lenof(int x){
    int len = 0;
    while(x){
        x/=10;
        len++;
    }
    return len;
}

int numof(int a,int b){
    int num_x=0;
    for(int i=a;i<=b;i++){
        num_x = num_x*10 + num[i];
    }
    return num_x;
}

int main()
{
    int n;
    cin >> n;
    int size = lenof(n);
    int sum=0,a,b,c;
    do{for(int i=0;i<=size;i++){
            for(int j=i+1;j<8;j++){
                a = numof(0,i);
                b = numof(i+1,j);
                c = numof(j+1,8);
                if((long long)(n*c) == (long long)(a*c+b)) sum++;
            }
        }
    }while(next_permutation(num,num+9));
    cout << n << " " << sum << endl;
    system("pause");
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 105ms, 内存消耗: 404K, 提交时间: 2020-07-09 17:04:45

#include<iostream>

using namespace std;
int num[10];
bool used[10];
int ans;
int n;
int calc(int l, int r){
    int res = 0;
    for(int i = l; i <= r; i++)
        res = res * 10 + num[i];
    return res;
}

void dfs(int v)
{


    if(v==10)
    for(int i=1;i<8;i++)
        for(int j=i+1;j<9;j++)
        {

            int a = calc(1, i);
                int b = calc(i + 1, j);
                int c = calc(j + 1, 9);
                //注意判断条件,因为C++中除法是整除,所以要转化为加减乘来计算
                if(a * c + b == c * n) ans++;
        }
    for(int i = 1; i <= 9; i++)
        if(!used[i]){
            used[i] = true; //标记使用
            num[v] = i;
            dfs(v + 1);
            used[i] = false; //还原现场
        }

}

int main()
{

cin>>n;


dfs(1);


cout<<n<<" "<<ans<<endl;

}

C++(clang++ 11.0.1) 解法, 执行用时: 357ms, 内存消耗: 416K, 提交时间: 2023-07-06 12:10:08

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,cnt;
int x, y, z;
int main() {
    cin >> n;
    cout<<n<<' ';
    string s = "123456789";
    do {
        for (int i = 1; i <= 7; i++) {
            x = stoi(s.substr(0,i));
            if (x > n)break;
            for (int j = i+1; j <= 8; j++) {
                y = stoi(s.substr(i, j - i));
                z = stoi(s.substr(j));
                if (x + y / z == n && y % z == 0) {
                    cnt++;
                }
            }
        }
    } while (next_permutation(s.begin(),s.end()));
    cout << cnt;
    return 0;
}

Python3 解法, 执行用时: 611ms, 内存消耗: 6588K, 提交时间: 2023-03-18 10:41:42

a = input('')
b= int(a)
x = 0
for i in range(1, int('9' * (6 - len(a)))):
    for n in range(1, b):
        c = str(n) + str((b - n) * i) + str(i)
        bj = 1
        for j in range(9):
            if str(j + 1) not in c:
                bj = 0
                break
        if bj == 1 and len(c) == 9:
            x += 1
print(a,x)

上一题