试题 历届试题 带分数
试题 历届试题 带分数
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
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
直接全排列,然后在对数据进行分割判断
static int[] qp = {1,2,3,4,5,6,7,8,9};
//全排列函数
private static void fullPermutation(int k){
if (k==qp.length-1){
f();
}
for (int i = k; i < qp.length; i++) {
{int s = qp[k];
qp[k] = qp[i];
qp[i] = s;}
fullPermutation(k+1);
{ int s = qp[k];
qp[k] = qp[i];
qp[i] = s; }
}
}
我们设组成的三个数分别为 a,b,c
a:第一个整数
b:分子
c:分母
通过对题意的理解我们会发现a,b,c需要满足以下条件
a < n;
b%c==0;
由此我们可以推断出另外两个条件
b>c --> b和c至少占一位
所有 a最多由7个数组成
private static void f() {
int a = 0,b=0,c=0;//要组合出的三个数
//进行减少运算 当b>0;c>0则b,c至少占用一个数,a最多有7位,
for (int i = 0; i < qp.length-2; i++) {
a = 0;
for (int j = 0;j<=i;j++){
a=a*10+qp[j];
}
if (a>=n) return; //如果 a>=n了 直接结束
for (int j = i+1; j < qp.length-1; j++) {
b=0;c=0;
for (int k = i+1; k <= j; k++) {
b = b*10+qp[k];
}
for (int k = j+1; k < qp.length; k++) {
c = c*10+qp[k];
}
if (c>b||b%c!=0) continue;
if (a+b/c==n){
count++;
}
}
}
}
//完整代码
package com.zy.lanqiao;
import java.util.Scanner;
public class _带分数 {
static int[] qp = {1,2,3,4,5,6,7,8,9};
static int n; //输入n
static int count = 0; //种类数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
fullPermutation(0);
System.out.println(count);
}
private static void fullPermutation(int k){
if (k==qp.length-1){
f();
}
for (int i = k; i < qp.length; i++) {
{int s = qp[k];
qp[k] = qp[i];
qp[i] = s;}
fullPermutation(k+1);
{ int s = qp[k];
qp[k] = qp[i];
qp[i] = s; }
}
}
private static void f() {
int a = 0,b=0,c=0;//要组合出的三个数
//进行减少运算 当b>0;c>0则b,c至少占用一个数,a最多有7位,
for (int i = 0; i < qp.length-2; i++) {
a = 0;
for (int j = 0;j<=i;j++){
a=a*10+qp[j];
}
if (a>=n) return; //如果 a>=n了 直接结束
for (int j = i+1; j < qp.length-1; j++) {
b=0;c=0;
for (int k = i+1; k <= j; k++) {
b = b*10+qp[k];
}
for (int k = j+1; k < qp.length; k++) {
c = c*10+qp[k];
}
if (c>b||b%c!=0) continue;
if (a+b/c==n){
count++;
}
}
}
}
}