一、求非负数之和
本关任务:使用 Scanner 对象接收一组数据,每组数据包含 4 个整数,其中有正有负,比如:22 33 -22 32。请使用 while 循环求出每组数据的非负数之和(每组数据之间用空格分开,而组与组之间用换行符分开)。
import java.util.Scanner;
public class MyWhile {
public static void main(String[] args) {
// 定义变量sum,用于求非负数的和,并赋初值0。
int sum = 0;
// 定义变量i,用于控制循环,并赋初值1。
int i = 1;
// 定义Scanner对象
Scanner input = new Scanner(System.in);
// 请在 Begin-End 间编写代码
/********** Begin **********/
// 第一步:定义while循环,循环4次
while (i < 5) {
// 第二步:获取输入值
int a = input.nextInt();
// 第三步:判断输入值是否大于0,对大于0的值累加
if (a < 0) {
} else {
sum += a;
}
// 第四步:while循环中的变量加1
i++;
}
// 第五步:打印sum值
System.out.println(sum);
/********** End **********/
}
}
二、等差数列均值
本关任务:使用 Scanner 对象获取一组等差整数(键盘输入的数之间用空格分隔,最后一个为 %,不计入计算),统计出等差数列的均值(保留两位小数)。
/*
任务:接收输入值(整数数列),统计出等差数列的均值,每组输入以%结束,比如1 3 5 %。
其中百分号的作用是:在while循环中判断输入为%时,终止循环。
*/
import java.util.Scanner;
public class WhileTest {
public static void main(String[] args) {
// 定义变量sum,用于求等差数列的和
int sum = 0;
// 定义变量z,记录等差数个数
int z = 0;
// 创建Scanner对象
Scanner input = new Scanner(System.in);
// 请在 Begin-End 间编写代码
/********** Begin **********/
// 第一步:使用while循环接收Scanner对象接收的值,当下一个值等于%时,终止循环
String s = input.nextLine();
String[] a = s.split(" ");
for (String b : a) {
if (b.equals("%")) {
break;
}
// 第二步:获取输入值
else {
int x = Integer.parseInt(b);
// 第三步:对输入的数列值求和
sum += x;
// 第四步:统计数列个数
z++;
}
}
// 第五步:数列中值的总和,除以数列个数求出均值(保留两位小数)
System.out.printf("%.2f", (double)sum/z);
/********** End **********/
}
}
三、前n个自然数平均值
本关任务:给定一个大于 1 的正整数 n,求所有小于 n 的自然数的平均值(保留两位小数)。 自然数的定义:大于等于 0 的整数。
/*
任务:通过Scanner对象获取输入值n,求所有小于n的自然数的平均值。
输出的平均值请转化为double类型。
*/
import java.util.Scanner;
public class DWhileTest {
public static void main(String[] args) {
// 定义变量n,接收输入值
int n;
// 定义求和变量sum,并赋初值0
int sum = 0;
// 定义变量i,并赋初值0
int i = 0;
// 创建Scanner对象
Scanner input = new Scanner(System.in);
// 请在Begin-End间编写代码
/********** Begin **********/
// 获取输入值n
n = input.nextInt();
do {
sum+=i;
i++;
}
// 在while后判断条件,当i不小于n时退出循环
while (i < n);
// 输出平均值,保留两位小数
System.out.printf("%.2f\n",(double)sum/i);
/********** End **********/
}
}
四、正负数数量统计
本关任务:循环获取给定值(整数),判断给定值的正数个数和负数个数(键盘输入的数值之间用空格分隔,最后输入的是一个 % 字符,当获取到这个字符时,跳出循环)。
输出格式:正数个数为:xx。负数个数为:xx
/*
任务:统计给定一列数的正数和负数个数
给定的数举例:-1 2 3 -4 %
其中%用于while中,判断输入结束
*/
import java.util.Scanner;
public class DWhile {
public static void main(String[] args) {
// 定义变量positive,并赋初值0,用于统计正数个数
int positive = 0;
// 定义变量negative,并赋初值0,用于统计负数个数
int negative = 0;
// 创建Scanner对象
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String[] a = str.split("\\s+");
//\\s+是一个正则表达式,它匹配一个或多个空格
for (String s : a) {
if (s.equals("%")) {
break;
}
else {
int x = Integer.parseInt(s);
if (x > 0) {
positive++;
} else if (x < 0) {
negative++;
}
}
}
// 谁还使用do···while啊
// 在do后的花括号中编写循环语句
// do{
// 请在 Begin-End 间编写代码
/********** Begin **********/
// 第一步: 获取输入值
// 第二步:判断输入值是否为正数,如果是,把正数个数变量positive加1
// 第三步:判断输入值是否为负数,如果是,把负数个数变量negative加1
// }
// 第四步:在while后判断条件,当输入值的下一个值为%时,终止循环
// while();
// 第五步:输出正数和复数个数,具体格式见预期输出
System.out.println("正数个数为:"+positive+"。负数个数为:"+negative);
/********** End **********/
}
}
五、求水仙花数
本关任务:输出所有水仙花数。 水仙花数特征:
- 该值处于 100(包括)到 999(包括)之间;
- 其个位数的三次幂,十位数的三次幂,百位数的三次幂的和等于这个数本身。
输出格式:xx是一个水仙花数。
/*
* 任务:使用for循环输出所有的水仙花数
*水仙花数特征:
- 该值处于 100(包括)到 999(包括)之间;
- 其个位数的三次幂,十位数的三次幂,百位数的三次幂的和等于这个数本身。
* 输出样式:x是一个水仙花数。
*/
public class ForTest {
public static void main(String[] args) {
// 请在 Begin-End 间编写代码
/********** Begin **********/
// 第一步:使用for循环依次取999到100中的每个数,判断是否为水仙花数
for(int i = 999;i > 99;i--) {
// 第二步:获取个位
int g = i%10;
// 第三步:获取十位
int s = (i/10)%10;
// 第四步:获取百位
int b = (i/100);
// 第五步:判断个位数的三次幂,十位数的三次幂,百位数的三次幂的和是否等于这个数本身,等于的话,输出该数
if(i == (g*g*g+s*s*s+b*b*b)) {
System.out.println(i+"是一个水仙花数。");
}
}
/********** End **********/
}
}
六、求完数
本关任务:判断给定的一个整数是否是完数。
完数的定义:一个数如果恰好等于它的因子之和(本身除外),这个数就称为完数。例如数字 6,其因子为 1,2,3,6(本身除外),满足1+2+3=6,所以 6 是完数。
/*
任务:接收一个整数,判断该数是否是完数。
完数的定义:一个数如果恰好等于它的因子之和(本身除外),这个数就称为完数。
例如数字6,其因子为1,2,3,6(本身除外),满足1+2+3=6,所以这个数为完数。
如果是完数,请输出:x是完数
如果不是完数,请输出:x不是完数
具体输出样式见预期输出。
*/
import java.util.Scanner;
public class ForTest {
public static void main(String[] args) {
// 定义变量sum,用于求因子的和,并赋初值为0
int sum = 0;
// 创建Scanner对象
Scanner input = new Scanner(System.in);
// 获取输入值
int x = input.nextInt();
// 请在 Begin-End 间编写代码
/********** Begin **********/
// 第一步:使用for循环判断获取的整数是否为完数
for(int i = 1;i < x;i++) {
if(x%i == 0) {
sum+=i;
}
}
// 第二步:如果是完数,请输出x是完数
if(sum == x) {
System.out.println(x+"是完数");
}
// 第三步:如果不是,请输出x不是完数
if(sum != x) {
System.out.println(x+"不是完数");
}
/********** End **********/
}
}
七、continue
本关任务:给定一个正整数 n,统计比 n 小的正奇数的个数。
输出格式:n前面共有xx个奇数。
/*
任务:使用Scanner对象接收给定的一个整数,统计小于该整数的正奇数个数。
输出格式:5前面共有2个奇数。
*/
import java.util.Scanner;
public class ContinueTest {
public static void main(String[] args) {
// 定义变量count,用于统计奇数个数,并赋初值为0。
int count = 0;
// 创建Scanner对象
Scanner sc = new Scanner(System.in);
// 获取输入值
int n = sc.nextInt();
// 请在Begin-End间编写代码
/********** Begin **********/
// 第一步:编写for循环从1到n之间循环取数
for(int i = 1;i < n;i++) {
// 第二步:判断是否为偶数,如果是,跳出本次循环,如果不是,对奇数个数变量值加1
if(i % 2 != 0) {
count +=1;
}
}
// 第三步:循环结束,输出总的奇数个数
System.out.printf("%d前面共有%d个奇数。",n,count);
/********** End **********/
}
}
八、比赛名单判断
本关任务:两个乒乓球队进行比赛,各出 3 人。甲队为 a、b、c,乙队为 x、y、z。有人向队员打听比赛的名单,a 说他不是和 x 比,c 说他不是和 x、z 比。
/*
任务:求出对战人信息。
输出样式:a的对手x
两个乒乓球队进行比赛,各出 3 人。
甲队为 a、b、c,乙队为 x、y、z。
有人向队员打听比赛的名单,a 说他不是和 x 比,c 说他不是和 x、z 比。
*/
public class TeamMate {
public static void main(String[] args) {
// 请在Begin-End间编写代码
/********** Begin **********/
// 第一步:使用循环求出与c的对战的人
for (char c = 'x'; c <= 'z'; c++) {
if (c != 'x' && c != 'z') {
// 第二步:使用循环求出与a的对战的人
for (char a = 'x'; a <= 'z'; a++) {
if (a != 'x' && a != c) {
// 第三步:使用循环求出与b对战的人
char b;
for (b = 'x'; b <= 'z'; b++) {
if (b != a && b != c) {
break;
}
}
// 第四步:打印对战信息
System.out.println("a的对手" + a);
System.out.println("b的对手" + b);
System.out.println("c的对手" + c);
}
}
}
}
/********** End **********/
}
}
九、住房贷款还款计算
本关任务:编写一个程序,由用户输入住房贷款和贷款年限,程序输出不同利率下的月还款额和总还款额,利率从 5%~8%,增长间隔为 1/8。例如,如果输入贷款额 10000 元人民币,贷款期限 5 年,程序应输出如下内容:
贷款金额: 10000
贷款年限: 5
利率 月还款额 总还款额
5.000% 188.71 11322.74
5.125% 189.28 11357.13
……
8.000% 202.76 12165.83
注意:贷款金额、贷款年限和结果之间用英文冒号和一个空格分隔;利率、月还款额和总还款额之前用 4 个空格分隔。
import java.util.Scanner;
/*
* 任务:编写一个程序,由用户输入住房贷款和贷款年限,程序输出不同利率下的月还款额和总还款额,利率从 5%~8%,
* 增长间隔为 1/8。 例如,如果输入贷款额
* 10000 元人民币,贷款期限 5 年,程序应输出如下内容:
*
* 贷款金额: 10000 贷款年限: 5 利率 月还款额 总还款额
* 5.000% 188.71 11322.74
* 5.125% 189.2811357.13
* ……
* 8.000% 202.76 12165.83
*
* 利率请保留3位小数,月还款额和总还款额请保留2位小数。 利率和月还款额以及总还款额之间保留4个空格。
*
*
* 思路:获取住房贷款以及贷款年限,计算不同利率下的月还款额以及总还款额。
*
*
*/
// 请在Begin-End间编写完整代码,类名请使用LoanTest
/********** Begin **********/
// 导入 Scanner 类
// 定义公开类 LoanTest
public class LoanTest{
// 定义主方法 main,在该方法中完成本关任务
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double loanAmount = scanner.nextDouble();
int years = scanner.nextInt();
System.out.printf("贷款额:%.0f\n",loanAmount);
System.out.println("贷款年限:"+years);
System.out.println("利率 月还款额 总还款额");
for (double rate = 5.0; rate <= 8.0; rate += 0.125) {
double monthlyInterestRate = rate / 1200;
double monthlyPayment = loanAmount * monthlyInterestRate / (1 - 1 / Math.pow(1 + monthlyInterestRate, years * 12));
double totalPayment = monthlyPayment * years * 12;
System.out.printf("%.3f%%\t%.2f\t%.2f\n", rate, monthlyPayment, totalPayment);
}
}
}
/********** End **********/
十、杨辉三角形
本关任务:给定一个正整数 n,打印出有 n 行的杨辉三角形。
杨辉三角形的特征:
- 第 n 行有 n 个数字;
- 每一行的开始和结尾数字都为 1;
- 从第 3 行起,除去每一行的开始和结尾数字,其余每个数都满足以下条件:任意一个数等于上一行同列和上一行前一列的和,如以下杨辉三角形中第 3 行第 2 列中的 2 等于它上一行同列(第 2 行第 2 列中的 1)和上一行前一列(第 2 行第 1 列中的 1)的和。
import java.util.Scanner;
/*
* 任务:从控制台获取输入的正整数n,打印带有n行的杨辉三角形
* 每个数字保证最少4个宽度,每行前面保证2n个宽度
杨辉三角形的特点:
- 第 n 行有 n 个数字;
- 每一行的开始和结尾数字都为 1;
- 从第 3 行起,除去每一行的开始和结尾数字,其余每个数都满足以下条件:
任意一个数等于上一行同列和上一行前一列的和,
如以下杨辉三角形中第 3 行第 2 列中的 2 等于它上一行同列(第 2 行第 2 列中的 1)
和上一行前一列(第 2 行第 1 列中的 1)的和。
以下是有5行的杨辉三角形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
*/
// 请在Begin-End间编写代码
/********** Begin **********/
// 导入 Scanner 类
// 定义公开类 Test
public class Test {
// 定义主方法 main,在该方法中完成本关任务
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] triangle = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
triangle[i][j] = 1;
} else {
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.printf("%4d", triangle[i][j]);
}
System.out.println();
}
}
}
十一、日历打印
本关任务:接收一个年份数和一个月份数,打印出该月的日历。
日历输出样式如下图1所示:
图1
如果输入的年份小于 1900,请输出:“请输入大于或等于1900的年份”。
注意:日期之间以及星期之间使用 \t 分隔。
import java.util.Scanner;
/*
接收一个年份数(大于等于1900)和一个月份数,打印出该月的日历。
日历输出格式如下:
==================================================
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
==================================================
其中日期上下的分隔符用的是50个=。
日期之间以及星期之间使用\t分隔。
1900年1月1日是星期1。
思路分析:
求1900年到输入年份之间的累计天数,其中闰年366天,平年365天;
求1月到输入月份之间的累计天数;
得到1900-1-1到输入年月之前所有天数,用总天数对7求余,对余数加1,该数值即为该月1号的星期;
判断输入月份有多少天;
控制格式打印日历。
*/
// 请在Begin-End间编写完整代码,类名请使用Calendar
/********** Begin **********/
// 导入 Scanner 类
// 定义公开类 Calendar
public class Calendar {
// 定义主方法 main,在该方法中完成本关任务
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
int month = scanner.nextInt();
if (year < 1900 ) {
System.out.println("请输入大于或等于1900的年份");
}
else if(month > 12 || month <0){
System.out.println("请输入正确的月份");
}
else {
int days = countDays(year, month);
int dayOfWeek = (days + 1) % 7;
int daysInMonth = getDaysInMonth(year, month);
System.out.println("==================================================");
System.out.println("日\t一\t二\t三\t四\t五\t六");
for (int i = 0; i < dayOfWeek; i++) {
System.out.print("\t");
}
for (int i = 1; i <= daysInMonth; i++) {
System.out.print(i + "\t");
if ((dayOfWeek + i) % 7 == 0) {
System.out.println();
}
}
System.out.println("\n==================================================");
}
}
// 距离1900一月有多少天
private static int countDays(int year, int month) {
int days = 0;
for (int i = 1900; i < year; i++) {
days += isLeapYear(i) ? 366 : 365;
}
for (int i = 1; i < month; i++) {
days += getDaysInMonth(year, i);
}
return days;
}
// 闰年or平年
private static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 相对应月份的天数
private static int getDaysInMonth(int year, int month) {
if (month == 2) {
return isLeapYear(year) ? 29 : 28;
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
}
return 31;
}
}
/********** End **********/
十二、哥德巴赫猜想
本关任务:验证 7-100(含 7 不含 100)之间的数是否符合哥德巴赫猜想。 哥德巴赫猜想:任一大于 6 的正整数都能分解成两个素数之和。 素数:一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数。
/*本关任务:验证 7-100(含 7 不含 100)之间的数是否符合哥德巴赫猜想。
哥德巴赫猜想:任一大于 6 的正整数都能分解成两个素数之和。
素数:一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数。*/
public class GeTest {
// 判断整数是否是素数
public static boolean isPrime(int x) {
for (int y = 2; y < x; y++) {
if (x % y == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
// 验证 7-100 之间的数符合哥德巴赫猜想
// 请在Begin-End间编写完整代码
/********** Begin **********/
for(int i = 7; i < 100; i++) {
for(int x = 2; x < (i/2)+1; x++) {
if(isPrime(x) && isPrime(i - x)) {
System.out.println(i + "可分解为素数" + x + "和素数" + (i - x));
}
}
}
/********** End **********/
}
}