解决方案 »
- 这个范型调用为什么不对?
- 对于JTable(swing)比较了解的请进来帮忙一下!!!谢谢了,分数是其次........高人请进!!!
- 不同模块调用之间的数据库异常如何处理
- [救命]求助各位一个问题
- 请问如何用java来提取autocad图纸(dwg)的缩略图?
- 1+2!+3!+4!+......+N!这个算法怎么做啊?请高手帮忙,谢谢!
- socket连接的服务器端怎么控制Client的IP地址?
- 讨论:JXL、POI调用EXCEL模板实现web打印的问题?大家都关心的问题。
- 一个小问题,来者有分,在线等待。
- Java写模糊查询Object数组params如果拼参数
- web工程中的WebContent文件下的文件可以直接访问吗?
- myeclipse能用软件自带的JDK吗 自带的JDK有BUG吗
第二个问题
把经过第一个问题解决筛选出来的数字,在筛选出来的同时,把它的个位数字相加和30作比较,
至于如何得到一个数的每一位
public class test {
public static void main(String[] args) {
int s[] = new int[7];
int a = 1234567;
int i = 0, j = 0, k, m = 1, n;
k = a;
while (k != 0) {
k /= 10;
i++;
}
while (i != 0) {
n = i-1;
while (n != 0) {
m = 0;
m *= 10;
n--;
}
s[j] = a % 10;
System.out.print(s[j]);
a /= 10;
i--;
j++;
}
}
}这个程序是将一个数倒叙输出,你自己看着修改你的代码吧
public class NumberSelector { private final Map<Integer,List<String>> pickedCodes=new HashMap<Integer,List<String>>();
private final static int MaxDuplicateFlag=4;
private NumberSelector(){
}
private void init(){
System.out.println("组合初始化,时间较长,请耐心等待....");
//由于符合条件的数字组合是可以预知的,所以可以考虑从外部读取,而非每次计算
for(int i=1111111;i<10000000;i++){
String code=String.format("%07d", i);
if(calcMaxDuplicate(code)){
appendSumDigit(sumDigit(String.valueOf(i)),code);
}
if(code.endsWith("0000")){
System.out.println(i+"初始化完毕");
}
}
System.out.println("===组合初始化完毕===");
}
private void appendSumDigit(int key,String code){
if(!pickedCodes.containsKey(key)){
pickedCodes.put(key, new ArrayList<String>());
}
pickedCodes.get(key).add(code);
}
public List<String> getBySumDigit(int arg){
if(pickedCodes.containsKey(arg)){
return pickedCodes.get(arg);
}
return new ArrayList<String>();
}
private static NumberSelector instance=null;
private static Object instanceLock=new Object();
public static NumberSelector getInstance(){
if(instance==null){
synchronized (instanceLock) {
if(instance==null){
instance=new NumberSelector();
instance.init();
}
}
}
return instance;
} private static int sumDigit(String num){
int reuslt=0;
for(int i=0;i<num.length();i++){
reuslt+=Integer.parseInt(num.substring(i, i+1));
}
return reuslt;
}
private static boolean calcMaxDuplicate(String num){
int reuslt=0;
for(int i=0;i<num.length();i++){
String s=num.replaceAll(String.valueOf(i), "");
reuslt= Math.max(reuslt,num.length()-s.length());
if(reuslt>=MaxDuplicateFlag) return false;
}
return true;
}
}
2、调用代码
public static void demoNumberSelector(){
NumberSelector selector=NumberSelector.getInstance();
int input=30;
List<String> result=selector.getBySumDigit(input);
System.out.println("输入值:"+input+",共计"+result.size()+"个符合条件");
System.out.println("----前10个数字如下----");
for(int i=0;i<10;i++){
if(i<result.size()){
System.out.print(result.get(i)+",");
}
}
System.out.println();
System.out.println("-------------------");
}
private final Map<Integer,List<String>> pickedCodes=new HashMap<Integer,List<String>>();
private final static int MaxDuplicateFlag=4;
private NumberSelector(){
}
private void init(){
System.out.println("组合初始化,时间较长,请耐心等待....");
//由于符合条件的数字组合是可以预知的,所以可以考虑从外部读取,而非每次计算
for(int i=1111111;i<10000000;i++){
String code=String.format("%07d", i);
if(calcMaxDuplicate(code)){
appendSumDigit(sumDigit(String.valueOf(i)),code);
}
if(code.endsWith("0000")){
System.out.println(i+"初始化完毕");
}
}
System.out.println("===组合初始化完毕===");
}
private void appendSumDigit(int key,String code){
if(!pickedCodes.containsKey(key)){
pickedCodes.put(key, new ArrayList<String>());
}
pickedCodes.get(key).add(code);
}
public List<String> getBySumDigit(int arg){
if(pickedCodes.containsKey(arg)){
return pickedCodes.get(arg);
}
return new ArrayList<String>();
}
private static NumberSelector instance=null;
private static Object instanceLock=new Object();
public static NumberSelector getInstance(){
if(instance==null){
synchronized (instanceLock) {
if(instance==null){
instance=new NumberSelector();
instance.init();
}
}
}
return instance;
}
private static int sumDigit(String num){
int reuslt=0;
for(int i=0;i<num.length();i++){
reuslt+=Integer.parseInt(num.substring(i, i+1));
}
return reuslt;
}
private static boolean calcMaxDuplicate(String num){
int reuslt=0;
for(int i=0;i<num.length();i++){
String s=num.replaceAll(String.valueOf(i), "");
reuslt= Math.max(reuslt,num.length()-s.length());
if(reuslt>=MaxDuplicateFlag) return false;
}
return true;
}
public static void demoNumberSelector(){
NumberSelector selector=NumberSelector.getInstance();
int input=30;
List<String> result=selector.getBySumDigit(input);
System.out.println("输入值:"+input+",共计"+result.size()+"个符合条件");
System.out.println("----前10个数字如下----");
for(int i=0;i<10;i++){
if(i<result.size()){
System.out.print(result.get(i)+",");
}
}
System.out.println();
System.out.println("-------------------"); }
}
看看哪里问题。。
public class T {
public static void getAllDataNotNeed(){
String saveDataToString;
ArrayList<String> allDataNoNeed=new ArrayList();
for(int i=1111111;i<=1119999;i++){
int[] digitalMumber=new int[7];
int[] arr=new int[9];
saveDataToString=String.valueOf(i);
int count=0;
for(int j=0;j<saveDataToString.length();j++){
digitalMumber[j]=(int)saveDataToString.charAt(6-j)-48;
// you should care there
if(digitalMumber[j]!=0){
count++;
}
}
if(count!=7){
allDataNoNeed.add(saveDataToString);
}else{
for(int j=0;j<saveDataToString.length();j++){
arr[digitalMumber[j]-1]++;
if(arr[digitalMumber[j]-1]>2){
allDataNoNeed.add(saveDataToString);
break;
}
}
}
}
for(int k=0;k<allDataNoNeed.size();k++){
//System.out.println(1);
System.out.println(allDataNoNeed.get(k));
}
}
public static void getValueWanted(int valueWanted){
String saveDataToString;
for(int i=1111111;i<=1119999;i++){
int[] digitalMumber=new int[7];
int[] arr=new int[9];
saveDataToString=String.valueOf(i);
int sum=0;
int count=0;
for(int j=0;j<saveDataToString.length();j++){
digitalMumber[j]=(int)saveDataToString.charAt(6-j)-48;
// you should care there
if(digitalMumber[j]!=0){
count++;
}
}
if(count==7){
for(int j=0;j<saveDataToString.length();j++)
sum+=digitalMumber[j];
}
if(sum==valueWanted){
System.out.println("sum is "+valueWanted+" : "+saveDataToString);
}
}
}
public static void main(String[] args){
// String s="1231231";
// System.out.println((int)s.charAt(2)-48);
getAllDataNotNeed();
//输出所有不需要的组合
//因为需要的组合太多只能以相反的代替
getValueWanted(34);
//输入你想要得到的和值
}
}
上次回的贴并没用把问题解释清楚,这次把思路说一下,
1.把整数用String.valueOf()方法转化成字符串,转化成字符串以后(例如123转化成”123“,字符串第零位是1),用charAt方法转化成单个字符(不过这时候数据类型是char,int i=char(1),输出值为49,减去48变为int型变量。)这样就能实现对每一位的相加求和的目的。
2.继续利用1方法,不过多写一个数组int[] arr=new int[9],此数组用来保存1、2.9各数字重复出现的数字的次数。
例如arr[string.charAt[i]-1]++,意思为,这个字符串上的第i位(假设值为1)出现的次数在arr[1-1]保存,每出现一次,则加一。
* 采用正则表达式
*/
package des;import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class MatchesGui {
public static void main(String[] args) {
List list = new ArrayList<>();
for(int i=1111111;i<10000000;i++){
Pattern p=Pattern.compile("(\\w)\\1{3,}");
Matcher m=p.matcher(i+"");
if (!(m.find())) {
System.out.println(i);
list.add(i);
}
}
}
}