java基本算法题及答案
来源:互联网 发布:无人机编队表演算法 编辑:程序博客网 时间:2024/06/02 20:37
基础中的基础题目。
题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一
对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21….
(斐波那契(Fibonacci)数列)
递归写法
public int count(int n){ int x=0; if (n<=0) { return 0; } if (n==1||n==2) { return 1; } else { return count(n-1)+count(n-2); }
递推写法:
public int count(int n){ //x,y表示第一个月和第二个月兔子对数 int x=1,y=1,result=0; if (n==0) { return 0; }if (n==1||n==2) { return 1; } else { for(int i=0;i<n-2;i++){ //f(n)=f(n-1)+f(n-2) result=x+y; //f(n-1)=f(n) y=result; //f(n-2)=f(n-1) x=y; } } return result;
题目2:判断101-200之间有多少个素数,并输出所有素数。
思路:用一个数分别去除2到这个数,如果能被整除,
则表明此数不是素数,反之是素数。
for(int j=101;j<201;j++) { for(int i=2;i<j;i++) { if (j%i==0) { break; }else { System.out.println(j); break; } } }
题目3:打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字 立方和等于该数本身。
例如:
153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
public class Demo { //得到各个位置的数字 int solution(int n){ int x=n/100; n-=(x*100); int y=n/10; n-=(y*10); int z=n; return x*x*x+y*y*y+z*z*z; } public static void main(String[] args) { Demo queueDemo=new Demo(); for (int i = 100; i < 1000; i++) { if (i==queueDemo.solution(i)) { System.out.println(i); } }}}
题目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的值,重复执行第一步。
void solution(int n){ for(int i=2;i<n/2;i++){ if (n%i==0) { System.out.print(i+"*"); solution(n/i); } } System.out.println(n); System.exit(0);;
题目5:
利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下
的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。
System.out.println(n>=90?"A":(n>=60?"B":"C"));
题目6:输入两个正整数m和n,求其最大公约数和最小公倍数。
//最小公倍数,从两个数中最大的数逐一往上找,满足条件的第一个即为最小公倍数void min_solution(int m,int n){ for(int i=(m>n?n:m);i<=m*n;i++) { if(i%m==0 && i%n==0) { System.out.println("最小公倍数为"+i); break; } }}//最大公约数,从两个数中较小的开始逐一往小的找,满足条件的第一个数即为最大公约数void max_solution(int m,int n){ for(int i=(m>n?n:m);i>0;i--){ if (n%i==0 && m%i==0) { System.out.println("最大公约数"+i); break; } } }
题目7:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
public static void main(String[] args) { int x=30,y=15; Demo demo=new Demo(); String s="sadfa8683423 sd22 ......a"; char[] a=s.toCharArray(); demo.solution(a); } private void solution(char[] a) { int x=0,y=0,z=0,k=0; char c; for (int i = 0; i < a.length; i++) { c = a[i]; //字母 if ((c>='a'&& c<='z')||(c>='A' && c<='z')) { x++; } //数字 else if (c>='0' && c<='9') { y++; } //空格 else if(c==' ') { z++; } //其他字符 else { k++; } } System.out.println("字母有"+x+"个,数字有"+y+"个,空格有"+z+"个,其他字符有"+k+"个"); }
题目8:
求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),
几个数相加由键盘控制。
private void solution(int x,int num) { //num为键盘控制有几个数相加 //x为要想加的数字 int result=0,temp=0; for(int i=0;i<num;i++) { temp=result+(int) (Math.pow(10, i)*x); result+=temp; } System.out.println(result); }
题目9:一个数如果恰好等于它的因子之和,这个数就称为”完数”。例如6=1+2+3.编程 找出1000以内的所有完 数。
public static void main(String[] args) { Demo demo=new Demo(); for(int i=1;i<=1000;i++){ demo.solution(i); } } private void solution(int x) { int result=0; //set集合不能存放相同的元素,所以选择set来做 Set< Integer> set=new HashSet<>(); for (int i = 1; i < x; i++) { if (x%i==0) { //得到两个因子 set.add(x/i); set.add(i); } } Iterator<Integer> inIterator=set.iterator(); while (inIterator.hasNext()) { result+=inIterator.next(); } //记得减掉一个x,因为在前面遍历的时候加上了 if ((result-x)==x) { System.out.println(x); } }
题目10:题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
public static void main(String[] args) { Demo demo=new Demo(); int x=0,y=0; for(int i=1;i<=100;i++){ x=i+100; y=i+268; if (demo.solution(x)==0&&demo.solution(y)==0) { System.out.println(i); } } } private int solution(int x) { //得到平方根后的字符串 String s=String.valueOf(Math.sqrt(x)); //进行切割,注意:String.split()方法中里面的参数如果是".\"等转义字符,要在前面增加"\\" String[] spilt=s.split("\\."); if (spilt[1].length()>1) { return -1; }else if (spilt[1].equals("0")) { return 0; }else { return -1; } } 结果为21.
题目11:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
public static void main(String[] args) { double result=0; double up=2,down=1; for(int i=1;i<22;i++){ result+=up/down; double temp=down; down=up; up+=temp; } System.out.println(result); }
题目12:求1+2!+3!+…+20!的和 (递归做,这里懒得写了)
题目13:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
public static void main(String[] args) { int num=2345; for(int i=1;i<6;i++) if ((num/Math.pow(10, i))<10&&(num/Math.pow(10, i))>1) { System.out.println("这是"+(i+1)+"位数"); } //翻转整数 int temp=num; int result=0; while (temp!=0) { result=result*10+temp%10; temp/=10; } System.out.println(result); }
题目14:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
public static void main(String[] args) { String num="12344321"; char[] a=num.toCharArray(); for (int i = 0,j=a.length-1; i <a.length/2; i++,j--) { if (a[i]!=a[j]) { System.out.println("不是回文"); break; } } }
题目15:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
public static void main(String[] args) { final int n = 10; final int flag = 3; List<Integer> mans = new ArrayList<Integer>(); for (int i = 0; i < n; i++) { mans.add(i + 1); } System.out.println("初始化编号为" + mans + "的" + mans.size() + "个人围成一圈"); ListIterator<Integer> iter = null; int k = 1; do { iter = mans.listIterator(); while (iter.hasNext()) { int i = iter.next(); if (k++ % flag == 0) { System.out.println("编号" + i + "的人退出圈子"); iter.remove(); k = 1; } } } while (mans.size() > 1); System.out.println("剩下编号为" + mans + "的" + mans.size() + "个人"); }
- java基本算法题及答案
- java笔试算法题及答案
- java笔试算法题及答案
- JAVA经典算法面试15题及答案
- 【JAVA经典算法面试40题及答案】
- Java算法面试题及答案
- 几何的基本算法常见问题及答案收集(转)
- java笔试题及答案
- Java 笔试题及答案
- java编程题及答案
- Java笔试题及答案
- 几个算法测试题及答案
- Oracle基本练习题及答案
- USB基本问题及答案
- USB基本问题及答案
- USB基本问题及答案
- 趣味Java算法题(附答案)
- Java笔试常见题题目及答案
- 插入排序
- Android实现网络多线程断点续传下载原理
- USB 3G dongle E303在android4.4上的移植支持
- KVC 与 KVO
- 【CSS学习】CSS 边框
- java基本算法题及答案
- Java线程中run和start方法的区别
- vs中编译选项MD、MDd、MT的区别
- 【剑指Offer面试题】 九度OJ1523:从上往下打印二叉树
- UVA - 11354Bond最小生成树,LCA寻找最近公共祖先
- ListView适配器BaseAdapter
- 微软沈向洋:计算机视觉未来在语义层 “两大一精”是关键
- 机试算法讲解: 第49题 动态规划之最长递增子序列问题
- 【练习笔记】剑指offer-面试题7 :用两个栈实现队列