每年开年企业公司招聘的高峰期,同时有许多的朋友也出来找工作。现在的招聘他们有时会给你出一套面试题或者智力测试题,也有的直接让你上机操作,写一段程序。算法的计算不乏出现,基于这个原因在网上搜集了一些算法上的题型。希望对于大家有所帮助
【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21….
解法一:
<span style="font-size:32px;color:#ff0000;"><strong>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); } }</strong></span>解法二:
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之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
解法:
<span style="font-size:32px;color:#ff0000;">public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++) if(mymath.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; } }</span>
【程序3】 题目:打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用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,j=0,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的值,重复执行第一步。
解法:
<span style="color:#ff0000;">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); } }</span>【程序 5 】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析:利用while语句,条件为输入的字符不为 ‘\n’‘.’
解法:
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); } }【程序6】题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值
解法一:
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); } }【程序7】 题目:一球从100米高度*落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
解法:
<span style="color:#ff0000;">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); } }</span>【程序8】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
解法:
<span style="color:#ff0000;">public class Wanshu { public static void main(String[] args) { int i=0; int j=0; int k=0; int t=0; for(i=1;i<=4;i++) for(j=1;j<=4;j++) for(k=1;k<=4;k++) if(i!=j && j!=k && i!=k) {t+=1; System.out.println(i*100+j*10+k); } System.out.println (t); } }</span>【程序9】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x与y的值进行交换,然后再用x与z进行比较,如果x> z则将x与z的值进行交换,这样能使x最小。
解法:
import java.util.*; public class test { public static void main (String[]args){ int i=0; int j=0; int k=0; int x=0; System.out.print("请输入三个数\n"); Scanner input = new Scanner(System.in); i=input.nextInt(); j=input.nextInt(); k=input.nextInt(); if(i>j) { x=i; i=j; j=x; } if(i>k) { x=i; i=k; k=x; } if(j>k) { x=j; j=k; k=x; } System.out.println(i+", "+j+", "+k); } }【程序10】 题目:输出9*9口诀。
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
解法一:
public class jiujiu { public static void main(String[] args) { int i=0; int j=0; for(i=1;i<=9;i++) { for(j=1;j<=9;j++) System.out.print(i+"*"+j+"="+i*j+"\t"); System.out.println(); } } }解法二:不出现重复的乘积(下三角)
public class jiujiu { public static void main(String[] args) { int i=0; int j=0; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) System.out.print(i+"*"+j+"="+i*j+"\t"); System.out.println(); } } }解法三:(上三角)
public class jiujiu { public static void main(String[] args) { int i=0; int j=0; for(i=1;i<=9;i++) { for(j=i;j<=9;j++) System.out.print(i+"*"+j+"="+i*j+"\t"); System.out.println(); } } }【程序11】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
解法一:
public class 猴子吃桃 { static int total(int day){ if(day == 10){ return 1; } else{ return (total(day+1)+1)*2; } } public static void main(String[] args) { System.out.println(total(1)); } }
【程序12】 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
解法一:
import java.util.ArrayList; public class pingpang { String a,b,c; public static void main(String[] args) { String[] op = { "x", "y", "z" }; ArrayList<pingpang> arrayList=new ArrayList<pingpang>(); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { pingpang a=new pingpang(op[i],op[j],op[k]); if(!a.a.equals(a.b)&&!a.b.equals(a.c)&&!a.a.equals("x") &&!a.c.equals("x")&&!a.c.equals("z")){ arrayList.add(a); } } for(Object a:arrayList){ System.out.println(a); } } public pingpang(String a, String b, String c) { super(); this.a = a; this.b = b; this.c = c; } @Override public String toString() { return "a的对手是"+a+","+"b的对手是"+b+","+"c的对手是"+c+"\n"; } }
【程序13】 题目:打印出如下图案(菱形)
*
***
******
********
******
***
*
程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。
三角形:
<span style="color:#ff0000;">public class StartG { public static void main(String [] args) { int i=0; int j=0; for(i=1;i<=4;i++) { for(j=1;j<=2*i-1;j++) System.out.print("*"); System.out.println(""); } for(i=4;i>=1;i--) { for(j=1;j<=2*i-3;j++) System.out.print("*"); System.out.println(""); } } }</span>菱形:
<span style="color:#ff0000;">public class StartG { public static void main(String [] args) { int i=0; int j=0; for(i=1;i<=4;i++) { for(int k=1; k<=4-i;k++) System.out.print(" "); for(j=1;j<=2*i-1;j++) System.out.print("*"); System.out.println(""); } for(i=4;i>=1;i--) { for(int k=1; k<=5-i;k++) System.out.print(" "); for(j=1;j<=2*i-3;j++) System.out.print("*"); System.out.println(""); } } }</span>【程序14】 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
解法一:
<span style="color:#ff0000;">import java.util.Scanner; public class Ex25 { static int[] a = new int[5]; static int[] b = new int[5]; public static void main(String[] args) { boolean is = false; Scanner s = new Scanner(System.in); long l = s.nextLong(); if (l > 99999 || l < 10000) { System.out.println("Input error, please input again!"); l = s.nextLong(); } for (int i = 4; i >= 0; i--) { a[i] = (int) (l / (long) Math.pow(10, i)); l = (l % (long) Math.pow(10, i)); } System.out.println(); for (int i = 0, j = 0; i < 5; i++, j++) { b[j] = a[i]; } for (int i = 0, j = 4; i < 5; i++, j--) { if (a[i] != b[j]) { is = false; break; } else { is = true; } } if (is == false) { System.out.println("is not a Palindrom!"); } else if (is == true) { System.out.println("is a Palindrom!"); } } }</span>【程序15】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
解法一:
<span style="color:#ff0000;">import java.util.Scanner; public class Ex26 { public static void main(String[] args){ //保存用户输入的第二个字母 char weekSecond; //将Scanner类示例化为input对象,用于接收用户输入 Scanner input = new Scanner(System.in); //开始提示并接收用户控制台输入 System.out.print("请输入星期值英文的第一个字母,我来帮您判断是星期几:"); String letter = input.next(); //判断用户控制台输入字符串长度是否是一个字母 if (letter.length() == 1){ //利用取第一个索引位的字符来实现让Scanner接收char类型输入 char weekFirst = letter.charAt(0); switch (weekFirst){ case 'm': //当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能 case 'M': System.out.println("星期一(Monday)"); break; case 't': //当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能 case 'T': System.out.print("由于星期二(Tuesday)与星期四(Thursday)均以字母T开头,故需输入第二个字母才能正确判断:"); letter = input.next(); //判断用户控制台输入字符串长度是否是一个字母 if (letter.length() == 1){ //利用取第一个索引位的字符来实现让Scanner接收char类型输入 weekSecond = letter.charAt(0); //利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能 if (weekSecond == 'U' || weekSecond == 'u'){ System.out.println("星期二(Tuesday)"); break; //利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能 } else if (weekSecond == 'H' || weekSecond == 'h'){ System.out.println("星期四(Thursday)"); break; //控制台错误提示 } else{ System.out.println("输入错误,不能识别的星期值第二个字母,程序结束!"); break; } } else { //控制台错误提示 System.out.println("输入错误,只能输入一个字母,程序结束!"); break; } case 'w': //当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能 case 'W': System.out.println("星期三(Wednesday)"); break; case 'f': //当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能 case 'F': System.out.println("星期五(Friday)"); break; case 's': //当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能 case 'S': System.out.print("由于星期六(Saturday)与星期日(Sunday)均以字母S开头,故需输入第二个字母才能正确判断:"); letter = input.next(); //判断用户控制台输入字符串长度是否是一个字母 if (letter.length() == 1){ //利用取第一个索引位的字符来实现让Scanner接收char类型输入 weekSecond = letter.charAt(0); //利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能 if (weekSecond == 'A' || weekSecond == 'a'){ System.out.println("星期六(Saturday)"); break; //利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能 } else if (weekSecond == 'U' || weekSecond == 'u'){ System.out.println("星期日(Sunday)"); break; //控制台错误提示 } else{ System.out.println("输入错误,不能识别的星期值第二个字母,程序结束!"); break; } } else{ //控制台错误提示 System.out.println("输入错误,只能输入一个字母,程序结束!"); break; } default: //控制台错误提示 System.out.println("输入错误,不能识别的星期值第一个字母,程序结束!"); break; } } else{ //控制台错误提示 System.out.println("输入错误,只能输入一个字母,程序结束!"); } } }</span>以上解法仅供参考!希望对大家有用