JavaSE 基础 - 第6章 控制语句【习题练习】
- 【作业1】计算1000以内所有不能被7整除的整数之和?
- 【作业2】计算 1+2-3+4-5+6-7....+100的结果
- 【作业3】从控制台输入一个正整数,计算该数的阶乘。例如输入5,阶乘为 5 * 4 * 3 * 2 * 1
- 【作业4】从控制台接收一个正整数,判断该数字是否为质数
- 【作业5】 从键盘接收一个正整数,该正整数作为行数,输出以下图形
- 【作业6】小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。
- 【作业7】一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程找出1000内所有的完数。
- 传送门
【作业1】计算1000以内所有不能被7整除的整数之和?
解题思路:
【重要】应该怎么去编程???????
计算1000以内所有不能被7整除的整数之和
1、解决一个问题的时候,可以先使用汉语描述思路。(养成好习惯)
2、复杂的问题可以“一步一步”去实现,没必要一下全部实现。
把上面的题目可以拆分成几步去完成:
第一步:从1开始循环,循环到1000,先保证每一个数字你都能取到。
第二步:在以上第一步的循环过程中,一个数字一个数字筛查,判断该数字是否
是“不能被7整除的整数”。
编程思想/思路,都是一步一步分析,积累出来的。
编程最主要的是写汉语思路。思路有了,代码就不远了。
把问题拆开,一个一个去解决一下。
不断写代码,不断的积累编程“模型”。
代码:
public class Homework1{
public static void main(String[] args){
// 在外部准备一个变量,用来存储求和的结果
int sum = 0;
//循环的时候你能想起来for while do..while
for(int i = 1; i <= 1000; i++){ //第一步
// 判断的时候你能想起来使用if
if(i % 7 != 0){ // 第二步
// 此时的i是不能被7整除的,这个i应该此时纳入求和/累加。
//sum += i;
sum = sum + i;
}
}
// 在for循环结束之后,结果才计算完成,所以在这里输出。
System.out.println("sum = " + sum); //429429
}
}
【作业2】计算 1+2-3+4-5+6-7…+100的结果
// 找规律:奇数时减法,偶数时加法。
// 第一种思路:(除1之外)所有的偶数求和,所有的奇数求和,然后偶数求和的结果减去奇数求和的结果。
// 第二种思路:循环过程中取出每个值,判断该数是偶数还是奇数,偶数就加,奇数就减。
//写代码养成好习惯是:写一步测试一步。
public class Homework2{
public static void main(String[] args){
// 第一步:先别着急着完成,先能从1取到100
int sum = 1; //sum的初始值不是0,而是1.
for(int i = 2; i <= 100; i++){ // i从2开始。
if(i % 2 == 0){ //偶数
sum += i;
}else{ // 奇数
sum -= i;
}
}
System.out.println("结果=" + sum); // 52
}
}
【作业3】从控制台输入一个正整数,计算该数的阶乘。例如输入5,阶乘为 5 * 4 * 3 * 2 * 1
public class Homework3{
public static void main(String[] args){
//第一步:怎么从键盘上接收一个正整数。
java.util.Scanner s = new java.util.Scanner(System.in);
// 等待用户输入一个正整数。
System.out.print("请输入一个正整数:");
int num = s.nextInt();
// 计算该数的阶乘
// 5的阶乘:5*4*3*2*1
// 8的阶乘:8*7*6*5*4*3*2*1
// 第二步:先不用管乘法的事儿,先实现从8取到1.(递减的方式取)
//int jieGuo = 0; //初始值不能是0,是0的时候,乘积最后是0.
int jieGuo = 1; //结果的初始值给1.
for(int i = num; i > 1; i--){
jieGuo *= i; // jieGuo = jieGuo * i;
}
System.out.println("计算结果 = " + jieGuo);
}
}
【作业4】从控制台接收一个正整数,判断该数字是否为质数
/*
质数(质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数)
因数是什么?
3 * 5 = 15
3和5都是15的因数。
2 3 4 5 6 7中:2 3 5 7都是质数。
重点题目:
主要练习,在外部打布尔标记。
*/
public class Homework4{
public static void main(String[] args){
// 从控制台接收一个正整数。
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入一个正整数:");
int num = s.nextInt(); // 假设输入的是8
// 判断该数字是否为质数
// 怎么判断num是不是质数
// 怎么判断8是不是质数?
// 思路:8除以2看看能不能整除、8除以3看看能不能整除、8除以4看看能不能整除
// 一直除下去,直到发现有能够整除的,表示该数一定不是质数。
/*
假设输入的是7:
7 / 1 不用判断
7 / 2 需要判断
7 / 3 需要判断
7 / 4 需要判断(假设这个判断,发现可以整除,就没必要往下判断了。)
7 / 5 需要判断
7 / 6 需要判断
7 / 7 不用判断
*/
//可以考虑在外边准备一个布尔类型的标记。
boolean zhiShu = true; // true表示是质数。
for(int i = 2; i < num; i++){ // 假设输入的是100
//System.out.println(i);
if(num % i == 0){
// 循环没必要执行了,为了效率,这里要终止循环
//System.out.println("该数字"+num+"不是质数!");
zhiShu = false;
break;
}
}
System.out.println(num + (zhiShu ? "是" : "不是") + "质数");
}
}
【作业5】 从键盘接收一个正整数,该正整数作为行数,输出以下图形
*
***
*****
*******
*********
例如:输入5,则打印如上图5行。
/*
空格的规律:
第1行4个空格(5-1)
第2行3个空格(5-2)
第3行2个空格(5-3)
第4行1个空格(5-4)
第5行0个空格(5-5)
星号的规律:
第1行1个
第2行3个
第3行5个
第4行7个
.....
行号 * 2 - 1
*/
public class Homework5{
public static void main(String[] args){
// 开发需要思路,实现这个功能需要一步一步来。
// 这个步骤是什么?
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入一个正整数作为行数:");
int rows = s.nextInt();
// 6行循环6次
// n行循环n次
for(int i = 1; i <= rows; i++){ // 外层循环控制的是总行数。
// 我在这里需要将一行全部输出
// 这里需要再使用循环,输出空格以及“*”
// 输出空格的循环
for(int j = 0; j < rows - i; j++){
System.out.print(" ");
}
// 输出星号*的循环
for(int k = 0; k < i * 2 - 1; k++){
System.out.print("*");
}
// 以上两个for循环都结束之后,表示一行就结束了
// 在这里换行
System.out.println();
}
}
}
【作业6】小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。
/*
这个题目最主要练习是:
while循环 + 计数。
*/
public class Homework6{
public static void main(String[] args){
// 小芳每一天肯定会有2.5元的收入。
// 小芳即使有一天花了6元,但是2.5元的收入还是有的。
// 经过分析:总钱数肯定需要是double类型。int类型不行。
int day = 0; // 天数的默认初始值是0
double money = 0.0; // 钱的默认初始值是0
/*
while(true){
day++; // 天数加1
money += 2.5; // 钱加2.5元
// 如果天数是5的倍数,那么花去6元
if(day % 5 == 0){
money -= 6.0;
}
// 什么时候循环结束呢?
// 当money >= 100.0的时候,循环结束。
if(money >= 100){
break;
}
}
*/
// 改造之后的。
while(money < 100){
day++; // 天数加1
money += 2.5; // 钱加2.5元
// 如果天数是5的倍数,那么花去6元
if(day % 5 == 0){
money -= 6.0;
}
}
//小芳通过74天存到了101.0元钱
System.out.println("小芳通过" + day + "天存到了" + money + "元钱");
}
}
【作业7】一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程找出1000内所有的完数。
/*
什么是完数?
一个数如果恰好等于它的因子之和,这个数就是完数。
那么因子怎么找?
10的因子?
10 % 1 == 0
10 % 2 == 0
10 % 5 == 0
不算10本身。
10的因子:
1 + 2 + 5 = 8
运行结果:
6
28
496
*/
public class Homework7{
public static void main(String[] args){
// 1不属于完数。从2开始判断
// 第一步:先从1到1000,每个数字都取出来
for(int i = 2; i <= 1000; i++){
// 第二步:在这里可以拿到i,那么此时应该判断i是否是一个完数。
// 这个数字有了,找这个数字的因子。
// 假设现在这个数字就是6,i等于6
int sum = 0;
for(int j = 1; j <= i / 2; j++){
//j取到的值是:1 2 3 4 5
//但实际上j取到哪儿就行了:1 2 3,取这几个数就行了。
//取到一半就行。
if(i % j == 0){
//此时j就是因子。
// 记得将因子j追加,累计。
sum += j;
}
}
// 以上for结束表示:所有因子求和完毕了。
if(i == sum){
//i是一个完数
System.out.println(i);
}
}
}
}