/*100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
例如:
用户输入:
100
程序输出:
11
再例如:
用户输入:
105
程序输出:
6
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
*/
//解法一
/*import java.util.Scanner;
public class 带分数
{
public static int kinds=0;
public static int n=10;
public static int a[]=new int[10];
public static boolean vis[]=new boolean[10];
public static int sum(int start,int end)
{
int sum=0;
for(int i=start;i<end;i++) sum=sum*10+a[i+1];
return sum;
}
static void check(int a[],int num)
{
int bit=0,temp=num;
while(temp!=0) {
bit++;
temp /= 10;
}
for(int k=1;k<=bit;k++)
{
int num1=sum(0,k);
if(num1>=num) return;
for(int j=k+(n-k)/2;j<n-1;j++)
{
int num2=sum(k,j);
int num3=sum(j,n-1);
if(num2>num3 && num2%num3==0 &&num==num1+num2/num3)
{
System.out.println(num+" = "+num1+"+"+num2+"/"+num3);
kinds++;
}
}
}
}
static void dfs(int start,int end,int num)
{
if(start==end)
{
check(a,num);
return;
}
else
{
for(int i=1;i<n;i++)//全排列
{
if(vis[i]) continue;
a[start]=i;
vis[i]=true;
dfs(start+1,n,num);
vis[i]=false;
}
}
}
public static void main(String[] args)
{
Scanner cin=new Scanner(System.in);
int num=cin.nextInt();
dfs(1,10,num);
System.out.println(kinds);
}
} */
//解法二
/*import java.util.Scanner;
public class 带分数 {
public static int kinds = 0;
public static int n = 10;
public static int[] m = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
public static int sum(int start, int end) {
int sum = 0;
for (int i = start; i < end; i++)
sum = sum * 10 + m[i + 1];
return sum;
}
static void check(int a[], int num) {
int bit = 0, temp = num;
while (temp != 0) {
bit++;
temp /= 10;
}
for (int k = 1; k <= bit; k++) {
int num1 = sum(0, k);
if (num1 >= num)
return;
for (int j = k + (n - k) / 2; j < n - 1; j++) {
int num2 = sum(k, j);
int num3 = sum(j, n - 1);
if (num2 > num3 && num2 % num3 == 0
&& num == num1 + num2 / num3) {
System.out.println(num + " = " + num1 + "+" + num2 + "/"
+ num3);
kinds++;
}
}
}
}
static void dfs(int start, int end, int num) {
if (start == end) {
check(m, num);
return;
} else {
for (int i = start; i < end; i++) {
int t = m[start]; // 交换元素
m[start] = m[i];
m[i] = t;
// 递归全排列
dfs(start + 1, end, num);
t = m[start]; // 还原元素
m[start] = m[i];
m[i] = t;
}
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int num = cin.nextInt();
dfs(1, 10, num);
System.out.println(kinds);
}
}*/
//解法三
import java.util.Scanner;
import java.util.*;
public class 带分数 {
public static int kinds = 0;
public static int n = 10;
public static int sum(int start, int end,List<Integer> lis) {
int sum = 0;
for (int i = start; i < end; i++)
sum = sum * 10 +lis.get(i+1);
return sum;
}
static void check(int num,List<Integer> lis) {
int bit = 0, temp = num;
while (temp != 0) {
bit++;
temp /= 10;
}
for (int k = 1; k <= bit; k++) {
int num1 = sum(0, k,lis);
if (num1 >= num)
return;
for (int j = k + (n - k) / 2; j < n - 1; j++) {
int num2 = sum(k, j,lis);
int num3 = sum(j, n-1 ,lis);
if (num2 > num3 && num2 % num3 == 0
&& num == num1 + num2 / num3) {
System.out.println(num + " = " + num1 + "+" + num2 + "/"
+ num3);
kinds++;
}
}
}
}
static void dfs(List<Integer> lis,int start, int end, int num) {
if (start == end) {
check(num, lis);
return;
} else {
for (int i = 1; i <= 9; i++) {
if (!lis.contains(i)) {
lis.set(start, i);
} else {
continue;
}
dfs(lis, start + 1, end,num);
lis.set(start, 0);
}
}
}
public static void main(String[] args) {
List<Integer> lis = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
lis.add(0); // 初始化为全0
}
Scanner cin = new Scanner(System.in);
int num = cin.nextInt();
dfs(lis,1, 10, num);
System.out.println(kinds);
}
}
带分数
最新推荐文章于 2024-05-06 21:25:00 发布
