java50道经典逻辑题

萌到你眼炸
923次浏览
2021年01月21日 02:23
最佳经验
本文由作者推荐

学生会工作总结ppt-

2021年1月21日发(作者:卜履吉)
題目:
古典问题:有一对兔子,
从出生后第
3
个月起每个月都生一对 兔子,
小兔子长到第三
个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多 少?

【程序
1


題目:
古典问题:有一对兔子 ,
从出生后第
3
个月起每个月都生一对兔子,
小兔子长到第三
个月后 每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

分析:
咋一看 不知道如何下手,
但是你在草稿纸上写写分析一下,
就很快发现其中的规律了

package
logic;

import
r;

public
class
RabbitNum
{
public
static
void
main(String[]
args) {
Scanner
in
=
new
Scanner();

n(
你想知道前几
个月的兔子的数量

int
month
=
t();

int[]
mon
=
new
int[month];
if(month
<
3){
n(


+
month
+

个月有

1
对兔子,共

2


}
else
for(int
i
=
2;
i
<
month; i++){ mon[0] = mon[1] = 1; mon[i] = mon[i - 1] + mon[i - 2]; (


%d

月有

%d
对兔子,共

%d
只兔子
n


【程序
2


题目:判断
101-200
之间有多少个素数,并输出所有素数。

分析:如果知道素数是什么,该题就应该不难了

package
logic;

public
class
Prime
{
public
static
void
main(String[]
args)
{
(
中的素数有:

for(int
i
=
101;
i
<=
200;
i++){
if(isPrime(i))
(

//isPrime
方法用来判断一个数是否是素数

private static boolean
isPrime(int i) { // TODO Auto- generated method stub for(int j = 2; j <= (i); j++){ if(i % j ==
0) return false; } return true; } }


【程序
3


题目:打 印出所有的

水仙花数

,所谓

水仙花数

是指 一个三位数,其各位数字立方和等于
该数本身。

例如:
153
是一 个

水仙花数

,因为
153=1
的三次方+
5
的三次方+
3
的三次方。

分析:解决这个题目主要要知道怎么把一个数的各个位上的数拆分出来

package
logic;

import
r;

public
class
NarcissisticNum
{
public
static
void
main(String[] args) { Scanner in = new Scanner();

(
水仙花数有:

for(int
num
=
100;
num
<
1000;
num++){
if(isNarcissisticNum(num))
n(

+
num);
}
}

//
















private
static
boolean
isNarcissisticNum(int num) { // TODO Auto-generated method stub int a = num / 100;
//


出百位

a int b = (num / 10) % 10; //
分离出十位

b int c = num % 10;
//






c
int
sum = a * a * a + b * b * b + c * c * c; if(sum == num) return true; else return false; } }


【程序
4


题目:将一个正整数分解质因数 。例如:输入
90,
打印出
90=2*3*3*5


(1 )
如果这个质数恰等于
n
,则说明分解质因数的过程已经结束,打印出即可。

(2)
如果
n>k
,但
n
能被
k
整除,则 应打印出
k
的值,并用
n
除以
k
的商
,
作 为新的正整数你
n,
重复执行第一步。

(3)
如果
n不能被
k
整除,则用
k+1
作为
k
的值
,重复执行第一步。

分析:按步骤实现就可以了(有多种实现方式,以下代码供参考。我也参考了别人的)

package logic;

import r;

public class PrimeFactorOfInteger { public static void
main(String[] args) { Scanner input = new Scanner();

n(
请输入一个



3





int
num
=
t();
(num
+





:
factor(num); }

private static void factor(int num) { // TODO Auto-generated method stub for(int
i
=
2;
i
<=
(num); i++){
if(num
%
i
==
0){
(i
+

*

if(isPrime(num
/
i)){
n(num
/
i);
}
else
factor(num
/
i);
break;
}
}
}

private
static
boolean
isPrime(int i) { // TODO Auto- generated method stub for(int j = 2; j <= (i); j++){ if(i % j ==
0) return false; } return true; } }


【程序
5


题目:< br>利用条件运算符的嵌套来完成此题:
学习成绩
>=90
分的同学用
A< br>表示,
60-89
分之间
的用
B
表示,
60
分以下的用
C
表示。

分析:这题应该是最简单的吧

package
logic;

import
r;

public
class
ConditionalOperator
{
public
static
void
main(String[]
args) {
Scanner
in
=
new
Scanner();

n(
请输入你的分


int
score
=
t();

if(score
>=
90){
n(
恭喜

}
else
if(score
>=
60){ n(
不错

加油



【程序
6


题目:输入两个正整数
m

n
,求其最大公约数和最小公倍数。

分析:需要了解求最大公约数和最小公倍数的方法

package logic;

import r;

public class Example6 { public static void main(String[]
args)
{
Scanner
in
=
new
Scanner();

n(
请输入第一个数

int
a
=
t(); n(
请输入第二个数


n(

两个数的最大公约数是


这两个数的最小公
倍数是



private static int MaxCommonDivisor(int a, int b) { //
TODO Auto-generated method stub if(a < b){ int temp = a; a = b; b = temp; } while(a % b != 0){ int
temp = a % b; a = b; b = temp; } return b; }

private static int MinCommonMultiple(int a, int b)
{ // TODO Auto-generated method stub return a * b / MaxCommonDivisor(a, b); } }



【程序
7


题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

分析:这题也比较简单,知道怎么表示字母、空格、数字就
OK
package logic;

import r;

public class Statistic { public static void main(String[]
args) { Scanner in = new Scanner();

n(
=
ne();

int
letter
=
0,
symbol
=
0,
space
=
0,
number
=
0;
char[]
strArray
=
Array(); for (int i = 0; i < i++) { char c = strArray[i]; if(('a' <= c
&& c <= 'z') || ('A' <= c && c <= 'Z')) letter++; else if(48 <= c &&
c <= 57)
//
注意!
数字
0-9

AS CII
码是
48-57 number++; else if(c == ' ') space++; else
symbol++;
}
n(
sentance
have

+
letter
+

letters,

n(

number
+

numbers,

n(

+
space
+

spaces,



【程序
8


题目:求
s=a+aa+aaa+aaaa+ aa...a
的值,其中
a
是一个数字。例如
2+22+222+2222+ 22222(

时共有
5
个数相加
)
,几个数相加有键盘控 制。

分析:其实跟分解一个数的各个位数的方法类似

package logic;

import r;

public class Example8 { public static void main(String[]
args) { Scanner input = new Scanner();

n(
请输入相加的基数

= t(); n(
请输入要相加的个数


long total
=
0L;
long
temp
=
n;
for(int
j
=
0;
j
<
i;
j++){
total
+=
temp;
temp
=
temp
*
10
+
n;
}
n(
和为



【程序
9

题目:一个数如果恰好等于它的因子之和,这个数就称为

完数

。例如6=1

2

3.
编程



1000
以内的所有完数。

分析:跟求一个数的素因数有类似的地方,但这里的因子可以不是素数

package
logic;

import
r;

public
class
WholeNumber
{
public
static
void
main(String[] args) { n(
以内的完数有:

num++){
isWholeNumber(num);
}
}

private
static
void
isWholeNumber(int
num)
{
//
TODO
Auto-generated method stub int sum = 0; for(int i = 1; i <= num / 2; i++){ if(num % i == 0){ sum +=
i; } }

if(sum == num) n(num); } }


【程序
10


题 目:一球从
100
米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在


10
次落地时,共经过多少米?第
10
次反弹多高?

分析:注意弹球一上一下的距离

package
logic;

import
r;

public
class
Pinball
{
public
static
void
main(String[]
args) { Scanner in = new Scanner();

n(
请输入原始高度。

=
uble();
n(
要求第几次落地后的距离。

int
n
=
t();

double
total
=
s;
(

%d
次落地后共走的
距离是:

,
n);
if(n
==
1)
{ n(total); (

%d
次反弹的距离是
%f


i = 1; i < n; i++) { s = s / 2; total += 2 * s; //
一上一下共两倍的弹跳距离

}
(total);
n(); (

%d
次反弹的距离是
%f



【程序
11
】题目:有
1

2

3

4
个数字,能组成多少个互不相同且无重复数字的三位数?
都是多少?分析:
这里不免会联想到高中学的排列组合,
但这里并不能用排列组合解决问题。
这里其实不难,用三 层循环,去掉不合要求的就行了

package logic;

public class Three_digitNum { public static void main(String[] args) { int i, j, k;
//
分别代表个、十、百位

int num;
/
/
用来输出符合要求的三位数

int count = 0;
//




符合要求的三位数有多少个


n(
符合要求的三位数有:

for(i
=
1;
i
<=
4;
i++){ for(j = 1; j <= 4; j++){ if(i != j)
//
提前把有重复的部分情况过滤掉,
减少运行次数,优化性


for(k = 1; k <= 4; k++){ if(i != k && j != k){ num = i + j * 10 + k * 100; n(num);
count++; } } } } n(
符合要求的三位数共有






【程序
12


题目:企业发放的奖金根据利润提成。利润
(I)
低于或等于
10
万元时,奖金可提
10%
;利润
高于
10
万元,低于
20
万元时,低于
10
万元的部分


10%
提成,
高于
10
万元的部分,
可提成7.5%

20
万到
40
万之间时,
高于
20
万元的部分,
可提成
5%

40
万到
60
万之间时高于
40
万元的部

分,可提成
3%

6 0
万到
100
万之间时,高于
60
万元的部分,可提成
1. 5%
,高于
100
万元
时,超过
100
万元的部分按
1%
提成,从键盘输入当

月利润
I
,求应发放奖金总数?

分析:我可以说这是一个数学题么?分好区间用条件运算符

if
else
就能解决,跟程序
5

似。
(代码略,相信你可以)



【程序
13


题目:
一个整数,< br>它加上
100
后是一个完全平方数,
再加上
168
又是一个完 全平方数,
请问
该数是多少?

分析:一个整数

i
,加上
100
是一个数

j
的平方,再加上
168
又是一个数

k
的平方,所以
用三层循环可以解决问题

package logic;

public class FundNum { public static void main(String[] args) { long i, j, k; for(i = 1;
i < 100000; i ++) { for(j = 0; j < 1000; j++) { if(j * j == i + 100) { for(k = j; k < 1000; k++) { if(k * k == i
+ 268) n(i); } } } } } }



【程序
14


题目:输入某年某月某日,判断这一天是这一年的第几天?

分析:用到

switch
,还要判断平润年

package logic;

import r;

public class DayOfYear { public static void main(String[]
args)
{
Scanner
in
=
new
Scanner();

n(
请输入年份。

int
year
=
t(); n(
请输入月份。


输入日期。


int sum = 0;; switch(month - 1) { case 0: sum = 0; break;
case 1: sum = 31; break; case 2: sum = 59; break; case 3: sum = 90; break; case 4: sum = 120;
break; case 5: sum = 151; break; case 6: sum = 181; break; case 7: sum = 212; break; case 8: sum
= 243; break; case 9: sum = 273; break; case 10: sum = 304; break; case 11: sum = 334; break; }
if((month > 2)&&isLeap(year)) (
这天是这年第
%d
天。

(
这天是这年第
%d
天。


private static boolean isLeap(int year)
{ if(((year % 100 != 0)&&(year % 4 == 0)) || (year % 400 == 0)) return true; else return false; } }



【程序
15


题目:输入三个整数
x,y,z
,请把这三个数由小到大输出。

分析:可以用条件循环,也可以用排序

算法(插入排序、冒泡排序、选择排序等)

<

>
条件循环

package
logic;

import
r;

public
class
MinOfThree
{
public
static
void
main(String[]
args) {
Scanner
in
=
new
Scanner();

n(
请输入三个整


请输入第
1
个整数

请输入第2
个整数

int
b
=
t();
n(
请输入第
3
个整数

int
c
=
t();
(
从小到大的顺序为:

c); }else{ if(a < c) (
a,
b);
}
}else{
if(c
<
b){
(
c,
b,
a);
}else{
if(c
<
a)
(


<

>
排序算法

参考
java
里的
4
种排序算法



【程序
16


题目:输出
9*9
口诀。

分析:二层循环搞定

package logic;

public class JiujiuBiao { public static void main(String[] args) { for (int i = 1; i < 10;
i++) { for (int j = 1; j <= i; j++) { int total = 0; total = i * j;

(
total); } n(); } } }



【程序
17


题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个

第二天早上又将剩下的桃子吃掉一半,又多吃了

一个。
以后每天早上都吃了前一天剩下

的一半零一个。
到第
10
天早上想再吃时,
见只剩下
一个桃子了。求第一天共摘了多少。
分析:用逆思维推推就明白了。第
10
天有一个桃子,第
9
天有
3
个,第
8
天有
7
个,
......
package logic;

public class EatPeach { public static void main(String[] args) { int total = 1;

//day
= 1
的时候,算出来的
total
其实是第
9
天有的桃子

//day = 9
的时候,算出来的
total
就是第
1
天的桃子

for(int day = 1; day < 10; day++){ total = 2 * (total + 1); }

n(
一开
始共有


桃子




【程序
18


题目:两个乒乓球队进行比赛,各出三人。甲队为< br>a,b,c
三人,乙队为
x,y,z
三人。已抽签决
定比赛名单。有人 向队员打听比赛的名单。

a
说他不和
x
比,
c
说 他不和
x,z
比,请编程序找出三队赛手的名单。

分析:答案很简单,可用程序却感觉不怎么好表达、实现。我还是参考了网上的代码

package logic;

public class MatchCP { public static void main(String[] args) { char i, j, k;
//i,j,k

别是
a,b,c
的对手

for(i
=
'X';
i
<=
'Z';
i++){
for(j
=
'X';
j
<=
'Z'; j++){ if(i != j){ for(k = 'X'; k < 'Z'; k++){ if(i != k && j != k){ if(i !=
'X' && k != 'X' && k != 'Z') (
-- %c



【程序
19


题目:打印出如下图案(菱形)

*
***
*****
*******
*****
***
*
分析:主要就是控制格式,先输出上半部分,再输出下半部分

package logic;

public class Prismatic { public static void main(String[] args) { for(int i = 0; i < 4;
i++){ //1

4


for(int j = 1; j <= (6 - 2 * i) / 2; j++){
//
每行前面的空格数

(

每行的
*


}
n();

//
换行

} //
下半部分

for(int i = 0; i < 3; i++){ for(int j = 0; j < i + 1; j++){ (




【程序
20

< br>题目:有一分数序列:
2
/1

3
/
2
,< br>5
/
3

8
/
5

13
/
8

21
/13...
求出这个数列的前
20
项之 和。

分析:相信大家不难找出规律,实现也不难

package logic;

public class FractionSum { public static void main(String[] args) { float i = 2.0f, j =
1.0f; //i
为分子,
j
为分母

float num = 2.0f;
/
/num
是分数,
sum
是分数的和

float
sum
=
2.0f;

for(int m = 1; m < 20; m++){
//m = 1
时,
num
已经是第
2
个加数了,所以
m < 20 i = i + j; j = i -
j;
//
变化前的

i
赋值给

j num = i / j; sum += num; } n(

20
个分数的和为





【程序
21


题目:求
1+2!+3!+...+20!
的和。

分析:联想到< br>1

100
的和,只不过每个加数是相应数的阶乘

package logic;

import r;

public class Recursion { public static void main(String[]
args) { Scanner in = new Scanner();

n(
你想计算到哪个数的阶乘的



long temp = 0L; long sum = 0L; for(int i = 1; i <= num; i++){ temp =
recursion(i); sum += temp; } n(
计算到

的阶乘和是



//
计算某个数

num
的阶乘

private
static
long
recursion(int
num)
{
//
TODO
Auto-generated
method stub if(num > 1){ return num * recursion(num - 1); } return 1; } }



【程序
22


题目:利用递归方法求
5!


分析:参考上题程序
21
的代码里的计算阶乘的方法(代码略)


【程序
23


题目:有
5
个人坐在一起,问第五 个人多少岁?他说比第
4
个人大
2
岁。问第
4
个人岁数,< br>他说比第
3
个人大
2
岁。问第三个人,

又说比第< br>2
人大两岁。问第
2
个人,
说比第一个人大两岁。
最后问第一 个人,他说是
10
岁。
请问第五个人多大?

分析:这题与程序17
有异曲同工之妙,倒过来分析就简单了。
(代码略)


【程序
24


题目:给一个不多于
5
位的正整数 ,要求:一、求它是几位数,二、逆序打印出各位数字。

分析:又是拆数字游戏

package
logic;

import
r;

public
class
ReversedNum
{
public
static
void
main(String[]
args) {
Scanner
in
=
new
Scanner();

n(
请输入一个不
多于
5
位的整数

int
num
=
t();

int
n
=
1;
(
这个数的逆序为:

while(num
/
10
>
0){
n++;
int
tmp
=
num
%
10;
(tmp);
num
/=
10;
}
n(num); n(
这个数共有

位数




【程序
25


题目:一个
5
位数,判断它是不是 回文数。即
12321
是回文数,个位与万位相同,十位与千
位相同。

分析:能把一个数的各个位上的数拆出来就简单了。参考程序
3
(代码略)


【程序
26


题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续


断第二个字母。

分析:你首先要知道星期一到星期天的英文单词,然后就是用

switch


package logic;

import r;

public class WeekDay { public static void main(String[]
args) { Scanner in = new Scanner();

char firstletter, secondletter;
//










n(








String
letter
=
();

firstletter
=
(0);
switch(firstletter){
case
'm':
case
'M':

n(





case
'w':
case
'W':
n(





case
'f':
case
'F':
n(





case
't':
case
'T':
n(
仅由该字母无法判断出星期几,请输入第二个字母

letter
=
();
secondletter
=
(0);
if(secondletter
==
'u'
||
secondletter
==
'U'){ n(
是星期二

secondletter
==
'H'){
n(





break;
}else{
n(





}
case
's':
case
'S':
n(
仅由该字母无法判断出星期几,请输入第二个字母

letter
=
();
secondletter
=
(0);
if(secondletter
==
'a'
||
secondletter
==
'A'){
n(
是星期六

break; }else
if(secondletter
==
'u' ||
secondletter
==
'U'){
n(





break; }else{ n(
输入错误




【程序
27


题目:求
100
之内的素数

分析:参考程序
2

【程序
28

学生会工作总结ppt-


学生会工作总结ppt-


学生会工作总结ppt-


学生会工作总结ppt-


学生会工作总结ppt-


学生会工作总结ppt-


学生会工作总结ppt-


学生会工作总结ppt-