归纳算法
注:不都是程序
1,你有100枚硬币,将它们平摆在桌软件工程师求职者:你有100枚硬币,将它们平摆在桌面上,每个都有正反面。其中,10个正面朝上,90个反面朝上。你不能触摸、看或者是以任何其它方式去感知它们的状态。请将硬币分成两堆,使每一堆里正面朝上的硬币数目一样。 求解?
答:随便挑十个放一堆然后全翻过来就行了。假设挑出来的十个没翻之前里面有M个正面10-M个反面,因为一共有10个正面则剩余另一堆是10-M个正面,然后把挑出来的十个全翻过来变成10-M个正面M个反面,然后两堆都有10-M个正面就均分了
(重点是没有要求两堆总数一样)
【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21….
public class exp2 { public static void main(String[] args) { int i = 0; for (i = 1; i <= 20; i++) System.out.println(f(i)); } public static int f(int x) { if ((x == 1) || (x == 2)) { return 1; } else { return f(x - 1) + f(x - 2); } } } //或者 public class exp2 { public static void main(String[] args) { int i = 0; math mymath = new math(); for (i = 1; i <= 20; i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if ((x == 1) || (x == 2)) { return 1; } else { return f(x - 1) + f(x - 2); } } }
【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
public class exp2 { public static void main(String[] args) { int i = 0; math mymath = new math(); for (i = 2; i <= 200; i++) if (math.iszhishu(i) == true) { System.out.println(i); } } } class math { public int f(int x) { if ((x == 1) || (x == 2)) { return 1; } else { return f(x - 1) + f(x - 2); } } public boolean iszhishu(int x) { for (int i = 2; i <= (x / 2); i++) if ((x % 2) == 0) { return false; } return true; } }
【程序3】 题目:打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
public class exp2 { public static void main(String[] args) { int i = 0; math mymath = new math(); for (i = 100; i <= 999; i++) if (mymath.shuixianhua(i) == true) { System.out.println(i); } } } class math { public int f(int x) { if ((x == 1) || (x == 2)) { return 1; } else { return f(x - 1) + f(x - 2); } } public boolean iszhishu(int x) { for (int i = 2; i <= (x / 2); i++) if ((x % 2) == 0) { return false; } return true; } public boolean shuixianhua(int x) { int i = 0; int j = 0; int k = 0; i = x / 100; j = (x % 100) / 10; k = x % 10; if (x == ((i * i * i) + (j * j * j) + (k * k * k))) { return true; } else { return false; } } }
【程序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的值,重复执行第一步。
public class exp2{ public exp2(){} 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);///不能少这句,否则结果会出错 } public static void main(String[] args){ String str=""; exp2 c=new exp2(); 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+"="); c.fengjie(N); } }
【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a> b)?a:b这是条件运算符的基本例子。
import javax.swing.*; public class ex5 { public static void main(String[] args){ String str=""; str=JOptionPane.showInputDialog("请输入N的值(输入exit退出):"); int N; N=0; try{ N=Integer.parseInt(str); } catch(NumberFormatException e){ e.printStackTrace(); } str=(N>90?"A":(N>60?"B":"C")); System.out.println(str); } }
【程序6】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
最大公约数:
public class CommonDivisor { public static void main(String[] args) { commonDivisor(24, 32); } static int commonDivisor(int M, int N) { if ((N < 0) || (M < 0)) { System.out.println("ERROR!"); return -1; } if (N == 0) { System.out.println("the biggest common divisor is :" + M); return M; } return commonDivisor(N, M % N); } }
最小公倍数和最大公约数:
import java.util.Scanner; public class CandC { //下面的方法是求出最大公约数 public static int gcd(int m, int n) { while (true) { if ((m = m % n) == 0) return n; if ((n = n % m) == 0) return m; } } public static void main(String args[]) throws Exception { //取得输入值 //Scanner chin = new Scanner(System.in); //int a = chin.nextInt(), b = chin.nextInt(); int a=23; int b=32; int c = gcd(a, b); System.out.println("最小公倍数:" + a * b / c + " 最大公约数:" + c); } }
【程序7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为 ‘ ‘.
import java.util.Scanner; public class ex7 { public static void main(String args[]) { System.out.println("请输入字符串:"); Scanner scan=new Scanner(System.in); String str=scan.next(); String E1="[u4e00-u9fa5]"; String E2="[a-zA-Z]"; int countH=0; int countE=0; char[] arrChar=str.toCharArray(); String[] arrStr=new String[arrChar.length]; for (int i=0;i<arrChar.length ;i++ ) { arrStr[i]=String.valueOf(arrChar[i]); } for (String i: arrStr ) { if (i.matches(E1)) { countH++; } if (i.matches(E2)) { countE++; } } System.out.println("汉字的个数"+countH); System.out.println("字母的个数"+countE); } }
【程序8】 题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
import java.io.*; public class Sumloop { public static void main(String[] args) throws IOException { int s=0; String output=""; BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入a的值"); String input =stadin.readLine(); for(int i =1;i<=Integer.parseInt(input);i++) { output+=input; int a=Integer.parseInt(output); s+=a; } System.out.println(s); } } 另解: import java.io.*; public class Sumloop { public static void main(String[] args) throws IOException { int s=0; int n; int t=0; BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in)); String input = stadin.readLine(); n=Integer.parseInt(input); for(int i=1;i<=n;i++){ t=t*10+n; s=s+t; System.out.println(t); } System.out.println(s); } }
【程序9】 题目:一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数。
public class Wanshu { public static void main(String[] args) { int s; for (int i = 1; i <= 1000; i++) { s = 0; for (int j = 1; j < i; j++) if ((i % j) == 0) { s = s + j; } if (s == i) { System.out.print(i + " "); } } System.out.println(); } }
【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
public class Ex10 { public static void main(String[] args) { double s=0; double t=100; for(int i=1;i<=10;i++) { s+=t; t=t/2; } System.out.println(s); System.out.println(t); } }