zoukankan      html  css  js  c++  java
  • java经典算法40题-附带解决代码

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

    代码请看下方:

    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语句,条件为输入的字符不为 ' '.
    */
    @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(" 素数的个数为:"+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(" 排序之后的顺序为:");
    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(" 排序后插入前的顺序为;");
    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(" 排序插入后的数据为:");
    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(" 交换后的数字顺序为:");
    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;
    }
    }

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

  • 相关阅读:
    php 下载文件
    thinkphp3.1 发送email
    微擎 plugin 时间插件 图片上传插件不显示 报错 影响下面执行
    Java中基本数据类型的对比记忆
    堆内存设置以及垃圾回收方式
    try--catch--finally中return返回值执行的顺序(区别)
    Java中的值传递和引用传递
    全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)
    10进制转换成16进制最简单的方法
    quartz 框架定时任务,使用spring @Scheduled注解执行定时任务
  • 原文地址:https://www.cnblogs.com/zaevn00001/p/12218069.html
Copyright © 2011-2022 走看看