您的位置:首页 > 编程语言 > Java开发

java基本算法题及答案

2015-08-01 14:52 399 查看

基础中的基础题目。

题目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() + "个人");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: