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,否则按无效代码处理。
//分析暴力解法,无非是1-9全排列
//外加一个加号和除号的全部尝试
package testBlue;
import java.util.*;
import java.math.BigInteger;
public class Main{
//
//比起一般全排列的难点,除号和加号的位置
static int res;
public static void main(String[] args) {
StringBuffer a = new StringBuffer();
StringBuffer b = new StringBuffer();
for(int i=1;i<=9;i++){
a.append(i);
}
Scanner input = new Scanner(System.in);
res = input.nextInt();
Date start = new Date();
System.out.println(a.toString());
All(a,b);
System.out.println(count);
Date end = new Date();
System.out.println(end.getTime()-start.getTime());
}
public static int count =0;
public static void All(StringBuffer a,StringBuffer b){
if(a.length()==0){
symbol(b.toString());
}else{
for(int i=0;i<a.length();i++){
b.append(a.charAt(i));
a.deleteCharAt(i);
All(a,b);
a.insert(i,b.charAt(b.length()-1));
b.deleteCharAt(b.length()-1);
}
}
}
public static void symbol(String numstr){//模拟加号和除号的位置
for(int i=1;i<numstr.length()-1;i++){
for(int j=i+1;j<numstr.length();j++){
int addnum = Integer.parseInt(numstr.substring(0,i));
int fenzi = Integer.parseInt(numstr.substring(i,j));
int fenmu = Integer.parseInt(numstr.substring(j,numstr.length()));
if(fenzi%fenmu==0){
if(addnum+fenzi/fenmu==res){
count++;
}
}
}
}
}
}
613

被折叠的 条评论
为什么被折叠?



