java50道经典逻辑题
萌到你眼炸
923次浏览
2021年01月21日 02:23
最佳经验
本文由作者推荐
学生会工作总结ppt-
題目:
古典问题:有一对兔子,
从出生后第
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
】