50道经典的JAVA编程题 (6-10),今晚做了10道了,累死了。。。感觉难度不是很大,就是不知道是不是最好的实现方法啊!希望大神们能给指点哈。。。
【程序6】GCDAndLCM.java
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
3.最小公倍数等于两数之积除以最大公约数
package test50;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author VellBibi*【程序6】GCDAndLCM.java后者是辗转相除法*题目:输入两个正整数m和n,求其最大公约数和最小公倍数。*1.程序分析:利用辗除法。*2.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。*3.最小公倍数等于两数之积除以最大公约数*/public class GCDAndLCM {/**
* 最大公约数普通求法* @param m* @param n* @return 最大公约数*/public static int getGCDNormal(int m, int n){//最大公约数普通求法int i = (m > n ? n : m);
for(; i>1; i--){
if(m%i == 0 && n%i == 0)
return i;
}return 1;
}/**
* 最大公约数辗转相除法* @param m* @param n* @return 最大公约数*/public static int getGCD(int m, int n){//最大公约数辗转相除法if(m%n == 0) return n;else return getGCD(n, m%n);//递归辗转相除}/**
* 最小公倍数* @param m* @param n* @return 最小公倍数*/public static int getLCM(int m, int n){return (m * n)/getGCD(m, n);//最小公倍数等于两数之积除以最大公约数}public static void main(String[] args) {BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));int m = 0, n = 0;
try {
m = Integer.parseInt(buffer.readLine());n = Integer.parseInt(buffer.readLine());} catch (IOException e) {
e.printStackTrace();}System.out.println("最小公倍数:" + getLCM(m, n));
System.out.println("最大公约数:" + getGCD(m, n));
}}
【程序7】 StChar.java
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用循环,使用Map存储数据.其实完全可以使用4个变量来解决,这边舍近求远复习下Map啦
package test50;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* @author VellBibi*【程序7】 StChar.java*题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。*1.程序分析:利用循环,使用Map存储数据.其实完全可以使用4个变量来解决,这边舍近求远复习下Map啦*/public class StChar {public static Map<Integer, Integer> countChar(String str){Map<Integer, Integer> m = new HashMap<Integer, Integer>();
m.put(1, 0);m.put(2, 0);m.put(3, 0);m.put(4, 0);char[] ch = str.toCharArray();
for(int i=0; i<ch.length; i++){if(ch[i] >= 'a' && ch[i] <= 'z' || ch[i] >= 'A' && ch[i] <= 'Z')
m.put(1, m.get(1) + 1);else if(ch[i] == ' ')m.put(2, m.get(2) + 1);else if(ch[i] >= '0' && ch[i] <= '9')m.put(3, m.get(3) + 1);else
m.put(4, m.get(4) + 1);}return m;
}public static void main(String[] args) {BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));String str = null;
try {
str = buffer.readLine();} catch (IOException e) {
e.printStackTrace();}Map<Integer, Integer> m = countChar(str);Set<Integer> keys = m.keySet();Iterator<Integer> it = keys.iterator();int n, k;
while(it.hasNext()){
k = it.next();n = m.get(k);switch (k) {
case 1:
System.out.println("英文字母: "+n);
break;
case 2:
System.out.println("空格: "+n);
break;
case 3:
System.out.println("数字: "+n);
break;
case 4:
System.out.println("其它字符: "+n);
break;
default:
break;
}}}}
【程序8】 TestAdd.java
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
package test50;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author VellBibi*【程序8】 TestAdd.java*题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。*1.程序分析:关键是计算出每一项的值。*/public class TestAdd {public static long sumAdd(int a, int n){long cup = 0;
long ans = 0;
for(int i=0; i<n; i++){cup = 0;for(int j=0; j<=i; j++){cup = cup + a * (long)Math.pow(10, j);
}ans = ans + cup;}return ans;
}public static void main(String[] args) {BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));int n = 0;
try {
n = Integer.parseInt(buffer.readLine());} catch (IOException e) {
e.printStackTrace();}System.out.println(sumAdd(2, n));}}
【程序9】 WanShu.java
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
package test50;
/**
* @author VellBibi*【程序9】 WanShu.java*题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。*/public class WanShu {public static boolean isWanShu(int a){int cup = 0;
for(int i=1; i<a; i++){if(a%i == 0)
cup = cup + i;}return (cup == a);
}public static void main(String[] args) {for(int i=1; i<1000; i++){if(isWanShu(i)){
System.out.print(i + ",");
}}}}
【程序10】TestBall.java
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
package test50;
/**
* @author VellBibi*【程序10】TestBall.java*题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?*1.程序分析:递归实现*/public class TestBall {public static double sumBallHeight(double h, int n){if(n == 1) return h/2;else return sumBallHeight(h/2, n-1);}public static void main(String[] args) {System.out.println(sumBallHeight(100, 10));}}