目录
8.求3.1415926...=(1-1/3+1/5-1/7+1/9..........)*4
前言
这是今天作者做的一些训练题,在此记录一下。
1.飞机票计算
/**
需求:飞机票在淡季是有优惠政策的,而放假期间是没有优惠的,
假设在元旦三天(1.01---1.03),
五一三天(5.01---5.03),
十一七天(10.01---10.07)无任何优惠,
除了以上13天,都打8折, 请输入您哪天订票,以及票价(自己设定一个吧),
输出应付多少钱?
*/
从描述上可以看出,这是需要分区间进行运算的题目,可以用if进行操作,很简单的区间运行。
实现代码如下:
public class Test_01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int price = 400; // 票价设置为400元
// 元旦三天票价打六折,五一三天打七折,十一七天无优惠,除了这几天全部打八折
System.out.println("请输入您要买票的日期(以小数的形式输入,例如:五月三日请输入5.30):");
double data = sc.nextDouble();
if (data >= 1.01 && data <= 1.03) {
System.out.println("票原价为400元,您的票价可以打六折,票价为:" + price * 0.6);
} else if (data >= 5.01 && data <= 5.03) {
System.out.println("票原价为400元,您的票价可以打七折,票价为:" + price * 0.7);
} else if (data >= 10.01 && data <= 10.07) {
System.out.println("您的票价为:" + price);
} else if (data >= 12.31 || data <= 1.01) {
System.out.println("您输入的日期不存在,请重新输入!!!");
} else {
System.out.println("票原价为400元,您的票价可以打八折,票价为:" + price * 0.8);
}
}
}
从代码可以看出,有一种情况没有考虑,那就是一个月只有30天,但是因为使用小数代替日期,小数部分可以超过30天,这种情况没有进行判断,这是一个没考虑到的地方。
2.成绩等级判定
/**
输入学员的考试成绩,输出这学员考试成绩的级别。
100 A级
90~99 A级
80~89 B级
70~79 C级
60~69 D级
< 60 不合格
*/
从描述上可以看出,这是需要分区间进行运算的题目,可以用if或者switch进行操作,本文选择使用switch进行实现。但是其实有些繁琐,没有足够简洁,这是一大败笔。因此我的实现是一个反面案例。
实现代码如下:
public class Test_02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char grade = 'E';
System.out.println("请输入您的分数:");
int score = sc.nextInt();
if (score > 100 || score < 0) {
System.out.println("您的成绩不存在,请重新输入!");
grade = 'F';
} else if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else if (score >= 70) {
grade = 'C';
} else if (score >= 60) {
grade = 'D';
}
switch (grade){
case 'A':
System.out.println("您的成绩等级为:A");
break;
case 'B':
System.out.println("您的成绩等级为:B");
break;
case 'C':
System.out.println("您的成绩等级为:C");
break;
case 'D':
System.out.println("您的成绩等级为:D");
break;
case 'E':
System.out.println("您的成绩不合格!");
break;
}
}
从代码可以看出,即使用了if又使用了switch。代码过于臃肿,在此做一个反面教材。
3.循环嵌套的联系
//练习1:打印出n行金字塔,字母版
*
***
*****
*******
A
BBB
CCCCC
DDDDDDD
参考代码如下:
public class Demo_01 {
public static void main(String[] args) {
int n=0; //输入的行数
int r=0; //当前行
int s=0; //的数量
int p=0; //空格的数量
System.out.println("请输入您想要生成的行数:");
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
for(r=1;r<=n;r++){
//打印空格
for(p=1;p<=n-r;p++){
System.out.print(" ");
}
//打印
for(s=1;s<=2*r-1;s++){
char c = ('*');
System.out.print(c);
}
//行换
System.out.print("\n");
}
int r_1 = 0; //当前行
int s_1 = 0; //的数量
int p_1 = 0; //空格的数量
for(r_1 = 1; r_1 <=n ; r_1++){
//打印空格
for(p_1 = 1; p_1 <= n - r_1; p_1++){
System.out.print(" ");
}
//打印
for(s_1 = 1; s_1 <= 2 * r_1 - 1; s_1++){
char c = (char)('A' + (r_1-1));
System.out.print(c);
}
//行换
System.out.print("\n");
}
}
}
金字塔的创建,使用循环分别记录空格数和打印的符号数,同时输出,找出每层个数的规律,就可以写出。
//练习2:乘法口诀表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
.....
参考代码如下:
public class Demo_02 {
public static void main(String[] args) {
int row = 9;
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= i; j++) {
System.out.printf("%d*%d=%2d\t", j, i, i * j);
}
System.out.print("\n");
}
}
}
乘法口诀表,与金字塔的生成有些类似,只是不需要记录空格数量,只需要从最初位置输出即可。
//练习3:for循环实现在控制台打印水仙花数,并统计水仙花的个数
/*
分析:
什么是水仙花数呢?
所谓的水仙花数是指一个三位数[100,999],其各位数字的立方和等于该数本身。
举例:153就是一个水仙花数。
153 = 1*1*1 + 5*5*5 + 3*3*3
*/
参考代码如下:
public class Demo_03 {
public static void main(String[] args) {
int count = 0;
for (int i = 100; i < 999; i++) {
int sum = (i / 100) * (i / 100) * (i / 100) + ((i / 10)%10) * ((i / 10)%10) * ((i / 10)%10) + (i % 10) * (i % 10) * (i % 10);
if (sum == i) {
count++;
System.out.println(sum);
}
}
System.out.println("水仙花数的个数为:" + count);
}
}
水仙花数,按照公式将个位数、十位数、百位数分别运算即可。
//练习4:有口井7米深,一只青蛙白天爬3米,晚上坠下2米,问这青蛙几天才能爬出这口井(while)
参考代码如下:
public class Demo_04 {
public static void main(String[] args) {
int m = 7;
int high = 0;
int up_high =3;
int down_high = 2;
int count = 0;
while (true){
count ++;
if (high + count * up_high >= m){
break;
}
high -= down_high;
}
System.out.println("这只青蛙爬出井的天数为:" + count);
}
}
上面几个案例都是很经典的循环控制案例,可以思考一下。
4.随机数的训练
/**
猜数字的游戏(GuessNumber)
游戏运行时产生一个1-100之间的随机整数,要求用户从控制台输入数字,
若输入的数字比产生的数字小,则输出:“太小了,再大一点!”;
若输入的数字比产生的数字大,则输出:“太大了,再小一点!”,
若输入的数字和产生的数字相等,则输出:“恭喜你猜对了!”,break
若用户猜了7次还未猜对,则输出:“你太笨了,下次再来吧!”,然后退出程序。
提示:
(1)、int num=(int)(Math.random()*100); //java.lang.Math;
(2)、Scanner in=new Scanner(System.in); // java.util.Scanner;
int n = in.nextInt();
*/
参考代码如下:
public class Test_04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num=(int)(Math.random()*100); //java.lang.Math;
int count = 0;
while (true){
System.out.println("请输入一个1-100之间的两位数:");
int number = sc.nextInt();
count++;
if (count == 7){
System.out.println("你太笨了,下次再来吧!");
break;
}
if (number > num){
System.out.println("您输入的数大于产生的数,请重新输入");
continue;
} else if (number < num) {
System.out.println("您输入的数小于产生的数,请重新输入");
continue;
}
if (number == num){
System.out.println("恭喜你猜对了!");
break;
}
}
}
}
使用随机数生成之后,将输入的数依次比较之后,给出提示,就可以做出,一步一步来即可。
5.哥德巴赫猜想
输入的是0,表示想退出输入;
对任何一个不小于6的偶数a,总可以表示成两个奇素数的和;a= x+y;
8 = 3 + 5;
奇素数:奇数,素数:只能被1或者本身整除的数(质数)
参考代码如下:
public class Test_01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int m = 0;
System.out.println("请输入一个大于6的偶数(输入0时结束输出):");
int number = sc.nextInt();
if (number == 0){
System.out.println("输出结束!");
break;
}
if (number <= 6){
System.out.println("您输入的数字没有大于6,请重新输入!");
}
if (number % 2 != 0){
System.out.println("您输入的数不是偶数,请重新输入!");
}
int[] arr = new int[number];
for (int i = 0; i < number; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0){
break;
}
arr[m] = i;
m++;
break;
}
}
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length - 2; j++) {
if (arr[i] + arr[j] == number) {
System.out.println("成功证明!");
System.out.println(arr[i] + "+" + arr[j] + "=" + (arr[i] +arr[j]));
}
}
}
}
}
}
使用数组记录输入的偶数的从3到偶数本身之间的奇素数,然后遍历数组看数组中的数能否有两个数和为输入的偶数。
6.编写程序,将一个整数倒排过来
例如:给定整数:49082000,得到的结果:28094。
参考代码如下:
public class Test_02 {
public static void main(String[] args) {
int number = 49082000;
String str = String.valueOf(number);
String result = "";
// System.out.println(str.substring(8, 9));
for (int i = str.length()-1; i >= 0; i--) {
result += str.substring(i , i + 1);
}
Integer number2 = Integer.valueOf(result);
System.out.println("反转后的整数为:" + number2);
}
}
将整数转换成字符串,使用字符串拼接将字符串顺序颠倒,再将反转之后的字符串转为整数,就可以进行数字反转,由于反转之后的为整数,整数前面的0在输出时不会被记录,所以就可以消除数字前面的0.
7.求50000以内的完备数
提示:完备数--->它的约数(除了它本身)之和等于自己;
如:6的约数有1,2,3,1+2+3 = 6;
参考代码如下:
public class Test_03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数:");
int number = sc.nextInt();
int sum = 0;
for (int j = 1; j < number; j++) {
if (number % j == 0){
sum = sum + j;
}
}
if (sum == number){
System.out.println("您输入的数是一个完备数!");
}else {
System.out.println("您输入的数不是一个完备数。");
}
}
}
与哥德巴赫猜想相似的解决步骤。
8.求3.1415926...=(1-1/3+1/5-1/7+1/9..........)*4
求3.1415926...=(1-1/3+1/5-1/7+1/9..........)*4
参考代码如下:
public class Test_04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您想要计算到的位数:");
long num = sc.nextInt();
double sum = 0.0;
for (int i = 1; i <= num; i++) {
sum += (((double) 1 /(2 * i - 1)) * Math.pow( -1, i + 1));
}
System.out.println("结果为:" + 4 * sum);
}
}
9. 斐波那契数列
1 1 2 3 5 8 13 21 34 55 ...
参考代码:
public class Test_05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您想要计算到的位数(位数应该大于2):");
int num = sc.nextInt();
int[] arr = new int[num];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i <= num - 1; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
System.out.println("输出的斐波那契数列为:");
for (int i = 0; i < num; i++) {
System.out.print(arr[i] + "\t");
}
}
}
这是使用数组记录斐波那契数列的值,输出时直接遍历数组。
10.百元买百鸡
一百元钱买百鸡,公鸡每只五元整,每只母鸡是三元;
小鸡因小价钱低,三只小鸡是一元;公鸡母鸡和小鸡,请你算出各是几?
参考代码如下:
public class Test_06 {
public static void main(String[] args) {
// int cock = 0; //公鸡数量
// int hen = 0; //母鸡数量
// int poult = 0; //小鸡数量
for (int cock = 0; cock < 20 ; cock++) {
for (int hen = 0; hen < 30 ; hen++) {
for (int poult = 0; poult < 300 ; poult +=3) {
if (cock + hen + poult == 100 & 5 * cock + 3 * hen + (poult / 3) * 1 <= 100) {
System.out.println("公鸡个数为:" + cock +",母鸡个数为:" + hen +",小鸡个数为:" +poult);
}
}
}
}
}
}
这段代码感觉可能不一定正确,使用循环遍历三个数,使用条件作为结束的判断。
11.猴子吃桃
猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又吃了一个。
第二天又将剩下的桃子吃掉一半,又多吃了一个。
以后每天都吃前一天剩下的一半零一个。
到第10天在想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?
参考代码如下:
public class Test_07 {
public static void main(String[] args) {
int num = 1; //第十天桃子数
int sum = 0; //第一天桃子数
for (int i = 1; i < 10; i++) {
sum = (num +1) * 2;
num = sum;
}
System.out.println("第一天桃子数为:" + sum);
}
}
总结
这是作者今天写的一些练习题,进行分享。如果有错误的地方,还希望可以指正。