java经典40道编程题(1~10)
众所周知,逻辑思维能力是一个程序员非常重要的一种能力。因为它往往决定了你工作的效率和学习的效率,甚至是职业的高度。所以,提升自己的思维能力是每个程序员的必修课。提升思维能力对我们大有裨益。不管在哪一行哪一业,较强的逻辑思维能力都能让你脱颖而出,出色地完成工作!接下来,我会陆续更新一些Java中经典的编程题来帮助大家提升自己。
#第一题
菲波拉契数列:
- 有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
参考答案
package clasicaltest;
import java.util.Scanner;
/*
* 菲波拉契数列:
* 有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
*/
public class Test1 {
public static void main(String[] args) {
int month,number;
System.out.println("请问是第几个月兔子的数量?");
Scanner sc=new Scanner(System.in);
month=sc.nextInt();
number=fibo(month);
System.out.println("第"+month+"个月的兔子数为:"+number);
sc.close();
}
private static int fibo(int month) {
int f;
if(month==1||month==2) {//递归结束条件
f=1;
}else {
f=fibo(month-1)+fibo(month-2);//递归调用
}
return f;
}
}
第二题:
- 判断 101-200 之间有多少个素数,并输出所有素数。
参考答案
package clasicaltest;
/*
* 判断 101-200 之间有多少个素数,并输出所有素数。
*/
public class Test2 {
public static void main(String[] args) {
int i,j,k=0,h=0;//k用来判断被整除数的个数,h用来控制1行输出的数字个数
for(i=101;i<200;i++) {//查找101至200的素数
for(j=1;j<=i;j++) {
if(i%j==0) {
k++;
}
}
if(k==2) {//2代表i为素数
System.out.print(i+" ");
h++;
if(h==5) {//5个数字后换行
System.out.println();
h=0;//重置h
}
}
k=0;
}
}
}
第三题
- 打印所有的水仙花数
参考答案
package clasicaltest;
/*
* 打印所有的水仙花数
*/
public class Test3 {
public static void main(String[] args) {
int i,j,k;
int number;
for(number=100;number<1000;number++){
i=number/100;//获取百位数
j=(number/10)%10;//获取十位数
k=number%10;//获取个位数
if(i*i*i+j*j*j+k*k*k==number){//判断是否为水仙花数?
System.out.println(number+" ");//输出水仙花数
}
}
}
}
第四题
题目:将一个正整数分解质因数。例如:输入 90,打印出 90=233*5
*参考答案
package clasicaltest;
import java.util.*;
/*
* 题目:将一个正整数分解质因数。例如:输入 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 的值,重复执行第一步。
*/
public class Test4 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
System.err.println("请输入一个数:");
int x = input.nextInt();
System.out.print(x + "= ");
int i = 2;
while (i <= x) { // 使用循环来找到可以被整除的数,然后通过out函数输出
if (i == x)// 如果相等的话,就说明这个数没有因数,只有1和它自己;
{
System.out.println(i);
break;
} else if (x % i == 0)// 如果这个数有因数,然后找到除去这个因数后的值,继续循环
{
System.out.print(i + "*");
x = x / i;
} else // 如果都不满足,则继续循环,
{
i++;
}
}
}
}
第五题
三目运算符:利用条件运算符的嵌套来完成此题:学习成绩> =90 分的同学用 A 表示,60-89 分之间的用 B 表示,60 分以下的用 C 表示。
*参考答案
package clasicaltest;
import java.util.Scanner;
/*
* 三目运算符:利用条件运算符的嵌套来完成此题:学习成绩> =90 分的同学用 A 表示,60-89 分之间的用 B 表示,60 分以下的用 C 表示。
*/
public class Test5 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
System.err.println("请输入一个成绩:");
int x = input.nextInt();
char grade = (x >= 90) ? 'A' : (x >= 60) ? 'B' : 'C';
System.out.println("该学生的成绩水平是:\t" + grade);
}
}
第六题
题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数
*参考答案
package clasicaltest;
/*
* 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数
*/
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
System.out.println("求最大公约数和最小公倍数");
Scanner sc = new Scanner(System.in);
System.out.print("输入第一个数:");
int number1 = sc.nextInt();
System.out.print("输入第二个数:");
int number2 = sc.nextInt();
int number3 = number2;// 用number3保留第二个数
int number4 = number1;// 用number3保留第1个数
// 求最大公约数
// 设用户输入的两个整数为number1和number2,且number1>number2,余数i=number1%number2。
// 当余数不为0时,把除数赋给number1做被除数,把余数赋给number2做除数,
// 再求得新余数,若还不为0再重复直到余数为0,此时number2就是最大公约数
if (number1 < number2) {// 互换
int z = number1;
number1 = number2;
number2 = z;
}
int i = number1 % number2;
while (i != 0) {
number1 = number2;
number2 = i;
i = number1 % number2;
}
System.out.println("最大公约数为:" + number2);
System.out.println("最小公倍数为:" + (number4 * number3) / number2);// 最小公倍数=两个数相乘/最大公约数
sc.close();
}
}
第七题
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
参考答案
package clasicaltest;
/*
* 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
*/
import java.util.Scanner;
public class Test7 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("请输入一行字符串:");
String str = input.nextLine();
int digital = 0, character = 0, other = 0, blank = 0;
char[] ch = str.toCharArray();// String的方法,将字符串转换为字符数组;
for (int i = 0; i < ch.length; i++) {
if (ch[i] >= 'a' && ch[i] <= 'z' || ch[i] >= 'A' && ch[i] <= 'Z')
character++;
else if (ch[i] >= '0' && ch[i] <= '9')
digital++;
else if (ch[i] == ' ')
blank++;
else
other++;
}
System.out.println("字母个数:" + character);
System.out.println("数字个数:" + digital);
System.out.println("空格个数:" + blank);
System.out.println("其他个数:" + other);
}
}
第八题
求 s=a+aa+aaa+aaaa+aa…a 的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此时共有 5 个数相加),几个数相加由键盘控制
参考答案
package clasicaltest;
/*
* 求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此时共有 5 个数相加),几个数相加由键盘控制
*/
import java.util.Scanner;
public class Test8 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("请输入个位数字a:");
int single = input.nextInt();
int a=single;
System.out.println("请输入最高位数:");
int max = input.nextInt();
int n=max;
int sum = 0,temp = 0;
for (int i = 0; i < max; i++) {
temp = single + temp; //先把本次要加的值赋值给temp;
single *= 10; //每次把单数乘以10,向前进一位,加上之前的temp正好满足需要
sum = sum + temp; //把每次的temp相加起来就是要的结果
}
System.out.println("数字"+a+"共有"+n+"个数相加的结果为:"+sum);
}
}
第九题
一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如 6=1+2+3.编程找出 1000 以内的所有完数
参考答案
package clasicaltest;
/*
* 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如 6=1+2+3.编程找出 1000 以内的所有完数
*/
public class Test9 {
public static void main(String[] args) {
System.out.println("0~1000内的完数为:");
for (int i = 1; i <= 1000; i++) {
int sum = 0;
for (int j = 1; j <= i / 2; j++) {// 因子只能在1~i/2里面找
if (i % j == 0) {
sum = sum + j;// 将因子相加
}
}
if (sum == i) {
System.out.print(i + " ");
}
}
}
}
第十题
一球从 100 米高度*落下,每次落地后反跳回原高度的一半;再落下,求它在第10 次落地时,共经过多少米?第 10 次反弹多高?
参考答案
package clasicaltest;
/*
* 一球从 100 米高度*落下,每次落地后反跳回原高度的一半;再落下,求它在第10 次落地时,共经过多少米?第 10 次反弹多高?
*/
public class Test10 {
public static void main(String[] args) {
double height=100;//原始高度
double chheight=0;//弹跳后高度
double sum=0;//落下后在弹起的高度,之后还没落下
double allsum=0;//全过程经过的路程
for(int i=1;i<=10;i++) {
chheight=height/2;//每次弹起的高度为上次的一半
System.out.println("第"+i+"次反弹高度为:"+chheight);
sum=height+chheight;
System.out.println("经过了"+sum+"米");
allsum+=height+chheight;
height=chheight;//将新的弹跳高度赋给初始高度
}
System.out.println("全过程共经过了"+allsum+"米");
}
}
休息一下,稍后更加精彩!