1:
/** * 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子, 小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子对数为多少? * 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... * * @author super * */ public class Test { public static void main(String[] args) { for (int i = 1; i <= 20; i++) { System.out.println("第" + i + "个月的兔子总数为:" + Rabbit(i)); } } // 递归处理 public static int Rabbit(int n) { // 前两个月兔子总数各为1 if (n == 1 || n == 2) { return 1; } else { // 第三个月开始,每个月兔子总数为上个月和上上个月的和 return Rabbit(n - 1) + Rabbit(n - 2); } } }
输出:
第1个月的兔子总数为:1
第2个月的兔子总数为:1
第3个月的兔子总数为:2
第4个月的兔子总数为:3
第5个月的兔子总数为:5
第6个月的兔子总数为:8
第7个月的兔子总数为:13
第8个月的兔子总数为:21
第9个月的兔子总数为:34
第10个月的兔子总数为:55
第11个月的兔子总数为:89
第12个月的兔子总数为:144
第13个月的兔子总数为:233
第14个月的兔子总数为:377
第15个月的兔子总数为:610
第16个月的兔子总数为:987
第17个月的兔子总数为:1597
第18个月的兔子总数为:2584
第19个月的兔子总数为:4181
第20个月的兔子总数为:6765
2:
题目:判断101-200之间有多少个素数,并输出所有素数。
public class Test { public static void main(String[] args) { GetSuShu(101, 200); } /*** * 获取a,b之间的所有素数并统计输出 * * @param a * 起始数字 * @param b * 结束数字 */ public static void GetSuShu(int a, int b) { // 统计素数个数 int count = 0; // 外循环遍历既定数字范围 for (int i = a; i <= b; i++) { // 新建一个判断变量 boolean flag = true; // 从2开始到自身依次相除判断是否素数 for (int j = 2; j < i; j++) { // 如果不是素数则改为false并跳出内循环 if (i % j == 0) { flag = false; break; } } // 如果遍历结束确定是素数则统计并输出 if (flag) { count++; System.out.println("第" + count + "个素数:" + i); } } } }
输出:
第1个素数:101
第2个素数:103
第3个素数:107
第4个素数:109
第5个素数:113
第6个素数:127
第7个素数:131
第8个素数:137
第9个素数:139
第10个素数:149
第11个素数:151
第12个素数:157
第13个素数:163
第14个素数:167
第15个素数:173
第16个素数:179
第17个素数:181
第18个素数:191
第19个素数:193
第20个素数:197
第21个素数:199
3:
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
public class Test { public static void main(String[] args) { // 打印水仙花数 // 某个n位数字每一位的n次方相加等于n // 1^3+5^3+3^=1+125+27=153 int ShuiSum = 0; for (int i = 0; i < 1000; i++) { if (i == Math.pow(i % 10, 3) + Math.pow(i / 100, 3) + Math.pow(i / 10 - (i / 100) * 10, 3)) { // 个位数字 百位数字 十位数字 System.out.println(i); ShuiSum++; } } System.out.println("共有水仙花数" + ShuiSum + "个"); } }
输出:
0
1
153
370
371
407
共有水仙花数6个
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的值,重复执行第一步。
Test1:
public class Test { public static void main(String[] args) { // 给定一个测试的数字 int n = 120; // 先输出一个 “120=” System.out.print(n + "="); // 从2开始遍历该数字的质数 for (int i = 2; i <= n; i++) { // 如果能整除,是质数则继续 if (n % i == 0) { // 是否相同 if (n == i) { // 如果相同则仅输出数字并跳出循环 System.out.print(i); break; } // 如果不相同说明还可能有后续质数,更新n的值 n /= i; // 输出 当前质数i 并加上* 号 System.out.print(i + "*"); // 由于获取最小质数后可能还有相同的一个最小质数,所以需要回滚i变量 // 由于每次获取到的肯定是当前最小的质数,所以只需要回滚1就可以了 i--; } } } }
输出:
120=2*2*2*3*5
Test2:
public classProg4{ public static void main(String[] args){ int n = 13; decompose(n); } private static void decompose(int n){ System.out.print(n+"="); for(int i=2;i<n+1;i++){ while(n%i==0 && n!=i){ n/=i; System.out.print(i+"*"); } if(n==i){ System.out.println(i); break; } } } }
5
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
程序分析:(a>b)?a:b这是条件运算符的基本例子。
Test:
public class Test { public static void main(String[] args) { int score = 46; String grade = score >= 90 ? "A" : score >= 60 ? "B" : "C"; System.out.println(grade); } }
输出:
C
Test2:
public class Prog5{ publicstatic void main(String[] args){ intn = -1; try{ n= Integer.parseInt(args[0]); }catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("请输入成绩"); return; } grade(n); } //成绩等级计算 privatestatic void grade(int n){ if(n>100|| n<0) System.out.println("输入无效"); else{ String str = (n>=90)?"分,属于A等":((n>60)?"分,属于B等":"分,属于C等"); System.out.println(n+str); } } }
6:
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
Test:
public class Test { public static void main(String[] args) { int a = 120; int b = 90; System.out.println(a + "和" + b + "的最大公约数为:" + GetGongYue(a, b)); System.out.println(a + "和" + b + "的最小公倍数为:" + GetGongBei(a, b)); } /*** * 获取两个正整数的最大公约数 * * @param a * 参数 * @param b * 参数 * @return 两个数的最大公约数 */ public static int GetGongYue(int a, int b) { // 初始化最大公约数为较小数字 int gongYue = (a < b ? a : b); // 从较小数字开始向下遍历,满足添加即赋值并跳出循环 for (int i = gongYue;; i--) { if (a % i == 0 && b % i == 0) { gongYue = i; break; } } return gongYue; } /*** * 获取两个正整数的最小公倍数 * * @param a * 参数 * @param b * 参数 * @return 两个数字的最小公倍数 */ public static int GetGongBei(int a, int b) { // 初始化最小公倍数为较大数字 int gongBei = (a > b ? a : b); // 向上遍历满足条件即赋值并跳出循环 for (int i = gongBei;; i++) { if (i % a == 0 && i % b == 0) { gongBei = i; break; } } return gongBei; } }
输出:
120和90的最大公约数为:30
120和90的最小公倍数为:360
Test2:
public classProg6{ public static void main(String[] args){ int m,n; try{ m = Integer.parseInt(args[0]); n = Integer.parseInt(args[1]); }catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("输入有误"); return; } max_min(m,n); } //求最大公约数和最小公倍数 private static void max_min(int m, int n){ int temp = 1; int yshu = 1; int bshu = m*n; if(n<m){ temp = n; n = m; m = temp; } while(m!=0){ temp = n%m; n = m; m = temp; } yshu = n; bshu /= n; System.out.println(m+"和"+n+"的最大公约数为"+yshu); System.out.println(m+"和"+n+"的最小公倍数为"+bshu); } }
7:
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
public class Test { public static void main(String[] args) { Check("sfs4564 4564fdg 4564gfd456 $%dgdf^%&%&"); System.out.println("--------------------------"); Check("sfs4564 4564fdg 4564gfd456 $%dgdf^%&%&"); } // 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 private static void Check(String s) { int enNum = 0; int nuNum = 0; int kongNum = 0; int othNum = 0; // 转换成字符数组遍历 char[] chs = s.toCharArray(); for (int i = 0; i < chs.length; i++) { // 如果是数字 if (Character.isDigit(chs[i])) { nuNum++; // 是否字母 } else if (Character.isLetter(chs[i])) { enNum++; // 是否空格 } else if (chs[i] == ' ') { kongNum++; } else { // 其他字符 othNum++; } } System.out.println("数字字符数量为:" + nuNum); System.out.println("字母字符数量为:" + enNum); System.out.println("空格字符数量为:" + kongNum); System.out.println("其他字符数量为:" + othNum); } //调用字符串charAt()方法遍历 private static void Check2(String s) { int enNum = 0; int nuNum = 0; int kongNum = 0; int othNum = 0; for (int i = 0; i < s.length(); i++) { if (Character.isDigit(s.charAt(i))) { nuNum++; } else if (Character.isLetter(s.charAt(i))) { enNum++; } else if (s.charAt(i) == ' ') { kongNum++; } else { othNum++; } } System.out.println("数字字符数量为:" + nuNum); System.out.println("字母字符数量为:" + enNum); System.out.println("空格字符数量为:" + kongNum); System.out.println("其他字符数量为:" + othNum); } }
输出:
数字字符数量为:15
字母字符数量为:13
空格字符数量为:3
其他字符数量为:7
--------------------------
数字字符数量为:15
字母字符数量为:13
空格字符数量为:3
其他字符数量为:7
Test2:
importjava.util.Scanner; public classProg7_1{ public static void main(String[] args){ System.out.print("请输入一串字符:"); Scanner scan = new Scanner(System.in); String str = scan.nextLine();//将一行字符转化为字符串 scan.close(); count(str); } //统计输入的字符数 private static void count(String str){ String E1 ="[\u4e00-\u9fa5]";//汉字 String E2 = "[a-zA-Z]"; String E3 = "[0-9]"; String E4 = "\\s";//空格 int countChinese = 0; int countLetter = 0; int countNumber = 0; int countSpace = 0; int countOther = 0; char[] array_Char = str.toCharArray();//将字符串转化为字符数组 String[] array_String = newString[array_Char.length];//汉字只能作为字符串处理 for(int i=0;i<array_Char.length;i++) array_String[i] = String.valueOf(array_Char[i]); //遍历字符串数组中的元素 for(String s:array_String){ if(s.matches(E1)) countChinese++; else if(s.matches(E2)) countLetter++; else if(s.matches(E3)) countNumber++; else if(s.matches(E4)) countSpace++; else countOther++; } System.out.println("输入的汉字个数:"+countChinese); System.out.println("输入的字母个数:"+countLetter); System.out.println("输入的数字个数:"+countNumber); System.out.println("输入的空格个数:"+countSpace); System.out.println("输入的其它字符个数:"+countSpace); } }
importjava.util.*; public classProg7_2{ public static void main(String[] args){ System.out.println("请输入一行字符:"); Scanner scan = new Scanner(System.in); String str = scan.nextLine(); scan.close(); count(str); } //统计输入的字符 private static void count(String str){ List<String> list = newArrayList<String>(); char[] array_Char = str.toCharArray(); for(char c:array_Char) list.add(String.valueOf(c));//将字符作为字符串添加到list表中 Collections.sort(list);//排序 for(String s:list){ int begin = list.indexOf(s); int end = list.lastIndexOf(s); //索引结束统计字符数 if(list.get(end)==s) System.out.println("字符‘"+s+"’有"+(end-begin+1)+"个"); } } }
8:
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值。
public class Test { public static void main(String[] args) { for (int i = 1; i < 10; i++) { System.out.println(Sum(2, i)); } } /*** * 特殊求和方法 求s=a+aa+aaa+aaaa+aa...a的值 * * @param a * 要做相加操作的数字 * @param count * 相加的次数 * @return 总和 */ private static int Sum(int a, int count) { // 求和变量 int sum = 0; // 临时变量 int temp = a; // 经历count次求和 for (int i = 0; i < count; i++) { // 第一次的和即a的值 sum += temp; // 之后的值每次更新为a上一次的值乘10再加上a temp = temp * 10 + a; } return sum; } }
Test2:
importjava.util.Scanner; public classProg8{ public static void main(String[] args){ System.out.print("求s=a+aa+aaa+aaaa+...的值,请输入a的值:"); Scanner scan = newScanner(System.in).useDelimiter("\\s*");//以空格作为分隔符 int a = scan.nextInt(); int n = scan.nextInt(); scan.close();//关闭扫描器 System.out.println(expressed(2,5)+add(2,5)); } //求和表达式 private static String expressed(int a,intn){ StringBuffer sb = new StringBuffer(); StringBuffer subSB = new StringBuffer(); for(int i=1;i<n+1;i++){ subSB = subSB.append(a); sb = sb.append(subSB); if(i<n) sb = sb.append("+"); } sb.append("="); return sb.toString(); } //求和 private static long add(int a,int n){ long sum = 0; long subSUM = 0; for(int i=1;i<n+1;i++){ subSUM = subSUM*10+a; sum = sum+subSUM; } return sum; } }
9:
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
Test:
public class CeShi { /** * 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。 * * @param args */ public static void main(String[] args) { WanShu(1000); } /*** * * @param n */ private static void WanShu(int n) { int count = 0; // 从1到给定的数字n遍历 for (int i = 1; i <= n; i++) { // 待用变量 int temp = 0; // 内循环从1到n/2获取各个最小质数 for (int j = 1; j <= n / 2; j++) { // 判断是否当前数字的质数 if (i % j == 0) { // 如果是质数就累加 temp += j; // 如果质数累加的结果和当前数字相同,则判定为完数并输出 if (temp == i) { System.out.println(i); count++; } } } } System.out.println(n + "以内共有" + count + "个完数"); } }
输出:
1
6
24
28
496
1000以内共有5个完数
10:
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
Test:
public class CeShi { /** * 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半; 再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? * * @param args */ public static void main(String[] args) { for (int i = 1; i <= 10; i++) { GetHeight(i); System.out.println("------------------------------"); } } private static void GetHeight(int count) { // 统计第count次弹起时经过的距离 double sum = 0.0; // 统计第count次下落时经过的距离 double sum2 = 0.0; // 原始高度 double height = 100.0; for (int i = 1; i <= count; i++) { // 每次弹起时经过的距离为下落时高度的1.5倍 sum += height + height / 2; // 当达到第count次时,弹起时的总距离减去最后一次弹起的高度即为第count次下落时经过的距离 if (i == count) { sum2 = sum - height / 2; System.out.println("第" + count + "次时弹起的高度为:" + height / 2); } // 每弹起一次,起始下落高度减半 height /= 2; } System.out.println("第" + count + "次落下时经过的距离是:" + sum2 + "米。"); System.out.println("第" + count + "次弹起时经过的距离是:" + sum + "米。"); } }
输出:
第1次时弹起的高度为:50.0
第1次落下时经过的距离是:100.0米。
第1次弹起时经过的距离是:150.0米。
------------------------------
第2次时弹起的高度为:25.0
第2次落下时经过的距离是:200.0米。
第2次弹起时经过的距离是:225.0米。
------------------------------
第3次时弹起的高度为:12.5
第3次落下时经过的距离是:250.0米。
第3次弹起时经过的距离是:262.5米。
------------------------------
第4次时弹起的高度为:6.25
第4次落下时经过的距离是:275.0米。
第4次弹起时经过的距离是:281.25米。
------------------------------
第5次时弹起的高度为:3.125
第5次落下时经过的距离是:287.5米。
第5次弹起时经过的距离是:290.625米。
------------------------------
第6次时弹起的高度为:1.5625
第6次落下时经过的距离是:293.75米。
第6次弹起时经过的距离是:295.3125米。
------------------------------
第7次时弹起的高度为:0.78125
第7次落下时经过的距离是:296.875米。
第7次弹起时经过的距离是:297.65625米。
------------------------------
第8次时弹起的高度为:0.390625
第8次落下时经过的距离是:298.4375米。
第8次弹起时经过的距离是:298.828125米。
------------------------------
第9次时弹起的高度为:0.1953125
第9次落下时经过的距离是:299.21875米。
第9次弹起时经过的距离是:299.4140625米。
------------------------------
第10次时弹起的高度为:0.09765625
第10次落下时经过的距离是:299.609375米。
第10次弹起时经过的距离是:299.70703125米。
------------------------------
Test2:
importjava.util.Scanner; public classProg10{ public static void main(String[] args){ System.out.print("请输入小球落地时的高度和求解的次数:"); Scanner scan = newScanner(System.in).useDelimiter("\\s"); int h = scan.nextInt(); int n = scan.nextInt(); scan.close(); distance(h,n); } //小球从h高度落下,经n次反弹后经过的距离和反弹的高度 private static void distance(int h,int n){ double length = 0; for(int i=0;i<n;i++){ length += h; h /=2.0 ; } System.out.println("经过第"+n+"次反弹后,小球共经过"+length+"米,"+"第"+n+"次反弹高度为"+h+"米"); } }