Java算法求水仙花数
题目打印出所有的“水仙花数”,所谓“水仙花数”是指2

printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);
}
}
}
}
❖ 题目:输入两个正整数m和n,求其最大公约数和最小 公倍数。
❖ 程序分析:利用辗除法
❖ GCD(A, B)=GCD(B, A%B)
❖ 当A%B==0时,B即为最大公约数
❖ GCD〔12,18〕=GCD〔18,12〕
#include “stdio.h〞
main()
{int max, next, n;
scanf(“%d〞,&next);
max=next;
/* 第一个数就是最大数 */
for (n=2;n<=10; n++) /* 输入另外的九个数,并依次 {scanf(“%d〞,&next); 比较出最大数 */
if (next>max) max=next; }
printf(“max=%d\n〞, max); /* 打印出最大数 */ }
问题:求出以“9999〞作为结束标志的一组整数的最大数。 例如输入:123 45 5678 34 9999 67 23456,输出结果为 5678,即对9999及其以后的数不作处理。
if (n%i==0) { flag=0; break; } if (flag==1) printf(“该数是素数〞〕;
else printf(“该数不是素数〞); }
❖ 猴子吃桃问题:猴子第一天摘下假设干个桃子,当即 吃了一半,还不瘾,又多吃了一个第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后每天早上都 吃了前一天剩下的一半零一个。到第10天早上想再吃 时,见只剩下一个桃子了。求第一天共摘了多少。
java习题

31、编写程序,利用循环控制语句输出如下数字金字塔图形。
老师3:发送第78份试卷
老师2:发送第77份试卷
老师3:发送第76份试卷
... ...
老师2:发送第1份试卷
/link?url=KMFDbF3z7BnHjFarK85i_30HstIyI98rVWRupXOPDP6DhXV-7HD5e8HOhqD3BMRS9lvU31L-lStKQdcgDMExmbp0lecBEgEmcfC1JIngqX_
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
32、编写程序,利用线程模拟一段时间内(3分钟)交通信号灯的运行状况,红灯亮10秒,绿灯亮30秒,黄灯亮3秒。
18、已知,s=1-1/2+1/3-1/4+…+1/(n-1)-1/n,编写程序,求n=100时,s的值。
19、利用面向对象知识,用Java语言编写圆类(Circle)和矩形类(Retangle)继承自形状类(Shape),计算周长和面积,并编写测试类测试完成测试。
20、输入某年某月某日,判断这一天是这一年的第几天。计算方法为:h =(q+[26(m+1)/10]+k+[k/4]+[j/4]+5*j)%7,各变量含义如下:(1)h是一个星期中的每一天(0为星期六;1为星期天;2为星期一;3为星期二;4为星期三;5为星期四;6为星期五)(2)q是某月的某一天(3)m是月份(3为三月,4为四月,...,12为十二月)。一月和二月分别记为上一年的13和14月。(4)j是世纪数(即|year/100|)(5)k是世纪的年数(即year%100)。
50道经典java题目

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
【程序38】
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
【程序39】
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
程序1】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
【程序20】
题目:有
一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
1.程序分析:请抓住分子与分母的变化规律。
【程序21】
【程序19】
题目:打印出如下图案(菱形)
*
***
******
********
******
***
*
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。
1.程序分析:(a> b)?a:b这是条件运算符的基本例子。
【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
【程ห้องสมุดไป่ตู้7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
JAVA经典小例子(一)

JAVA经典⼩例⼦(⼀)⽤for循环完成如下案例----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------求和public class ForCircle{public static void main(String[] args){int sum=0;int random=0;for(int i=1;i<=10;i++){random=(int)(Math.random()*100+1);sum +=random;System.out.println(random);}System.out.println("合为"+sum);System.out.println("平均值为"+sum/10.0);}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------求偶数和public class D{public static void main(String[] args){int sum=0;int random=0;for(int i=1;i<=10;i++){random=(int)(Math.random()*100+1);if(random % 2==0){sum +=random;System.out.println(random);}}System.out.println("合为"+sum);System.out.println("平均值为"+sum/10.0);}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------求奇数和public class D{public static void main(String[] args){int sum=0;int random=0;for(int i=1;i<=10;i++){random=(int)(Math.random()*100+1);if(random % 2!=0){sum +=random;System.out.println(random);}}System.out.println("合为"+sum);System.out.println("平均值为"+sum/10.0);}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------打印⽔仙花数public class D{public static void main(String[] args){for(int i=100 ;i<=999; i++){if( ((i%10)*(i%10)* (i%10)+(i/10%10)*(i/10%10)* (i/10%10)+(i/10/10)* (i/10/10)* (i/10/10) )==i){System.out.print("⽔仙花数:"+i+" , ");}}}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------统计⽔仙花数public class D{public static void main(String[] args){int count=0;for(int i=100 ;i<=999; i++){if( ((i%10)*(i%10)* (i%10)+(i/10%10)*(i/10%10)* (i/10%10)+(i/10/10)* (i/10/10)* (i/10/10) )==i){System.out.print("⽔仙花数:"+i+" , ");count++;}}System.out.print("⽔仙花数个数:"+count);}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------九九乘法表public class D{public static void main(String[] args){int count=0;for(int i=1 ;i<=9; i++){for(int j=1;j<=i;j++){System.out.print(j+"*"+i+"="+(i*j)+" ");}System.out.println();}}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------⽤while循环完成如下案例求和public class D{public static void main (String[] args){int i=1;int sum=0;while(i<=10){sum += (int)(Math.random()*100+1);i++;}System.out.println("和为:"+sum);}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------纸张折叠成珠穆朗玛峰⾼度的次数public class D{public static void main(String[] args){int num=0;int count=8848;int high=1;do{high = high*2;num++;}while(count>=high);System.out.print(num);}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------使⽤冒泡排序把随机⽣成的10个数从⼩到⼤排列public class D{public static void main (String[] args){int[] str = new int[10];for(int i = 0 ; i < 10 ; i ++){str[i] = (int)(Math.random()*100);}System.out.println("排序前");for(int q=0;q<str.length;q++){System.out.print(str[q]+" ");}System.out.println("");for(int x=0 ; x < str.length-1 ; x++){for(int y=0;y < str.length-x-1 ; y++ ){int temp;if (str[y]>=str[y+1]){temp=str[y+1];str[y+1]=str[y];str[y]=temp;}}}System.out.println("排序后");for(int w=0;w<str.length;w++){System.out.print(str[w]+" ");}}}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:银⾏登录业务逻辑事项//以下for实现import java.util.Scanner;public class ForCircle{public static void main(String[] args){ Scanner scan = new Scanner(System.in); int i=1; for(;i<=3;i++){ System.out.println("请输⼊密码:"); int pass = scan.nextInt(); if(pass == 123){ System.out.println("密码正确"); break; }else{ System.out.println("密码错误"); } } if(i == 4){ System.out.println("三次密码输⼊错误,请到银⾏办理吞卡业务"); } return ; }}//以下while实现import java.util.Scanner;public class ForCircle{public static void main(String[] args){Scanner scan = new Scanner(System.in);int count=1;while( true ){System.out.println("请输⼊密码:");int pass = scan.nextInt();if(pass == 123){System.out.println("密码正确");break;}else{System.out.println("密码错误,剩余"+(3-count)+"次");}count++;if(count==4){System.out.println("多次输⼊不正确,被吞卡");break;}}return ;}}嵌套循环实例:冒泡排序public class BubbleSort {public static void main (String[] args){int[] str = new int[10];for(int i = 0 ; i < 10 ; i ++){str[i] = (int)(Math.random()*100);}System.out.println("排序前");for(int q=0;q<str.length;q++){System.out.print(str[q]+" ");}System.out.println("");for(int x=0 ; x < str.length-1 ; x++){ for(int y=0;y < str.length-x-1 ; y++ ){ int temp;if (str[y]>=str[y+1]){temp=str[y+1];str[y+1]=str[y];str[y]=temp;}}}System.out.println("排序后");for(int w=0;w<str.length;w++){ System.out.print(str[w]+" ");}}}。
Java算法题

Java经典问题算法大全/*【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....*/package .flywater.FiftyAlgorthm;public class FirstRabbit {public static final int MONTH = 15;public static void main(String[] args) {long f1 = 1L, f2 = 1L;long f;for(int i=3; i<MONTH; i++) {f = f2;f2 = f1 + f2;f1 = f;System.out.print("第" + i +"个月的兔子对数: ");System.out.println(" " + f2);}}}/*【程序2】*题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
*/package .flywater.FiftyAlgorthm;public class SecondPrimeNumber {public static int count = 0;public static void main(String[] args) {for(int i=101;i<200;i++){boolean b = true;//默认此数就素数for(int j=2;j<=Math.sqrt(i);j++){if(i%j==0){b = false; //此数不是素数break;}}if(b){count++;System.out.print(i+" ");}}System.out.println("\n素数的个数:"+count);}}/*【程序3】题目:打印出所有的"水仙花数(narcissus number)",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
java小程序之水仙花数 (1)

水仙花数【实验目的】1.掌握Java程序的编译过程,以及Java程序面向对象的编写方法2.掌握类的定义与声明3.掌握对象的使用与创建4.掌握构造方法的格式及使用5.理解并熟练运用if else语句实现程序所要求的条件【实验原理】1.依次对一个三位数的每一位数的平方求和,百位数可通过除100取整得到,十位数可通过除10取整得到2.三位数中的最小数是101,最大数是999,所以水仙花数必然存在于101到999之间【实验要求】1.运用Java编写命令行程序2.编译、运行、调试、维护Java程序3.使用for循环结构4.熟练使用Eclipse调试工具进行程序调试【实验步骤】在101到1000之间任取一个数m,m除以100取整得到它的百位数a1,除以100取余再讲余数除以10取整得到它的十位数a2,除以10取余得到它的个位数,依次对这三个数a1,a2,a3的三次方求和,验证是否等于m,若相等,则m为水仙花数,打印出来;反之,则不是水仙花数,不用打印出来。
详细思路如下图所示:【问题与解决方法】问题: 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字 立方和等于该数本身。
例如: 153是一个"水仙花数",因为153=1的三次方+5 的三次方+3的三次方。
程序:package shuixianhuashu;import shuixianhuashu.shuixianhuashu;public class shuixianhuashu{static Boolean isSxh(int m){int a1,a2,a3;a1=m/100;a2=m%100/10;a3=m%10;if (m<3)return false ;else if ( (a1*a1*a1+a2*a2*a2+a3*a3*a3) ==(a1*100+a2*10+a3) )return true ;elsereturn false ;比较m 与 a1^3+a2^3+a3^3若相等,则为水仙花数,输入m}public static void main(String[] args){System.out.println("1000以内的水仙花数:");shuixianhuashu s = new shuixianhuashu();for(int i=101;i<1000;i++)if(s.isSxh(i))System.out.print(i+"\t");}}运行结果:1000以内的水仙花数:153 370 371 407【实验总结】学会了对于一个三位数进行每一位数的分离,同样的,对于任意一位多位数的每一位数也可以运用同样的方式求出。
java实验报告-
实验报告□实践报告□课程名称:Java语言程序设计实验、实践名称:Java语言基础、数组和字符串编程、Java面向对象程序设计、Java异常处理多线程编程、图形用户界面编程实验、实践地点:致向楼301专业班级:软件1531 学号:学生姓名:关玉芬指导教师:相洁2017 年1月8日实验一Java语言基础一、实验目的和要求(1) 通过实验,掌握Java语言程序设计的基本方法。
(2) 学会Java语言中标示符的命名、运算符和表达式的应用。
(3) 熟练地掌握Java程序流程控制语句的应用。
二、实验内容1.编写应用程序,计算100(含100)以内所有偶数的和。
2.“水仙花数”是指一个3位数,其个位、十位、百位上的数字的立方和等于该数本身,例如371=33+73+13,因此371是一个水仙花数。
编写程序,求所有的水仙花数。
3.编写一个程序,求1-100间的素数。
4. 有一函数:x (x<1)Y= 3x-2 (1≤x<10)4x (x≥10)写一程序,给定x值,输出y值。
5. 使用for循环语句,编写程序输出以下图案。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆6.编写程序,输出从公元1900年到2100年所有闰年的年号,每输出5个年号换一行。
判断年是否为闰年的条件是:①若年号可以被4整除,而不能被100整除,则是闰年;②若年号可以被400整除,也是闰年。
三、主要仪器设备使用的计算机惠普:硬件配置Win7、软件环境eclipse四、实验代码1. public class a1 {public static void main(String[] args) {int i,sum=0;for(i=0;i<=100;i++){if(i%2==0)sum+=i;}Syst}}2. public class a2 {public static void main(String[] args) {int i,a,b,c;for(i=100;i<=999;i++){a=i%10;b=(i-a)%100/10;c=(i-b*10-a)/100;if(i==a*a*a+b*b*b+c*c*c){}}}}3. public class a3 {public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=2;i<=100;i++) {boolean t = false;for(int j=2;j<i;j++){if(i%j==0){t=false;break;}else {t=true;}}4. public class a4 {public static void main(String[] args) {int i,j;for(i=1;i<=4;i++){for(j=1;j<=((-1)*i+4);j++)for(j=1;j<=(2*i-1);j++)☆");for(i=3;i>=1;i--){for(j=1;j<=((-1)*i+4);j++)for(j=1;j<=(2*i-1);j++)☆");5. import java.util.*;public class a5 {public static void main(String[] args) {Scanner x=new Scanner(System.in);int i=x.nextInt();x.close();}}6. package shiyan;public class a6 {public static void main(String[] args) {int i,j=0;for(i=1900;i<=2100;i++){if((i%4==0)&&(i%100!=0)||(i%400==0)){j++;if(j%5==0)else{五、实验结果1.2.3.4.5.6.六、讨论、心得初步掌握了Eclipse集成开发环境。
java实验报告-总结
实验报告□实践报告□课程名称:Java语言程序设计实验、实践名称:Java语言基础、数组和字符串编程、Java面向对象程序设计、Java异常处理多线程编程、图形用户界面编程实验、实践地点:致向楼301专业班级:软件1531 学号:2015006446学生姓名:关玉芬指导教师:相洁2017 年1月8日else System.out.print("输出结果为"+i*4);x.close();}}6. package shiyan;public class a6 {public static void main(String[] args) {int i,j=0;for(i=1900;i<=2100;i++){if((i%4==0)&&(i%100!=0)||(i%400==0)){ j++;if(j%5==0)System.out.println(i);else{System.out.print(i);System.out.print(" ");}}}}} 五、实验结果1.2.3.4.5.6.六、讨论、心得初步掌握了Eclipse集成开发环境。
掌握Java 基本数据类型、运算符与表达式、数组的使用方法,语法结构,掌握顺序结构、选择结构和循环结构语法的程序设计方法。
、对JA V A程序设计有初步的了解System.out.println("字符串的单词数为"+num);sr.close();}}五、实验结果1..2.3.六、实验心得通过本次实验掌握数组的声明、分配空间及初始化;理解多维数组(重点掌握二维);掌握String 类的特点及常用方法的使用;掌握StringBuffer 类的特点及常用方法的使用;掌握String 类和StringBuffer 类的区别;掌握equal 方法与==的区别;但是本次练习中,我也出现了一些错误,是由于知识上的失误和不小心犯下的低级错误,但是我努力改正。
java实验报告-总结
实验报告□实践报告□课程名称:Java语言程序设计实验、实践名称:Java语言基础、数组和字符串编程、Java面向对象程序设计、Java异常处理多线程编程、图形用户界面编程实验、实践地点:致向楼301专业班级:软件1531 学号:2015006446学生姓名:关玉芬指导教师:相洁2017 年1月8日else System.out.print("输出结果为"+i*4);x.close();}}6. package shiyan;public class a6 {public static void main(String[] args) {int i,j=0;for(i=1900;i<=2100;i++){if((i%4==0)&&(i%100!=0)||(i%400==0)){ j++;if(j%5==0)System.out.println(i);else{System.out.print(i);System.out.print(" ");}}}}} 五、实验结果1.2.3.4.5.6.六、讨论、心得初步掌握了Eclipse集成开发环境。
掌握Java 基本数据类型、运算符与表达式、数组的使用方法,语法结构,掌握顺序结构、选择结构和循环结构语法的程序设计方法。
、对JA V A程序设计有初步的了解System.out.println("字符串的单词数为"+num);sr.close();}}五、实验结果1..2.3.六、实验心得通过本次实验掌握数组的声明、分配空间及初始化;理解多维数组(重点掌握二维);掌握String 类的特点及常用方法的使用;掌握StringBuffer 类的特点及常用方法的使用;掌握String 类和StringBuffer 类的区别;掌握equal 方法与==的区别;但是本次练习中,我也出现了一些错误,是由于知识上的失误和不小心犯下的低级错误,但是我努力改正。
50道经典Java逻辑编程题
【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
【程序3】题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
【程序4】题目:将一个正整数分解质因数。
例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
【程序5】题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a> b)?a:b这是条件运算符的基本例子。
【程序6】题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
【程序7】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为'\n '.【程序8】题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.math.BigInteger;import java.util.Hashtable;public class Main {private static final int SIZE = 21;private int[] countArray = new int[10]; // 个数列表private int[] countSumArray = new int[10]; // 个数总数private BigInteger[] sumArray = new BigInteger[10];// 值总数private int offset = 0;// 浮标/*** 设置当前浮标对应的个数,个数的总数,值总数** @param num* 个数*/private void setValue(int num) {countArray[offset] = num;if (offset == 0) {countSumArray[offset] = num;sumArray[offset] = p(9 - offset).multiply(n(num));} else {countSumArray[offset] = countSumArray[offset - 1] + num;sumArray[offset] = sumArray[offset - 1].add(p(9 - offset).multiply(n(num)));}}/*** 检验当前数据是否匹配** @return*/private boolean checkPersentArray() {BigInteger minVal = sumArray[offset];// 当前已存在值BigInteger maxVal = sumArray[offset].add(p(9 - offset).multiply(n(SIZE - countSumArray[offset])));// 当前已存在值+可能存在的最大值// 最小值匹配if (pareTo(MAX) > 0) {return false;}// 最大值匹配if (pareTo(MIN) < 0) {return false;}String minStr = pareTo(MIN) > 0 ? minVal.toString() : MIN.toString();String maxStr = pareTo(MAX) < 0 ? maxVal.toString() : MAX.toString();// 找到最小值与最大值间首部相同的部分int[] sameCountArray = new int[10];for (int i = 0; i < SIZE; i++) {char c;if ((c = minStr.charAt(i)) == maxStr.charAt(i)) {sameCountArray[c - '0'] = sameCountArray[c - '0'] + 1;} else {break;}}// 判断如果相同部分有数据大于现在已记录的位数,返回falsefor (int i = 0; i <= offset; i++) {if (countArray[i] < sameCountArray[9 - i]) {return false;}}// 如果当前值的总数为SIZE位,那么判断该值是不是需要查找的值if (countSumArray[offset] == SIZE) {String sumStr = sumArray[offset].toString();BigInteger sum = ZERO;for (int i = 0; i < sumStr.length(); i++) {sum = sum.add(p(sumStr.charAt(i) - '0'));}return pareTo(sumArray[offset]) == 0;}return true;}/*** 退出循环,打印** @return*/private void success() {System.out.println("find a match number:" + sumArray[offset]);}/*** 将浮标指向下一位数** @return*/private void next() {offset++;setValue(SIZE - countSumArray[offset - 1]);}/**** 回退浮标,找到最近的浮标,并减一** @return*/private boolean back() {// 回退浮标,找到最近的浮标,并减一if (countArray[offset] == 0) {while (countArray[offset] == 0) {if (offset > 0) {offset--;} else {return true;}}}if (offset > 0) {setValue(countArray[offset] - 1);return false;} else {return true;}}/*** 测试程序** @param startValue* 测试匹配数中包含9的个数* @param startTime* 程序启动时间*/private void test(int startValue, long startTime) { // 设置9的个数offset = 0;setValue(startValue);while (true) {if (checkPersentArray()) {// 检查当前提交数据是否匹配// 匹配且总数正好为SIZE的位数,那么就是求解的值if (countSumArray[offset] == SIZE) {success();}// 总数不为SIZE,且当前值不在第10位(即不等于0)if (offset != 9) {next();continue;}// 总数不为SIZE,且当前值在第10位。
if (back()) {break;}} else {if (back()) {break;}}}System.out.println(Thread.currentThread() + " End,Spend time " + (System.currentTimeMillis() - startTime) / 1000 + "s");}/*** 主函数*/public static void main(String[] args) {final long startTime = System.currentTimeMillis();int s = SIZE > 9 ? 9 : SIZE;for (int i = 0; i <= s; i++) {// new Main().test(i, startTime);// 启动十个线程同时运算final int startValue = i;new Thread(new Runnable() {public void run() {new Main().test(startValue, startTime);}}).start();}}private static final BigInteger ZERO = new BigInteger("0");private static final BigInteger MIN;private static final BigInteger MAX;/*** 0-SIZE间的BigInteger*/private static final BigInteger n(int i) {return (BigInteger) ht.get("n_" + i);}/*** 0-9的次方的BigInteger*/private static final BigInteger p(int i) {return (BigInteger) ht.get("p_" + i);}/*** 用于缓存BigInteger数据,并初始化0-SIZE间的BigInteger和0-9的次方的BigInteger*/private static Hashtable<String, Object> ht = new Hashtable<String, Object>();static {int s = SIZE < 10 ? 10 : SIZE;for (int i = 0; i <= s; i++) {ht.put("n_" + i, new BigInteger(String.valueOf(i)));}for (int i = 0; i <= 10; i++) {ht.put("p_" + i, new BigInteger(String.valueOf(i)).pow(SIZE));}MIN = n(10).pow(SIZE - 1);MAX = n(10).pow(SIZE).subtract(n(1));}}。