java经典算法40题-附带解决代码

前一段时间工作比较闲,每天没有代码敲的日子有点无聊,于是为了保证自己的编程逻辑力的日常清醒,故百度了一些经典的java算法,然后自己思考编程解决问题,虽然那些东西比较基础了,但是有些题目小编看到了也是要思考一段时间的,可能网上也有各色各异的解决代码,但是本章的解决代码却是独一份的,包含了小编的思想在里面,废话不多说了,上题目上代码。java经典算法40题-附带解决代码

代码请看下方:

package com.zaevn.testone;
import org.junit.Test;
import java.util.*;

/**
* 经典算法40题:每天练习三个
*
* @author zae
*/
public class sufaProtise {
/**
* 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
* 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
* 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
*/
@Test
public void test1() {
int i = 12;
int num = tuzi(i);
System.out.println("第" + i + "月的兔子总个数为:" + num + "对");
}

private int tuzi(int num) {
if (num == 1 || num == 2) {
return 1;
} else {
return tuzi(num - 1) + tuzi(num - 2);
}
}

/**
* 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。
* 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
* 则表明此数不是素数,反之是素数。
*/
@Test
public void test2() {
List number = new ArrayList();//用来存放所有符合要求的素数
int count = 0;//用来记录素数的个数
for (int i = 1; i <= 200; i++) {
Math myMath = new Math();
boolean isOk = myMath.isSuShu(i);
if (isOk) {
number.add(i);
count = count + 1;
}
}
System.out.println("素数个数为:"+count+"个");
System.out.println("所有素数为:"+number.toString());
}

/**
* 【程序3】 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,
* 其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
* 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位
*/
@Test
public void test3() {
int a,b,c;//定义三个数,代表个位,十位,百位
List numberList = new ArrayList();//用来存放所有的水仙花数
int count = 0;
for(int i = 100;i<=999;i++){
a = i%10;
b = (i%100)/10;
c = i/100;
if(a*a*a + b*b*b + c*c*c == i ){
count = count + 1;
numberList.add(i);
}
}
System.out.println("数值:"+numberList.toString());
System.out.println("个数:"+count);
}

/**
*【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
*
* 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
*
* (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
*
* (2)如果n > k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你,重复执行第一步。
*
* (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
*
* 质因数:将一个整数拆分出几个质数相乘这几个质数便是这个整数的质因数
*/
@Test
public void test4(){
Math myMath = new Math();
String str="";
str=javax.swing.JOptionPane.showInputDialog("请输入N的值(输入exit退出):");
int N;
N=0;
try{
N=Integer.parseInt(str);
}catch(NumberFormatException e){
e.printStackTrace();
}
System.out.print(N+"分解质因数:"+N+"=");
myMath.fengjie(N);
}

/**
*【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
* 1.程序分析:(a> b)?a:b这是条件运算符的基本例子。
*/
@Test
public void test5(){
int a = 30;
String result = "";
result = (a>=90)?"A":((a>=60)? "B": "C");
System.out.println("结果是:"+result);
}

/**
* 【程序6】使用java语言完成一个定积分的计算
* f(x) = 2*x*x+x
* 使用元素法进行计算
*/
@Test
public void test6(){
//定义积分上限和积分下限(top,limit)
//将整个区间划分为1000份
//每分区间的面积为:(y1+y2)*(top-limit)/1000
//根据x的值带入f(x)能够查出y的值
Scanner scanner = new Scanner(System.in);
System.out.println("请输入积分上限:");
double top = scanner.nextDouble();
System.out.println("请输入积分下限:");
double limit = scanner.nextDouble();
double hight = (top - limit)/10000;//区间的高
double one = 0;
double two = 0;
double area = 0;
for(int i = 0;i<10000;i++){
one = limit + hight * i;
two = limit + hight * (i+1);
area = area+((y(one) + y(two)) * hight)/2;
}
System.out.println("使用元素法获取该定积分的结果为:"+area);
System.out.println("使用积分公式获取该定积分的结果为:"+jisuan(top,limit));
}

/**
* 【程序7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
*
* 1.程序分析:利用while语句,条件为输入的字符不为 '\n '.
*/
@Test
public void test7(){
String str =javax.swing.JOptionPane.showInputDialog("请输入字符串(输入exit退出):");
char[] arrStr = str.toCharArray();
int i = 0;
int eCount = 0;
int nullCount = 0;
int numCount = 0;
int otherCount = 0;
while (i<arrStr.length){
if(arrStr[i] == ' '){
nullCount++;
}else if(arrStr[i]<='9'&& arrStr[i] >= '0'){
numCount++;
}else if(arrStr[i]<='z'&& arrStr[i] >= 'a' || arrStr[i]<='Z'&& arrStr[i] >= 'A'){
eCount++;
}else {
otherCount++;
}
i++;
}
System.out.println("数字个数为:"+numCount+" 英文个数为:"+eCount+" 空格个数为:"+nullCount+" 其他字符的个数为:"+otherCount);
}

/**
* 【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
*
* 1.程序分析:关键是计算出每一项的值。
*/
@Test
public void test8(){
Math myMath = new Math();
String strCount="";
String strNum="";
strCount=javax.swing.JOptionPane.showInputDialog("请输入位数(输入exit退出):");
strNum=javax.swing.JOptionPane.showInputDialog("请输入数值(输入exit退出):");
int count = 0;//位数
int num = 0;//数字
try{
count=Integer.parseInt(strCount);
num=Integer.parseInt(strNum);
}catch(NumberFormatException e){
e.printStackTrace();
}
int add = 0;//每个数
int addSum = 0;//每个数值相加
for(int i = 0;i<count;i++){
for(int j = 0;j<=i;j++){
add = add + num * myMath.shicheng(j);
}
addSum = addSum +add;
if(i != count -1){
System.out.print(add+" + ");
}else{
System.out.print(add+" = "+addSum);
}
add = 0;
}
}

/**
* 【程序9】 题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。
*/
@Test
public void test9(){
System.out.println("1000以内的完数有:");
for(int i = 1;i<=1000;i++){
int s = 0;
for(int j = 1;j<i;j++){
if(i%j == 0){
s =s+j;
}
}
if(s == i){
System.out.print(i+" ");
}
}
}

/**
* 【程序10】 题目:一球从100米高度*落下,每次落地后反跳回原高度的一半;
* 再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
*/
@Test
public void test10(){
double longs = 100;
double num = 0;
for(int i = 1;i<=10;i++){
if(i == 10){
longs = longs /2;
}else{
longs = longs /2;
num = num + 2*longs;
}

}
System.out.println("第十次落地时经过了"+(100+num)+"米");
System.out.println("第十次落地后反弹了"+longs+"米");
}

/**
*【程序11】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
* 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
*/
@Test
public void test11(){
int count = 0;//计数
for(int i = 1;i<=4;i++){
for(int j = 1;j<=4;j++){
for(int k = 1;k <= 4;k++){
if(i!=j && j!=k && i!=k){
count++;
System.out.println(i*100+j*10+k);
}
}
}
}
System.out.println("总共有:"+count+"个");
}

/**
*【程序12】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;
* 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;
* 20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;
* 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,
* 从键盘输入当月利润I,求应发放奖金总数?
*
* 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
*/
@Test
public void test12(){
double sum;//声明要储存的变量应发的奖金
Scanner input =new Scanner (System.in);//导入扫描器,Scanner只能是main方法时可以使用
System.out.print ("输入当月利润");
double lirun=input .nextDouble();//从控制台录入利润
if(lirun<=100000){
sum=lirun*0.1;
}else if (lirun<=200000){
sum=10000+lirun*0.075;
}else if (lirun<=400000){
sum=17500+lirun*0.05;
}else if (lirun<=600000){
sum=lirun*0.03;
}else if (lirun<=1000000){
sum=lirun*0.015;
} else{
sum=lirun*0.01;
}
System.out.println("应发的奖金是"+sum);
}

/**
*【程序13】
*
* 题目:一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?
*
* 1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,
* 如果开方后的结果满足如下条件,即是结果。请看具体分析:
*/
@Test
public void test13(){
boolean isOk = false;
for(int i = 1;i<=10000;i++){
int one = i+100;
int two = i+168;
for(int j = 1;j<=one/2;j++){
if(j*j == one){
isOk = true;
break;
}
}
if(isOk){
for(int k = 1;k<=two/2;k++){
if(k*k == two){
isOk = true;
break;
}
isOk = false;
}
}
if (isOk){
System.out.print("这个整数是:"+i+" ");
}
}
}

/**
*【程序14】 题目:输入某年某月某日,判断这一天是这一年的第几天?
*
* 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,
* 特殊情况,闰年且输入月份大于3时需考虑多加一天
*/
@Test
public void test14(){
//每个月的天数不同
//先判断这一年是闰年还是平年,将它之前的所有的月份天数相加,在将这个月的几号加上
String strDate="";
strDate=javax.swing.JOptionPane.showInputDialog("请输入日期:(格式:2010-01-01):");
//解析字符串,将年月日拆分开
int year = Integer.parseInt(strDate.substring(0,4));
int month = Integer.parseInt(strDate.substring(5,7));
int day = Integer.parseInt(strDate.substring(8));
Math myMath = new Math();
System.out.println("这一天是这一年的第"+(myMath.days(year,month-1)+day)+"天");

}

/**
*【程序15】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。
*
* 1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x与y的值进行交换,
* 然后再用x与z进行比较,如果x> z则将x与z的值进行交换,这样能使x最小。
*/
@Test
public void test15(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入三个数,使用','分割开:");
String num [] = strNum.split("\\,");
int x = Integer.parseInt(num[0]);
int y = Integer.parseInt(num[1]);
int z = Integer.parseInt(num[2]);
if(x>y){
int tem = y;
y = x;
x = tem;
}
if(x>z){
int tem = z;
z = x;
x = tem;
}
if(y>z){
int tem = z;
z = y;
y = tem;
}
System.out.println("排序后的顺序为:x:"+x+" y:"+y+" z:"+z);
}

/**
*【程序16】 题目:输出9*9口诀。
*
* 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
*/
@Test
public void test16(){
for(int i = 1;i<=9;i++){
for(int j = 1;j<=i;j++){
System.out.print(j + " * " + i + " = "+(i*j)+" ");
}
System.out.println();
}
}

/**
*【程序17】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
*
* 1.程序分析:采取逆向思维的方法,从后往前推断
*/
@Test
public void test17(){
int num = 1;
for(int i = 1;i<10;i++){
num = 2*(num+1);
}
System.out.println("总共有"+num+"个桃子");
}

/**
*【程序18】 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。
* 有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
*/
@Test
public void test18(){
List<String> oneList = new ArrayList();
List<String> twoList = new ArrayList();
oneList.add("a");
oneList.add("b");
oneList.add("c");

twoList.add("x");
twoList.add("y");
twoList.add("z");

List<Map<String,String>> rtnList = new ArrayList<Map<String, String>>();
for(String one:oneList){
for(String two:twoList){
Map<String,String> newMap = new HashMap();
if(one.equals("a")&&two.equals("x") || one.equals("c")&&two.equals("x") || one.equals("c")&&two.equals("z")){
continue;
}
newMap.put(one,two);
rtnList.add(newMap);
}
}
System.out.println(rtnList.toString());
}

/**打印棱形
* 1,3,6 8 6 3 1
*
*/
@Test
public void test19(){
for (int i = 1;i<=4;i++){
for(int j = 1;j<=i*2-1;j++){
System.out.print(" * ");
}
System.out.println();
}
for(int a = 3;a>=1;a--){
for(int b = 1;b<=a*2-1;b++){
System.out.print(" * ");
}
System.out.println();
}
}

/**
*【程序20】 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
*
* 1.程序分析:请抓住分子与分母的变化规律。
*/
@Test
public void test20(){
double a = 1;//分母
double b = 2;//分子
double num = 2/1;
System.out.print(b+"/"+a+" + ");
for(int i = 1;i<=19;i++){
double temp = b;
b = a+b;
a = temp;
if(i==19){
System.out.print(b+"/"+a+" = ");
}else{
System.out.print(b+"/"+a+" + ");
}
num = num + a/b;
}
System.out.print(num);
}

/**
*【程序21】 题目:求1+2!+3!+...+20!的和
*
* 1.程序分析:此程序只是把累加变成了累乘。
*/
@Test
public void test21(){
int num = 0;
for(int i = 1;i<=20;i++){
if (i!=20){
System.out.print(i+"! + ");
}else{
System.out.print(i+"! = ");
}
int smallnum = 1;
for(int j = 1;j<=i;j++){
smallnum = smallnum*j;
}
num = num + smallnum;
}
System.out.print(num);
}

/**
*【程序22】 题目:利用递归方法求5!。
*
* 1.程序分析:递归公式:fn=fn_1*4!
*/
@Test
public void test22(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入阶乘的数值(输入exit退出):");
int num = 0;//数字
try{
num=Integer.parseInt(strNum);
}catch(NumberFormatException e){
e.printStackTrace();
}
System.out.println(num+"! = "+wu(num));
}
//递归算法
private int wu(int x){
if(x==1){
return 1;
}else{
return x * wu(x-1);
}
}

/**
*【程序23】 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。
* 问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
*
* 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。
* 要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推
*/
@Test
public void test23(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请问您想知道第几个人的年龄(输入exit退出):");
int num = 0;//数字
try{
num=Integer.parseInt(strNum);
}catch(NumberFormatException e){
e.printStackTrace();
}
System.out.println("第"+num+"个人的年龄为:"+age(num));
}

private int age(int i){
if(i == 1){
return 10;
}else{
return age(i-1) + 2;
}
}

/**
*【程序24】 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
*/
@Test
public void test24(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入一个不高于5位的数字(输入exit退出):");
int num = 0;//数字
try{
num=Integer.parseInt(strNum);
}catch(NumberFormatException e){
e.printStackTrace();
}
StringBuffer strbuffNum = new StringBuffer();
strbuffNum.append(strNum);
if(num>=100000 || num <=0){
System.out.println("请输入不高于5位的正整数,程序结束");
return;
}else if(num>=1 && num<=9){
System.out.println(num+"是一个1位数");
System.out.println(num+"倒序排列为:"+strbuffNum.reverse());
}else if(num>=10 && num<=99){
System.out.println(num+"是一个2位数");
System.out.println(num+"倒序排列为:"+strbuffNum.reverse());
}else if(num>=100 && num<=999){
System.out.println(num+"是一个3位数");
System.out.println(num+"倒序排列为:"+strbuffNum.reverse());
}else if(num>=1000 && num<=9999){
System.out.println(num+"是一个4位数");
System.out.println(num+"倒序排列为:"+strbuffNum.reverse());
}else if(num>=10000 && num<=99999){
System.out.println(num+"是一个5位数");
System.out.println(num+"倒序排列为:"+strbuffNum.reverse());
}
}

/**
*【程序25】 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同
*/
@Test
public void test25(){
//将它放进一个字符数组中,首先判断是不是一个五位数,判断下标0和下标4是否相等,判断下标1和下标3是否相等
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入一个五位数字(输入exit退出):");
char charNum[] = strNum.toCharArray();
if(charNum.length == 5){
if(charNum[0] == charNum[charNum.length-1] && charNum[1] == charNum[charNum.length-2]){
System.out.println(strNum+"是一个回文数");
}else {
System.out.println(strNum+"不是一个回文数");
}

}else{
System.out.println(strNum+"不是一个五位数");
}
}

/**
*【程序26】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
*
* 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
*/
@Test
public void test26(){
//Sunday(星期日)、Monday(星期一)、Tuesday(星期二)、Wednesday(星期三)、Thursday(星期四)、Friday(星期五)、Saturday(星期六)
char c1 = '0';
char c2 = '0';
boolean isEnd = false;
for(int i = 1;i<=10;i++){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入第"+i+"个字母(不区分大小写):");
if(strNum.trim().length()>1 || strNum.trim().length() == 0){
System.err.println("请输入1个字母即可(不区分大小写)");
return;
}
char inputEnglish[] = strNum.toLowerCase().toCharArray() ;//支持大小写
if(i == 1){
c1 = inputEnglish[0];
}else if(i == 2){
c2 = inputEnglish[0];
}
switch (c1){
case 'm':
System.out.println("星期一");
isEnd = true;
break;
case 't':
if(c2 == 'u'){
System.out.println("星期二");
isEnd = true;
}else if(c2 == 'h'){
System.out.println("星期四");
isEnd = true;
}
break;
case 'w':
System.out.println("星期三");
isEnd = true;
break;
case 'f':
System.out.println("星期五");
isEnd = true;
break;
case 's':
if(c2 == 'a'){
System.out.println("星期六");
isEnd = true;
}else if(c2 == 'u'){
System.out.println("星期日");
isEnd = true;
}
break;
default:
System.out.println("输入字母查询不到天数");
isEnd = true;
break;
}
if (isEnd){
break;
}
}
}

/**
*【程序27】 题目:求100之内的素数
*/
@Test
public void test27(){
//素数指的是只有1和他本身能够整除的数值
int count = 0;
boolean isSushu = true;
for(int i = 2;i<=100;i++){
if(i == 2){
System.out.print(i+" ");
count++;
continue;
}
for(int j = 2;j<i;j++){
if(i%j == 0){
isSushu = false;
break;
}
}
if(isSushu){
System.out.print(i+" ");
count++;
}
isSushu = true;
}
System.out.println("\n素数的个数为:"+count);
}

/**
*
【程序28】 题目:对10个数进行排序
1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,
下次类推,即用第二个元素与后8个进行比较,并进行交换。
*/
@Test
public void test28(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请随机输入几个数字,按照逗号分割开:");
String [] strArr = strNum.split("\\,");
//冒泡排序,将第一个与后面几个比较,小的放在最前面,升序排列
System.out.print("排序之前的数字为:");
Math.strArrInput(strArr);
System.out.print("\n排序之后的顺序为:");
Math.strArrInput(Math.maopao(strArr));
}

/**
*【程序29】 题目:求一个3*3矩阵对角线元素之和
*
* 1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出
*/
@Test
public void test29(){
//取随机数输入进矩阵中
int arrInt [][] = new int[3][3];
for(int i = 0;i<3;i++){
for(int j = 0;j<3;j++){
arrInt[i][j] = (i+j+2)+((i+1)*(j+1))-i+1;
}
}
//将所有结果读取出来,方便查看计算是否准确
for(int i = 0;i<3;i++){
for(int j = 0;j<3;j++){
System.out.println("arrInt["+i+"]["+j+"] = "+arrInt[i][j]); ;
}
}
//数值取出累加输出
int num = 0;
for(int i = 0;i<3;i++){
num = num + arrInt[i][i];
if(i==2){
System.out.print("arrInt["+i+"]["+i+"] = "+num);
}else {
System.out.print("arrInt["+i+"]["+i+"] + ");
}
}
}

/**
*【程序30】 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
* 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,
* 插入后此元素之后的数,依次后移一个位置。
*/
@Test
public void test30(){
//先输入随机一组数字,调用排序方法排列好
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请随机输入几个数字,按照逗号分割开:");
String [] strArr = strNum.split("\\,");
System.out.println("排序前的顺序为:");
Math.strArrInput(strArr);
String [] testArr = Math.maopao(strArr);
System.out.println("\n排序后插入前的顺序为;");
Math.strArrInput(testArr);
//再输入随机一个数字,进行插入操作
String num="";
num=javax.swing.JOptionPane.showInputDialog("请随机输入1个数字");
String []rtnArr = new String[testArr.length+1];
if(Integer.parseInt(num)<=Integer.parseInt(testArr[0])){
//将下标为0的赋值为当前的数据,其余的数据,下标都往后移位
rtnArr[0] = num;
for(int i = 1;i<rtnArr.length;i++){
rtnArr[i] = testArr[i-1];
}
}else if(Integer.parseInt(num)>=Integer.parseInt(testArr[testArr.length-1])){
//原数据保持不变,在尾部加一个数据
for(int i = 0;i<testArr.length;i++){
rtnArr[i] = testArr[i];
}
rtnArr[testArr.length] = num;
}else{
//在此位置之后的数据改动
for(int i = 0;i<testArr.length-1;i++){
if(Integer.parseInt(num)>= Integer.parseInt(testArr[i]) && Integer.parseInt(num) <= Integer.parseInt(testArr[i+1])){
for(int j = 0;j<=i;j++){
rtnArr[j] = testArr[j];
}
rtnArr[i+1] = num;
for(int k = i+2;k<rtnArr.length;k++){
rtnArr[k] = testArr[k-1];
}
}
}
}
System.out.println("\n排序插入后的数据为:");
Math.strArrInput(rtnArr);
}

/**
*【程序31】 题目:将一个数组逆序输出。
*
* 程序分析:用第一个与最后一个交换。
*
* 其实,用循环控制变量更简单:
*/
@Test
public void test31(){
//先输入随机一组数字,调用排序方法排列好
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请随机输入几个数字,按照逗号分割开:");
String [] strArr = strNum.split("\\,");
System.out.println("输入的数字顺序为:");
Math.strArrInput(strArr);
for(int i = 0;i<strArr.length/2;i++){
String temp = strArr[i];
strArr[i] = strArr[strArr.length-i-1];
strArr[strArr.length-i-1] = temp;
}
System.out.println("\n交换后的数字顺序为:");
Math.strArrInput(strArr);
}

/**
*【程序32】 题目:取一个整数a从右端开始的4~7位。
*
* 程序分析:可以这样考虑:
*
* (1)先使a右移4位。
*
* (2)设置一个低4位全为1,其余全为0的数。可用(0 < <4)
*
* (3)将上面二者进行&运算。
*/
@Test
public void test32(){
Math myMath = new Math();
//先输入随机一组数字,调用排序方法排列好
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请随机输入一个8位数:");
if(strNum.length()!=8){
System.err.println("必须输入8位数字");
return;
}
long longNum = Long.parseLong(strNum);
long yuNum = (longNum%(myMath.shicheng(7)));
int rtnNum = (int)java.lang.Math.floor(yuNum/(myMath.shicheng(3)));
System.out.println("从右数第4位到第7位为:"+rtnNum);

}

/**
*
【程序33】

题目:打印出杨辉三角形(要求打印出10行如下图)

1.程序分析:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1
*/
@Test
public void test33(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入要打印的杨辉三角形的层数:");
int arrTangle[][] = Math.yanghui(Integer.parseInt(strNum));
for(int i = 0;i<Integer.parseInt(strNum);i++){
for(int j = 0;j<=i;j++){
System.out.print(arrTangle[i][j]+" ");
}
System.out.println();
}
}

/**
*【程序34】 题目:输入3个数a,b,c,按大小顺序输出。
*
* 1.程序分析:利用指针方法。
*/
@Test
public void test34(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入三个数a,b,c.以逗号分割");
String strArr[] = strNum.split("\\,");
if(strArr.length!=3){
return;
}
String rtnArr[] = Math.maopao(strArr);
Math.strArrInput(rtnArr);
}

/**
*
【程序35】 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
*/
@Test
public void test35(){
//使用list方式查询出最大的值以及最小的值
List<Integer> intList = Arrays.asList(12,34,11,56,4,89,23,56,99,3,33);
Integer maxNum = intList.stream().reduce((a,b) -> a>=b?a:b).get();
Integer minNum = intList.stream().reduce((a,b) -> a>=b?b:a).get();
//将list转换为数组
Integer [] intArr = new Integer[intList.size()];
intList.toArray(intArr);
//遍历这个数组,将最大值与第一个元素交换,最小的一个与最后一个元素交换
for(int i = 0;i<intArr.length;i++){
if(intArr[i].equals(maxNum)){
Integer temp = maxNum;
intArr[i] = intArr[0];
intArr[0] = temp;
}else if(intArr[i].equals(minNum)){
Integer temp = minNum;
intArr[i] = intArr[intArr.length-1];
intArr[intArr.length-1] = temp;
}
}
//遍历输出交换后的数组
for(Integer out:intArr){
System.out.print(out+" ");
}
}

/**
*【程序36】 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
*/
@Test
public void test36(){
//1,2,3,4,5,6,7,8
// 此时n为8,假设m为3
//则变成6,7,8,1,2,3,4,5
//其中一个组放原始的数据,新数组放顺序改变后的
List<Integer> intList = Arrays.asList(1,2,3,4,5,6,7,8,9);//最原始的数据
List<Integer> newList = new ArrayList<>();//用来存放移动后的数据
String remove = javax.swing.JOptionPane.showInputDialog("请输入移动的位置数:");
int m = Integer.parseInt(remove);
List<Integer> list = new ArrayList<>();
for(int i = intList.size()-m;i<intList.size();i++){
list.add(intList.get(i));
}
intList.forEach(
num->{
if(list.contains(num)){
newList.add(num);
}
}
);
intList.forEach(
num->{
if(!list.contains(num)){
newList.add(num);
}
}
);
System.out.println(newList);
}

/**
*【程序37】
*
* 题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
*/
@Test
public void test37(){
String strNum="";
strNum=javax.swing.JOptionPane.showInputDialog("请输入n的值:");
int num = Integer.parseInt(strNum);
//将所有的数据放在数组中,初始每个数据都是true
boolean []booleanArr = new boolean[num];
for(int i = 0;i<booleanArr.length;i++){
booleanArr[i] = true;
}
int count = 0;//记录1,2,3
int size = 0;//记录false的个数,当false为n-1时,停止遍历这件事
//开始循环报数,到三的数状态修改为false
for(int i = 0;i<booleanArr.length;i++){
for(int j = 0;j<booleanArr.length;j++){
//状态为true的进行循环报数
if(booleanArr[j] == true){
count++;
}
//当报数报到3时,将数据变为false,count归0
if(count==3){
booleanArr[j] = false;
count=0;
size++;
}
//当false个数为num-1时,跳出所有的循环
if(size == num-1){
break;
}
}
if(size == num-1){
break;
}
}
for(int i =0;i<num;i++){
if(booleanArr[i] == true){
i++;
System.out.println("最后剩余的那一位为原先的第"+i+"位");
break;
}
}

}

/**
*
【程序38】

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
*/
@Test
public void test38(){
String str="";
str=javax.swing.JOptionPane.showInputDialog("请输任意输入一个字符串::");
int count = Math.lengthForMyself(str);
System.out.println("该字符串为:"+str);
System.out.println("该字符串的长度为:"+count);
}

/**
*题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
*
* 【程序39】
*
* 题目:字符串排序。
*/
@Test
public void test39(){
String str="";
str=javax.swing.JOptionPane.showInputDialog("请输任意一个数::");
int num = Integer.parseInt(str);
double ret = 0;
if(num%2 == 0){
ret = Math.jisuan(2,num);
}else{
ret = Math.jisuan(1,num);
}
System.out.println("结果为:"+ret);
}
/**
* 【程序40】约瑟夫环的问题
* 有n个人,从1开始报数,每报到3就杀掉,再从1开始报,查询出余下两个人的数为多少
*/
@Test
public void test41() {
//初始化总报数人员,这个可以自定义
int n = 10;
//创建一个map集合,初始化所有人员
Map<Integer, Boolean> all = new HashMap<>();
for (int i = 1; i <= n; i++) {
all.put(i, true);
}
//记录map集合中false的个数
int falseCount = 0;
//进行报数操作
int count = 0;//计数器
for (int i = 1; ; ) {
//如果本次循环的元素为false,则跳出本次循环,进入下次循环
if (!all.get(i)) {
i++;
continue;
}
count++;
if (count == 3) {
all.put(i, false);
falseCount++;
count = 0;
}
//当false的人员为总报数人员个数-2时,结束循环
if (falseCount == n - 2) {
break;
}
//当i=n时,下一次循环再从1开始
if (i == n) {
i = 0;
}
i++;
}
  //value值为true则为最后剩余的两个人
System.out.println("输出结果为:" + all);
}


/**
* 计算y的值
* @param x
* @return
*/
private static double y(double x){
return 2*x*x+x;
}

private static double jisuan(double x1,double x2){
return (2*x1*x1*x1)/3 + x1*x1/2 - (2*x2*x2*x2)/3 - x2*x2/2;
}
}

class Math {
//判断是否为素数
public boolean isSuShu(int x) {
for (int i = 2; i < x; i++) {
if (x % i == 0) {
return false;
}
}
return true;
}

public void fengjie(int n){
for(int i=2;i<=n/2;i++){
if(n%i==0){
System.out.print(i+"*");
fengjie(n/i);
}
}
System.out.print(n);
System.exit(0);///不能少这句,否则结果会出错
}

/**
* 输入指数,获取10的方
* @param num
* @return
*/
public int shicheng(int num){
int i = 2;
int number = 10;
if(num == 1){
return 10;
}else if(num == 0){
return 1;
}else{
while(num>=i){
number = number*10;
i++;
}
return number;
}
}

/**
* 根据年份和月份计算出天数
* @param mounth
* @return
*/
public int days(int year,int mounth){
int bigarr [] = {1,3,5,7,8,10,12};
int smallArr [] = {4,6,9,11};
int days = 0;
for(int i = 1;i<=mounth;i++){
if(i == 2){
if(year%4==0&&year%100!=0||year%400==0){
days = days+29;
}else{
days = days+28;
}
continue;
}
for(int j = 0;j<bigarr.length;j++){
if(i == bigarr[j] ){
days = days+31;
}
}
for(int k = 0;k<smallArr.length;k++){
if(i == smallArr[k] ){
days = days+30;
}
}
}
return days;
}

public static void strArrInput(String [] strArr){
for(int i = 0;i<strArr.length;i++){
System.out.print(strArr[i]+" ");
}
}

public static String[] maopao(String[] strArr){
for(int i = 0;i<strArr.length-1;i++){
String temp = "";
for(int j = i+1;j<strArr.length;j++){
if(Integer.parseInt(strArr[j]) < Integer.parseInt(strArr[i])){
temp = strArr[i];
strArr[i] = strArr[j];
strArr[j] = temp;
}
}
}
return strArr;
}

public static int[][] yanghui(int num){
int [][] arr = new int[num][num];
for(int i = 0;i<num;i++ ){
arr[i][i] = 1;
arr[i][0] = 1;
}
for(int i = 2;i<num;i++){
for(int j = 1;j<i;j++){
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
return arr;
}

public static int lengthForMyself(String souce){
char []sourcr = souce.toCharArray();
int count = 0;
for(char c:sourcr){
count++;
}
return count;
}

public static double jisuan(double souce,double num){
double sum =0;
for(double i = souce;i<=num;){
sum = sum + 1/i;
i = i+2;
}
return sum;
}
}

赠言:可能我们在开发的道路上前行的时间太久了,就往往执着于追求新一点的刁钻技术去研究,慢慢的却忽略了基本功,希望我们在追求更高更好的技术时也记着回头看看,可能那些小的东西能给我们带来大的收获。

上一篇:从问题看本质:socket到底是什么?


下一篇:鸟哥的Linux私房菜——第八章