180813 补全没有的答案!
0、 数组排序大全[冒泡/选择/快速/插入]
1 packagecom.ftl;2
3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.util.ArrayList;7 importjava.util.Arrays;8 importjava.util.Collections;9 importjava.util.Iterator;10 importjava.util.List;11
12 /**
13 * 排序算法复习14 *@author小a玖拾柒15 * Date: 2018年8月18日16 * 【更多参考】https://blog.csdn.net/snow_5288/article/details/60140265
17 */
18
19 public classTest2018 {20
21 public static void main(String[] args) throwsIOException {22 BufferedReader br = new BufferedReader(newInputStreamReader(System.in));23 List l = null;24 System.out.println("[eg.]请输入数据,如:1,12,32,2,3");25 String input =br.readLine();26 //方案一: 多数排序
27 check(input);28 //方案二: 冒泡排序
29 check2(input);30 //方案三: 快速选择排序
31 check3(input);32 //方案四: 插入排序
33 check4(input);34 //方案五: 快速排序
35 check5(input);36 }37
38 //方案一: list排序:利用Collections工具类实现
39 public static voidcheck(String str){40 String[] s = str.split(",");41 int[] ch = new int[s.length];42 List list = new ArrayList();43 for(int i = 0; i < s.length; i++){44 ch[i] =Integer.parseInt(s[i]);45 list.add(ch[i]);46 }47 Collections.sort(list);48 System.out.println("【方案一】list排序 :" +list);49
50 }51 //方案二: 冒泡排序: 相邻2个数字比较,一次排序后最大/最小的数字排列最后
52 /**
53 * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。54 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。55 针对所有的元素重复以上的步骤,除了最后一个。56 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。57 冒泡排序需要n-1(i)趟冒泡,每趟冒泡需要比较n-1-i(j)次比较,总共的比较次数为(n-1)+(n-2)+……+1,58 所以冒泡排序算法最坏情况和平均复杂度是O(n²)。59 由于占用空间有限,冒泡排序的空间复杂度为O(1)。60 */
61 public static voidcheck2(String str){62 String[] s = str.split(",");63 int[] ch = new int[s.length];64 for(int i = 0; i < s.length; i++){65 ch[i] =Integer.parseInt(s[i]);66 }67 for(int i = 1; i < ch.length; i++){68 for(int j = 0; j < ch.length; j++){69 if(ch[i]
79 /**
80 * 是直观的排序,通过确定一个Key最大或最小值,再从带排序的的数中找出最大或最小的交换到对应位置。再选择次之81 * 双重循环时间复杂度为O(n^2)82 */
83 public static voidcheck3(String str){84 String[] s = str.split(",");85 int[] ch = new int[s.length];86 for(int i = 0; i < s.length; i++){87 ch[i] =Integer.parseInt(s[i]);88 }89 for(int i = 0; i < ch.length; i++){90 for(int j = i+1; j < ch.length ; j++){91 if(ch[i] >ch[j]){92 int tmp =ch[i];93 ch[i] =ch[j];94 ch[j] =tmp;95 }96 }97 }98 System.out.println("【方案三】选择排序后:" +Arrays.toString(ch));99 }100 //方案四: 插入排序:往前比较,如果当前数比前一个小则进行第二个循环操作,反之则直接进入下次外层循环101 //比冒泡更优秀一点,冒泡是无论大小都会继续比较,这里是如果当前数字比前面的小,交换位置[降序则反之即可]
102 public static voidcheck4(String str){103 String[] s = str.split(",");104 int[] ch = new int[s.length];105 for(int i = 0; i < s.length; i++){106 ch[i] =Integer.parseInt(s[i]);107 }108 for(int i = 1; i < ch.length; i++){109 int tmp =ch[i];110 //升序: 如果前面的数字比当前的tmp大,则交换位置
111 for(int j = i - 1; j >=0 && tmp < ch[j]; j--){112 ch[j+1] =ch[j];113 ch[j] =tmp;114 }115 }116 System.out.println("【方案四】插入排序后:" +Arrays.toString(ch));117 }118 //方案五:快速排序:选择一个基准,大于该值放在右侧,小于则放在左侧
119 /**
120 * 选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。121 一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。122 接着分别比较左右两边的序列,重复上述的循环。123 快速排序是一种快速的分而治之的算法,它是已知的最快的排序算法,其平均运行时间为O(N*1ogN) 。它的速度主要归功于一个非长紧凑的并且高度优化的内部循环。但是他也是一种不稳定的排序,当基准数选择的不合理的时候他的效率又会编程O(N*N)。124 快速排序的最好情况: 快速排序的最好情况是每次都划分后左右子序列的大小都相等,其运行的时间就为O(N*1ogN)。125 快速排序的最坏情况: 快速排序的最坏的情况就是当分组重复生成一个空序列的时候,这时候其运行时间就变为O(N*N)126 快速排序的时间复杂度为O(N*lgN),快速排序的空间复杂度为O(lgN).127 */
128 public static voidcheck5(String str){129 String[] s = str.split(",");130 int[] ch = new int[s.length];131 for(int i = 0; i < s.length; i++){132 ch[i] =Integer.parseInt(s[i]);133 }134 if(ch.length <=1) return;135 int start = 0;136 int end = ch.length-1;137 check5sort(ch, start, end);138 System.out.println("【方案五】快速排序后:" +Arrays.toString(ch));139 }140
141 public static void check5sort(int[] a,int low,inthigh){142 int start =low;143 int end =high;144 int key = a[low]; //设定基准为第一个数字
145
146
147 while(end>start){148 //从后往前比较
149 while(end>start&&a[end]>=key) //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
150 end--;151 if(a[end]<=key){152 int temp =a[end];153 a[end] =a[start];154 a[start] =temp;155 }156 //从前往后比较
157 while(end>start&&a[start]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
158 start++;159 if(a[start]>=key){160 int temp =a[start];161 a[start] =a[end];162 a[end] =temp;163 }164 //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
165 }166 //递归
167 if(start>low) check5sort(a,low,start-1); //左边序列。第一个索引位置到关键值索引-1
168 if(end
169 }170 }
View Code
0、 实现会员注册,要求用户名长度不小于3,密码长度不小于6,注册时两次输入密码必须相同
1 packagecom.ftl;2
3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6
7
8 //实现会员注册,要求用户名长度不小于3,密码长度不小于6,注册时两次输入密码必须相同
9
10 public classTest2018 {11 public static voidmain(String[] args) {12 Boolean flag = true;13 while(flag){14 try{15 System.out.println("请输入姓名:");16 String name = new BufferedReader(newInputStreamReader(System.in)).readLine();17 if(name == null || "".equals(name)){18 System.out.println("输入为空,请重新输入!");19 continue;20 }21 if(name.length() < 3){22 System.out.println("输入用户名长度不得小于3,请重新输入!");23 continue;24 }25 System.out.println("请输入密码:");26 String passwd = new BufferedReader(newInputStreamReader(System.in)).readLine();27 if(passwd == null || "".equals(passwd)){28 System.out.println("输入为空,请重新输入!");29 continue;30 }31 if(passwd.length() < 6){32 System.out.println("输入密码长度不得小于6,请重新输入!");33 continue;34 }35 System.out.println("请再次输入密码:");36 String passwd2 = new BufferedReader(newInputStreamReader(System.in)).readLine();37 if(passwd2 == null || "".equals(passwd2)){38 System.out.println("输入为空,请重新输入!");39 continue;40 }41 if(passwd.length() == passwd2.length() &&passwd.equals(passwd2)){42 System.out.println("注册成功,欢迎您!");43 flag = false;44 break;45 }else{46 System.out.println("2次输入的密码不一致,请重新注册!");47 continue;48 }49
50 } catch(IOException e) {51 //TODO Auto-generated catch block
52 e.printStackTrace();53 }54 }55
56 }57 }
View Code
1、 一个景区根据游人的年龄收取不同价格的门票。请编写游人类,根据年龄段决定能够购买的门票价格并输出,然后写出测试类测试该类
1 packagecom.ftl;2
3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.util.ArrayList;7 importjava.util.List;8
9 //实现会员注册,要求用户名长度不小于3,密码长度不小于6,注册时两次输入密码必须相同
10
11 public classTest2018 {12 public static voidmain(String[] args) {13 Boolean flag = true;14 String name = null;15 String info = null;16 List list = new ArrayList<>();17 int price = 120;18 int age = 0;19
20 while(flag) {21 try{22 System.out.println("请输入游客的姓名:");23 name = new BufferedReader(newInputStreamReader(System.in)).readLine();24 if (name == null || "".equals(name)) {25 System.out.println("输入为空,请重新输入!");26 continue;27 }28 System.out.println("请输入游客的年龄:");29 age = Integer.parseInt(new BufferedReader(newInputStreamReader(System.in)).readLine());30 if (age < 0 || age > 100) {31 System.out.println("输入错误,请从新输入");32 continue;33 }34 info = "游客信息: 姓名[" + name + "]" + ", age[" + age + "]";35 if(age < 18){36 int pri = price / 2;37 info = info + ",门票:" +pri;38 }else if(age < 60){39 int pri =price;40 info = info + ",门票:" +pri;41 }else{42 info = info + ",门票:" + "免费";43 }44 list.add(info);45 System.out.println("是否继续售票[Y/N] ?");46 String con = new BufferedReader(newInputStreamReader(System.in)).readLine();47 if(con.toUpperCase().equals("Y") || con.equals("Y")){48 flag = true;49 }else{50 flag = false;51 for(String string : list) {52 System.out.println(string);53 System.out.println("------------------------------");54 }55 }56 } catch(IOException e) {57 e.printStackTrace();58 }59
60 }61
62 }63 }
View Code
2、 编写一个Java程序,用if-else语句判断某年份是否为闰年
1 //Programme Name LeapYear.java
2
3 public classLeapYear{4
5 public static voidmain(String args[]){6
7 int year=2010;8
9 if(args.length!=0)10
11 year=Integer.parseInt(args[0]);12
13 if((year%4==0 && year%100!=0)||(year%400==0))14
15 System.out.println(year+" 年是闰年。");16
17 else
18
19 System.out.println(year+" 年不是闰年。");20
21 }22
23 }//if-else语句
View Code
3、编写一个Java程序在屏幕上输出1!+2!+3!+……+10!的和
1 public classForTest {2
3 public static voidmain( String args[] ) {4
5 int i,j,mul,sum=0;6
7 for(i=1;i<=10;i++) {8
9 mul=1;10
11 for(j=1,j<=i;j++) {12
13 mul=mul*j;14
15 }16
17 sum=sum+mul;18
19 }20
21 System.out.println(“1!+2!+3!+……+10!= ”+sum);22
23 }24
25 }
View Code
5、编写一个Java应用程序,从键盘读取用户输入两个字符串,并重载3个函数分别实现这两个字符串的拼接、整数相加和浮点数相加。要进行异常处理,对输入的不符合要求的字符串提示给用户,不能使程序崩溃
1 import java.io.*;2
3 public classStrinput4
5 {6
7 public static voidmain(String args[]) {8
9 String s1,s2,ss,si,sf;10
11 inti1,i2;12
13 floatf1,f2;14
15 BufferedReader strin=new BufferedReader(newInputStreamReader(System.in));16
17 try{System.out.print ("输入第一个字符串:");18
19 s1=strin.readLine();20
21 System.out.print ("输入第二个字符串:");22
23 s2=strin.readLine();}24
25 catch(Exception e){ System.out.println(e.getMessage());}26
27 i1 =Integer.parseInt(s1);28
29 i2 =Integer.parseInt(s2);30
31 f1 =Float.parseFloat(s1);32
33 f2 =Float.parseFloat(s2);34
35 ss =strAdd(s1,s2);36
37 si =strAdd(i1,i2);38
39 sf =strAdd(f1,f2);40
41 System.out.println ("输入的二个字符串相加结果为:"+ss );42
43 System.out.println ("输入字符串转换为整数相加结果为:"+si );44
45 System.out.println ("输入字符串转换为浮点数相加结果为:"+sf );46
47 }48
49 String strAdd(String str1,String str2) {50
51 return str1+str2;52
53 }54
55 String strAdd(int int1,intint2) {56
57 return String.valueOf(int1+int2);58
59 }60
61 String strAdd(float flt1,floatflt2) {62
63 return String.valueOf (flt1+flt2);64
65 }66
67 }
View Code
6. 应用FileInputStream类,编写应用程序,从磁盘上读取一个Java程序,并将源程序代码显示在屏幕上。(被读取的文件路径为:E:/myjava/Hello.java)
1 import java.io.*;2
3 public classFISDemo {4
5 public static voidmain(String args[]) {6
7 byte[] buf=new byte[2056];8
9 try{10
11 FileInputStream fileIn=new FileInputStream("e:/myjava/Hello.java");12
13 int bytes=fileIn.read(buf,0,2056);14
15 String str=new String(buf,0,bytes);16
17 System.out.println(str);18
19 }catch(Exception e){20
21 e.printStackTrace( );22
23 }24
25 }
View Code
7、编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上
1 import java.io.*;2
3 public classIODemo {4
5 public static voidmain( String args[] ) {6
7 int data[] = {100,101,102,103,104,105};8
9 intt;10
11 try
12
13 { DataOutputStream out = new DataOutputStream (newFileOutputStream(“dest.txt”));14
15 for(int i=0;i
17 out.WriteInt(data[i]);18
19 out.close();20
21 DataInputStream in = new DataInputStream (newFileInputStream(“dest.txt”));22
23 for(int i= data.length-1;i>= 0;i--) {24
25 t=in.readInt(data[i]);26
27 System.out.print(“ ”+t);28
29 }30
31 System.out.println( );32
33 in.close();34
35 }catch(IOException e)36
37 { System.out.println(e.getMessage());}38
39 }40
41 }
View Code
9、编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次。
1 //声明一个子线程类Threaddemo;
2
3 class ThreadDemo extendsThread {4
5 publicThreadDemo(String str) {6
7 super(str);8
9 }10
11 public voidrun() {12
13 for(int i=0;i<20;i++){14
15 System.out.print(“ ”+this.getName());16
17 Try {18
19 Sleep(300);20
21 }catch(InterruptedException e){22
23 System.out.println(e.getMessage());24
25 Return;26
27 }28
29 }30
31 System.out.println(“ /end”);32
33 }34
35 }36
37 public classTestThread {38
39 public static voidmain( String args[] ) {40
41 ThreadDemo thread1=newThreadDemo(“T1”);42
43 ThreadDemo thread2=newThreadDemo(“T2”);44
45 ThreadDemo thread3=newThreadDemo(“T3”);46
47 thread1.start();48
49 thread2.start();50
51 thread3.start();52
53 }54 }
View Code
10. 编写程序,在屏幕上显示带标题的窗口,并添加一个按钮。当用户单击按钮时,结束程序。
1 import javax.swing.*;2
3 import java.awt.event.*;4
5 public class ButtonEventDemo extends JPanel implementsActionListener{6
7 protected JButton b1; //声明一个按钮对象
8
9 public ButtonEventDemo() { //构造方法
10
11 ImageIcon ButtonIcon = new ImageIcon("images/green.png"); //创建按钮的图标对象
12
13 b1 = new JButton("退出按钮", ButtonIcon); //生成按钮对象
14
15 b1.setMnemonic(KeyEvent.VK_E); //设置b1的助记符是Alt+E
16
17 b1.setToolTipText("这是退出按钮。"); //设置按钮提示条
18
19 this.add(b1); //往面板对象中加载按钮
20
21 b1.addActionListener(this); //本类对象注册为按钮的事件监听器
22
23 }24
25 public void actionPerformed(ActionEvent e){ //按钮事件响应方法
26
27 System.exit(0); //按b1则退出主程序
28
29 }30
31 private static void createGUI() { //创建窗体
32
33 JFrame.setDefaultLookAndFeelDecorated(true); //设置java隐含观感
34
35 JFrame frame = new JFrame("按钮测试"); //生成应用程序主窗体
36
37 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭时隐含操作
38
39 ButtonEventDemo CPane = new ButtonEventDemo(); //生成主类对象--面板
40
41 CPane.setOpaque(true); //面板要求不透明
42
43 frame.setContentPane(CPane); //设置主类对象为主窗体的内容面板
44
45 frame.pack(); //主窗体紧缩显示
46
47 frame.setVisible(true); //设置主窗体可见
48
49 }50
51 public static void main(String[] args) { //将createGUI()列入线程
52
53 javax.swing.SwingUtilities.invokeLater(newRunnable() {54
55 public voidrun() {56
57 createGUI();58
59 }60
61 });62
63 }64
65 }
View Code
11、定义一个表示学生信息的类Student,要求如下:
(1)类Student的成员变量:
sNO 表示学号;sName表示姓名;sSex表示性别;sAge表示年龄;sJava:表示Java课程成绩。
(2)类Student带参数的构造方法:
在构造方法中通过形参完成对成员变量的赋值操作。
(3)类Student的方法成员:
getNo():获得学号;
getName():获得姓名;
getSex():获得性别;
getAge()获得年龄;
getJava():获得Java 课程成绩
(4)根据类Student的定义,创建五个该类的对象,输出每个学生的信息,计算并输出这五个学生Java语言成绩的平均值,以及计算并输出他们Java语言成绩的最大值和最小值。
1 public classStudent {2
3 String sNO,sName,sSex;4
5 intsAge,sJava;6
7 public Student(String XH,String XM,String XB,int NL,intXF) {8
9 super();10
11 sNO=XH;12
13 sName=XM;14
15 sSex=XB;16
17 sAge=NL;18
19 sJava=XF;20
21 }22
23 publicString getNO() {24
25 returnsNO;26
27 }28
29 publicString getName() {30
31 returnsName;32
33 }34
35 publicString getSex() {36
37 returnsSex;38
39 }40
41 public intgetAge() {42
43 returnsAge;44
45 }46
47 public intgetJava() {48
49 returnsJava;50
51 }52
53 public static voidmain(String[] args) {54
55 Student[] st=new Student[5];56
57 st[0]=new Student("09zc01","张三","男",19,94);58
59 st[1]=new Student("09zc02","李四","男",20,85);60
61 st[2]=new Student("09zc03","王五","女",18,96);62
63 st[3]=new Student("09zc04","赵六","男",17,90);64
65 st[4]=new Student("09zc05","杨七","女",21,88);66
67 int max=0,min=100,sum=0;68
69 System.out.println(" 学生信息:");70
71 for (int i=0;i
73 if (st[i].sJava
75 min=st[i].sJava;76
77 if (st[i].sJava >max)78
79 max=st[i].sJava;80
81 sum=sum+st[i].sJava;82
83 System.out.println("学生编号:"+st[i].getNO()+", 姓名:"+st[i].getName()+", 性别:"+st[i].getSex()+", 年龄:"+st[i].getAge()+", Java课学分:"+st[i].getJava());84
85 }86
87 System.out.println();88
89 System.out.println(" 共有学生:"+st.length+", 平均成绩:"+sum/st.length);90
91 System.out.println(" 最小学分:"+min+", 最大学分:"+max);92
93 }94
95 }
View Code
12. 100~200内的素数判断
1 packagecom.ftl;2
3 importjava.util.ArrayList;4 importjava.util.List;5 /**
6 判断101-200之间有多少个素数,并输出所有素数。7 *1.程序分析:判断素数的方法:用一个数分别去除2~sqrt(n)或者2~n/2,常用2~n/2,8 *因为一个数的一半的平方大于其本身是从5开始的,解方程:n/2的平方>n .如果能被整除【取余运算】,9 *则表明此数不是素数,反之是素数。10 *11 *@author小a玖拾柒12 * Date: 2018年8月18日13 *14 */
15 public classTest2018 {16 public static voidmain(String[] args) {17 List list = new ArrayList();18 for(int i = 100; i < 200; i++){19 if(isPrimeNumber(i)){20 list.add(i);21 }22 }23 System.out.println("100~200 共有" + list.size() + "个数字");24 System.out.println(list);25 }26 public static boolean isPrimeNumber(intnum){27 boolean flag = true;28 if(num == 2) returnflag;29 for(int i = 2; i <= num/2; i++){30 if(num % i == 0){31 flag = false;32 returnflag;33 }34 }35 returnflag;36 }37 }
View Code
13. 水仙花问题
1 packagecom.ftl;2
3 importjava.util.ArrayList;4 importjava.util.List;5 /**
6 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:7 153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。8 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。9 *10 *@author小a玖拾柒11 * Date: 2018年8月18日12 *13 */
14 public classTest2018 {15 public static voidmain(String[] args) {16 //方案一
17 List list = new ArrayList();18 for(int i = 100; i < 999; i++){19 if(i ==isPrimeNumber(i)){20 list.add(i);21 }22 }23 System.out.println("【方案一】100~999 共有" + list.size() + "个水仙花");24 System.out.println(list);25 System.out.println("-------------------------------------------");26 //方案二:
27 List list2 = new ArrayList();28 for(int i = 100; i < 999; i++){29 if(i ==isPrimeNumber2(i)){30 list2.add(i);31 }32 }33 System.out.println("【方案二】100~999 共有" + list2.size() + "个水仙花");34 System.out.println(list2);35 System.out.println("-------------------------------------------");36 //方案三:
37 List list3 = new ArrayList();38 for(int i = 100; i < 999; i++){39 if(i ==isPrimeNumber2(i)){40 list3.add(i);41 }42 }43 System.out.println("【方案三】100~999 共有" + list3.size() + "个水仙花");44 System.out.println(list2);45 }46 //方案一: 直接拆分数字
47 public static int isPrimeNumber(intnum){48 int sum = 0;49 int bai = num / 100;50 int shi = num /10 % 10;51 int ge = num % 10;52 sum = (int) (Math.pow(bai, 3) + Math.pow(shi, 3) + Math.pow(ge, 3));53 returnsum;54 }55 //方案二: 利用String来切割数字
56 public static int isPrimeNumber2(intnum){57 String sth =String.valueOf(num);58 int sum = 0;59 int bai = Integer.parseInt(String.valueOf(sth.charAt(0)));60 int shi = Integer.parseInt(String.valueOf(sth.charAt(1)));61 int ge = Integer.parseInt(String.valueOf(sth.charAt(2)));62 sum = (int) (Math.pow(bai, 3) + Math.pow(shi, 3) + Math.pow(ge, 3));63 //System.out.println("百" + bai + "十" + shi + "个" + ge);
64 returnsum;65 }66 //方案三: 数字计算的优化
67 public static int isPrimeNumber3(intnum){68 String sth =String.valueOf(num);69 int sum = 0;70 for(int i = 0; i < sth.length(); i++){71 sum += Math.pow(Integer.parseInt(String.valueOf(sth.charAt(i))), 3);72 }73 //System.out.println("百" + bai + "十" + shi + "个" + ge);
74 returnsum;75 }76 }
View Code
14.分解质因数
1 packagecom.ftl;2
3 importjava.util.ArrayList;4 importjava.util.List;5 /**
6 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。7 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:8 (1)运用两层循环。9 (2)外循环得到2~n之间的所有质数,内循环将n循环除以质数,知道不能整除。10 (3)要是内循环n等于1了就说明n被完全整除了。11 *12 *@author小a玖拾柒13 * Date: 2018年8月18日14 *15 */
16 public classTest2018 {17 public static voidmain(String[] args) {18 check(180);19 }20
21 public static boolean isPrimeNumber(intn){22 if(n == 2) return true;23 for(int i=2; i<=n/2; i++){24 if(n % i == 0) return false;25 }26 return true;27 }28 public static void check(intnum){29 StringBuffer sb = newStringBuffer();30 sb.append(num+"=");31 //这里一定是小于等于,耗时30mins+
32 for(int i = 2; i <= num; i++){33 //System.out.print("质数:" + i+"\t");
34 if(isPrimeNumber(i)){35 while(num%i==0){36 sb.append(i);37 num = num /i;38 if(num == 1) break;39 sb.append("*");40 }41 }else{42 continue;43 }44 }45 System.out.println("\n" +sb);46 }47 }
View Code
15. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字
1 packagecom.ftl;2
3 importjava.util.Scanner;4 /**
5 * 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。6 * 2 = 2 * 10^07 * 22 = 2 * 10^1 + 28 * 222= 2 * 10^2 + 229 *@author小a玖拾柒10 * Date: 2018年8月18日11 *12 */
13
14 public classTest2018 {15 public static voidmain(String[] args) {16 int n = 0; //中间
17 int num = 0; //键盘输入的数字
18 int sum = 0; //求和
19 int fac = 0; //中间值
20 int roate = 0; //循环次数
21 boolean flag = true;22 while(flag){23 Scanner scan = newScanner(System.in);24 System.out.println("请输入一个数组[0-9]:");25 num =scan.nextInt();26 if(num < 0 || num > 9){27 System.out.println("输入错误,请重新输入");28 continue;29 }30 System.out.println("请输入循环次数[10以内]:");31 roate =scan.nextInt();32 if(roate >= 10 || roate <=0){33 System.out.println("输入错误,请重新输入");34 continue;35 }36 flag = false;37 }38 StringBuffer sb = newStringBuffer();39 for(int j = 0; j < roate; j++){40 n = (int)Math.pow(10, j) *num;41 fac +=n;42 sb.append(fac).append("+");43 sum +=fac;44 }45 System.out.println(sum + "=" + sb.substring(0, sb.length()-1));46 }47 }
View Code
16. 求完数,数字=因子之和
1 packagecom.ftl;2
3 importjava.util.Scanner;4 /**
5 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。6 *@author小a玖拾柒7 * Date: 2018年8月18日8 *9 */
10
11 public classTest2018 {12 public static voidmain(String[] args) {13 for(int i=1; i<1000; i++){14 if(isWanShu(i)){15 System.out.print(i + ",");16 }17 }18 }19
20 private static boolean isWanShu(inta) {21 int cup = 0;22 for(int i=1; i
View Code
17. 弹球高度计算
1 packagecom.ftl;2
3 importjava.util.Scanner;4 /**
5 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?6 1 1007 2 508 3 259 4 12.510 5 6.2511 6 3.12512
13 *@author小a玖拾柒14 * Date: 2018年8月18日15 *16 */
17
18 public classTest2018 {19 public static voidmain(String[] args) {20 //方案一: 直接计算
21 int sum = 0;22 double height= 100;23 for(int i = 2; i < 11 ; i++){24 //因为第一次是100米,第二次50米,
25 sum +=height;26 height = height/2;27 }28 System.out.println("第十次:" +height);29 System.out.println("总路程:" +sum);30
31 //方案二: 递归解决
32 System.out.println(height(100, 10));33
34 }35
36 public static double height(double h, intn){37 if(n==2) return h/2;38 else return height(h/2,n-1);39 }40 }
View Code
18. 排列组合[互不相同且无重复数字的三位数]
1 packagecom.ftl;2
3 importjava.util.List;4 importjava.util.Vector;5 /**
6 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?7
8 *@author小a玖拾柒9 * Date: 2018年8月18日10 *11 */
12
13 public classTest2018 {14 public static voidmain(String[] args) {15 int[] arr = {1,2,3,4};16 int tmp = 0;17 List list = new Vector<>();18 for(int i = 0; i < 4; i++){19 for(int j = 0; j < 4; j++){20 if(arr[i] !=arr[j]){21 for(int k = 0; k < 4; k++){22 if(arr[i] != arr[k] && arr[j] !=arr[k]){23 tmp = 100 * arr[i] + 10 * arr[j] +arr[k];24 list.add(tmp);25 }26 }27 }28 }29 }30 System.out.println("共有:" +list.size());31 for(int i = 0; i < list.size(); i++){32 if(i % 7 != 0){33 System.out.print(list.get(i) + "\t");34 }else{35 System.out.println();36 }37 }38 }39 }
View Code
19. 完全平方数
1 packagecom.ftl;2
3 /**
4 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?5 1. 任何数对1取余数都是06
7 *@author小a玖拾柒8 * Date: 2018年8月18日9 *10 */
11
12 public classTest2018 {13 public static voidmain(String[] args) {14
15 for(int i = 0; i < 1000; i++){16 if(Math.sqrt(i + 100) % 1 == 0 && Math.sqrt(i + 268) % 1 == 0){17 System.out.println(i);18 }19 }20 }21 }
View Code
20. 输出9*9口诀
1 packagecom.ftl;2
3 /**
4 * 输出9*9口诀5 *@author小a玖拾柒6 * Date: 2018年8月18日7 */
8
9 public classTest2018 {10
11 public static voidmain(String[] args) {12 for(int i = 1; i <=9; i++){13 for(int j = 1; j <=i; j++){14 System.out.print(i + "*" + j + "=" + (i * j)+"\t");15 }16 System.out.println();17 }18 }19 }
View Code
21. 猴子偷桃
1 packagecom.ftl;2
3 /**
4 *猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。5 *以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。6 1.程序分析:采取逆向思维的方法,从后往前推断(递归)7 day1: 18 day2: (1+1)*2 = 49 day3: (4+1)*2 = 1010 day4: (10+1)*2 = 2211 day5: (22+1)*2 = 4612 *@author小a玖拾柒13 * Date: 2018年8月18日14 */
15
16 public classTest2018 {17
18 public static voidmain(String[] args) {19 //方案一: 循环解决
20 int n = 1;21 int sum = 1;22 for(int i = 2; i <= 5; i++){23 n = ( n + 1 ) * 2;24 }25 System.out.println("方案一:" +n);26 //方案二: 递归
27 System.out.println("方案二:" + getNum(5));28 }29
30 public static int getNum(intd){31 int sum = 0;32 if(d==1) return 1;33 //这里实际上就是题目说的,前一天的量吃完一半后还余一个的算法
34 else return (getNum(d-1) + 1) * 2;35
36 }37
38
39 }
View Code
22. 乒乓球比赛名单
1 packagecom.ftl;2
3 /**
4 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。5 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。6 *@author小a玖拾柒7 * Date: 2018年8月18日8 */
9
10 public classTest2018 {11
12 public static voidmain(String[] args) {13 char[] a = {'a', 'b', 'c'};14 char[] b = {'x', 'y', 'z'};15 //方案一:
16 for(int i = 0; i < 3; i++){17 for(int j = 0; j < 3; j++){18 if(a[i] == 'a' && b[j] != 'x'){19 System.out.println(a[i] + "--->" +b[j]);20 }else if(a[i] == 'c' && b[j] != 'x' && b[j] != 'z'){21 System.out.println(a[i] + "--->" +b[j]);22 }else if(a[i] == 'b'){23 System.out.println(a[i] + "--->" +b[j]);24 }25 }26 }27 System.out.println("==============");28 //方案二:
29 for(int i = 0; i < 3; i++){30 for(int j = 0; j < 3; j++){31 if(a[i] == 'a' && b[j] == 'x'){32 continue;33 }else if(a[i] == 'c' &&( b[j] == 'x' || b[j] == 'z')){34 continue;35 }else{36 System.out.println(a[i] + "--->" +b[j]);37 }38 }39 }40
41 System.out.println("==============");42 //方案三:
43 for(int i=0; i<3; i++){44 for(int j=0; j<3; j++){45 if(i == 0 && j == 0)//a说他不和x比
46 continue;47 else if(i == 2 && (j == 0 || j == 2))48 continue;//c说他不和x,z比
49 else{50 System.out.println(a[i] + "" +a[j]);51 }52 }53 }54 }55 }
View Code
23. 打印菱形
1 packagecom.ftl;2
3 /**
4 打印出如下图案(菱形)5 *6 ***7 *****8 *******9 *****10 ***11 *12 程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。13 n=414 0 1 2 3 4 5 615 0 空 空 空 * 空 空 空16 1 空 空 * * * 空 空17 2 空 * * * * * 空18 3 * * * * * * *19 *@author小a玖拾柒20 * Date: 2018年8月18日21 */
22
23 public classTest2018 {24
25 public static void print(intn){26 int i = 0;27 int j = 0;28 for(i=0; i
29 for(j=0; j
33 System.out.print("*");34 }35 System.out.println();36 }37
38 for(i=1; i
39 for(j=0; j
43 System.out.print("*");44 }45 System.out.println();46 }47 }48
49 public static voidmain(String[] args) {50 print(4);51 }52 }
View Code
23. 分数计算
1 packagecom.ftl;2
3 /**有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。4 1.程序分析:请抓住分子与分母的变化规律。5 *@author小a玖拾柒6 * Date: 2018年8月18日7 */
8
9 public classTest2018 {10
11 public static voidmain(String[] args) {12 double fenmu = 2;13 double fenzi = 1;14 double num = 0;15 double sum = 0;16 for(int i = 0; i < 20; i++){17 num = fenmu /fenzi;18 double tmp =fenmu;19 fenmu = fenzi +tmp;20 fenzi =tmp;21 //System.out.println(fenmu + "\t" + fenzi + "\t" + num);
22 sum +=num;23 }24 System.out.println(sum);25 }26 }
View Code
24. 阶乘计算
1 packagecom.ftl;2
3 importorg.omg.Messaging.SyncScopeHelper;4
5 /**
6 题目:求1+2!+3!+...+20!的和7 *@author小a玖拾柒8 * Date: 2018年8月18日9 */
10
11 public classTest2018 {12
13 public static voidmain(String[] args) {14 //方案一:循环
15 long sum = 0;16 for(int i = 1; i <=20; i++){17 long fac = 1;18 for(int j = 1; j <=i; j++){19 fac *=j;20 }21 sum +=fac;22 }23 System.out.println(sum);24
25 //方案二: 阶乘
26 long ans = 0;27 for(int i=1; i<=20; i++){28 ans = ans +jieCheng(i);29 }30 System.out.println(ans);31
32 }33
34 public static long jieCheng(intnum){35 if(num == 1) return 1;36 else return jieCheng(num-1) *num;37
38 }39 }
View Code
25. 年龄递归计算
1 packagecom.ftl;2
3 /**
4 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。5 问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?6 *@author小a玖拾柒7 * Date: 2018年8月18日8 */
9
10 public classTest2018 {11
12 public static voidmain(String[] args) {13 int num = 5;14 System.out.println(jieCheng(num));15 }16
17 public static int jieCheng(intnum){18 if(num == 1) return 10;19 else return jieCheng(num-1) + 2;20 }21 }
View Code
26. 分解数字和数字反转
1 packagecom.ftl;2
3 importjava.util.ArrayList;4 importjava.util.Collections;5 importjava.util.Iterator;6 importjava.util.List;7
8 /**
9 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。10 问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?11 *@author小a玖拾柒12 * Date: 2018年8月18日13 */
14
15 public classTest2018 {16
17 public static voidmain(String[] args) {18 String str = "1234567";19 //方案一: 直接反转计算
20 System.out.println("反转前:" +str);21 List list = new ArrayList();22 for(int i = 0; i < str.length(); i++){23 list.add(String.valueOf(str.charAt(i)));24 }25 Collections.reverse(list);26 System.out.println("【方案一】反转后:" + list + ",共有" + list.size() + "个数字");27
28 //方案二: 分解数字
29 Iterator iter =explodeNumber(Integer.parseInt(str)).iterator();30
31 while(iter.hasNext()){32 System.out.print(iter.next());33 }34 }35
36 public static List explodeNumber(intn){37 List li = new ArrayList();38 int count = 0;39 while(n != 0){40 li.add((int)n%10);41 count++;42 n = n / 10;43 }44 System.out.print("【方案二】:");45 System.out.println("共有" + count + "个数字");46 returnli;47 }48 }
View Code
27. 数列: 1,1,2,3,5,8,13,21...
1 packagecom.ftl;2
3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 /**
7 * 数列: 1,1,2,3,5,8,13,21...8 * ==> 0,1,1,2,3,5,8,13,21...9 *10 *@author小a玖拾柒11 * Date: 2018年8月18日12 *13 */
14 public classTest2018 {15 public static voidmain(String[] args) {16 int first = 0;17 int second = 1;18 int sum = 0;19 int month = 0;20 try{21 BufferedReader buf = new BufferedReader(newInputStreamReader(System.in));22 System.out.println("请输入月份:");23 month =Integer.parseInt(buf.readLine());24 } catch(NumberFormatException e) {25 //TODO Auto-generated catch block
26 e.printStackTrace();27 } catch(IOException e) {28 //TODO Auto-generated catch block
29 e.printStackTrace();30 }31 for(int i = 1; i < month; i++){32 sum = first +second;33 first =second;34 second =sum;35 }36 System.out.println("5个月后:" +sum);37 }38 }
View Code
28. 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
1 packagecom.ftl;2
3 importjava.util.ArrayList;4 importjava.util.Arrays;5 importjava.util.Collections;6 importjava.util.List;7 importjava.util.Scanner;8
9 /**
10 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。11 *@author小a玖拾柒12 * Date: 2018年8月18日13 */
14
15 public classTest2018 {16 public static void sort(int[] a){//类似冒泡排序
17 int cup = 0;18 int l = a.length-1;19 for(int i=1; i a[0]){21 cup =a[i];22 a[i] = a[0];23 a[0] =cup;24 }25 if(a[i]