循环控制
Key Point
●for 循环的使用
●while 循环
●do...while 循环
●break 和continue
练习
1. (for 循环)计算1+2+3+...+100 的和
public class Test21 {
public static void main(String[] args) {
// (for 循环)计算1+2+3+...+100 的和
int sum=0;
for (int i = 1; i <=100; i++) {
sum+=i;
}
System.out.println("sum="+sum);
}
}
2. (for 循环)计算1+3+5+...+99 的和
public class Test22 {
public static void main(String[] args) {
//(for 循环)计算1+3+5+...+99 的和
int sum=0;
for (int i = 1; i <=100; i++) {
if (i%2==1){
sum+=i;
}
}
System.out.println("sum="+sum);
}
}
3. (while/do…while 循环)
把1、2 两题用while 循环或do...while 循环改写
public class Test23 {
public static void main(String[] args) {
//把1、2 两题用while 循环或do...while 循环改写
int sum1=0;
int sum2=0;
int i=1;
int j=1;
while (i<=100){
sum1+=i;
i++;
}
while (j<=100){
sum2+=j;
j+=2;
}
System.out.println("sum1="+sum1);
System.out.println("sum2="+sum2);
}
}
4. (for 循环)读入一个小于10 的整数n,输出它的阶乘n!
public class Test24 {
public static void main(String[] args) {
//(for 循环)读入一个小于10 的整数n,输出它的阶乘n!
int sum=1;
Scanner scanner=new Scanner(System.in);
System.out.println("输入要计算的阶乘的值");
int num=scanner.nextInt();
//输入要计算的阶乘的值
for (int i = 1; i <=num; i++) {
sum*=i;
}
System.out.println(num+"阶乘的值="+sum);
}
}
5. (for 循环)求100 以内所有能被3 整除但不能被5 整除的数字的和。
public class Test25 {
public static void main(String[] args) {
//(for 循环)求100 以内所有能被3 整除但不能被5 整除的数字的和。
int sum=0;
for (int i = 1; i <=100; i++) {
if (i%3==0&&i%5==0) {
sum+=i;
}
}
System.out.println("sum="+sum);
}
}
6. (for 循环)百钱买百鸡”是我国古代的著名数学题。
题目这样描述:3 文钱可以买1只公鸡,2 文钱可以买一只母鸡,1 文钱可以买3 只小鸡。用100 文
钱买100 只鸡,那么各有公鸡、母鸡、小鸡多少只?
public class Test26 {
public static void main(String[] args) {
//3 文钱可以买1只公鸡,2 文钱可以买一只母鸡,1 文钱可以买3 只小鸡。用100 文
//钱买100 只鸡,那么各有公鸡、母鸡、小鸡多少只?
int totalMoney = 100;
int totalChicken = 100;
for (int x = 0; x <= totalMoney / 3; x++) {
for (int y = 0; y <= totalMoney / 2; y++) {
int z = totalChicken - x - y;
if (3 * x + 2 * y + z / 3 == totalMoney && z % 3 == 0) {
System.out.println("公鸡:" + x + "只");
System.out.println("母鸡:" + y + "只");
System.out.println("小鸡:" + z + "只");
return;
}
}
}
System.out.println("无解");
}
}
7. (for 循环)搬砖问题:
36 块砖,36 人搬,男搬4,女搬3,两个小孩抬1 砖, 要求一次全搬完,问男、女和小孩各若干?
public class Test27 {
public static void main(String[] args) {
//36 块砖,36 人搬,男搬4,女搬3,两个小孩抬1 砖, 要求一次全搬完,问男、女和小孩各若干?
/*
* x 男人
* y 女人
* z 小孩
* */
for (int x = 0; x <= 36; x++) {//男人数量
for (int y = 0; y <= 36 - x; y++) {// 36 - x;女人数量
int z = 36 - x - y;//小孩数量
if (8 * x + 6 * y + z == 72) {//等式
System.out.println("男:" + x);
System.out.println("女:" + y);
System.out.println("小孩:" + z);
return;
}
}
}
System.out.println("无解");
}
}
8. (for 循环)*编程找出四位整数abcd 中满足下述关系的数。
(ab+cd)(ab+cd)=abcd
public class Test28 {
public static void main(String[] args) {
for (int num = 1000; num <= 9999; num++) {
int a = num / 1000;
int b = (num / 100) % 10;
int c = (num / 10) % 10;
int d = num % 10;
if (Math.pow((10 * a + b + 10 * c + d), 2) == num) {
System.out.println(num);
}
}
}
}
9. (循环)读入一个整数n,输出如下图形
n = 3
*
***
*****
n = 4
*
***
*****
*******
思路:读入的整数n,就是外层循环的循环次数。
对于每一行,要做的事情:1. 输出若干个空格;2. 输出若干个星;3. 换行。
提示:输出不换行,用System.out.print()
public class Test29 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入要打印的行数");
int line= scanner.nextInt();
for (int i = 0; i < line; i++) {
for (int j = 0; j < i*2+1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
10. (循环)*输出99 乘法表
public class Test210 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <=i; j++) {
System.out.print(j+"*"+i+"="+(i*j)+" ");
}
System.out.println();
}
}
}
11. (循环)**求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足
a3+b3+c3=abc,则abc 是水仙花数。
public class Test211 {
public static void main(String[] args) {
for (int num = 100; num < 1000; num++) {
int a = num / 100;
int b = (num / 10) % 10;
int c = num % 10;
if (Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3) == num) {
System.out.println(num);
}
}
}
}
12. (循环)输入一个整数,计算它各位上数字的和。
(注意:是任意位的整数)
public class Test212 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入数字");
int number= scanner.nextInt();
int sum=0;
while (number!=0){
sum+=number%10;//取下来最后一位
number=number/10;//去掉最后一位
}
System.out.println("number="+number+"的各位数字的和为"+sum);
}
}
13. (循环)输入一整数A,判断它是否质数。
提示1:若从2 到A 的平方根的范围内,没有一个数能整除A,则A 是质数。
提示2:在java 中计算n 的平方根可以使用Math.sqrt(n)
public class Test213 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入数字");
int number= scanner.nextInt();
if(isPrime(number)){
System.out.println("number="+number+"是素数");
}
else {
System.out.println("number="+number+"不是素数");
}
}
private static boolean isPrime(int number){
if (number<=1){
return false;
}
else {
for (int i = 2; i <=Math.sqrt(number); i++) {
if (number%i==0){
return false;
}
}
}
return true;
}
}
14. (循环)如果一个数等于其所有因子之和,我们就称这个数为"完数",例如
6 的因子为1,2,3 6=1+2+3 6 就是一个完数.请编程打印出1000 以内所有的完数
public class Testr14 {
public static void main(String[] args) {
System.out.println("1000以内的完数:");
//循环找完数
for (int num = 2; num <= 1000; num++) {
if (isPerfectNumber(num)) {
System.out.println(num);
}
}
}
//判断完数
//如果一个数等于其所有因子之和,我们就称这个数为"完数"
//循环找到所有的引子相加
public static boolean isPerfectNumber(int num) {
int factorsSum = 0;
for (int i = 1; i < num; i++) {
if (num % i == 0) {
factorsSum += i;
}
}
return factorsSum == num;
}
}
15. **计算圆周率
中 国 古 代 数 学 家 研 究 出 了 计 算 圆 周 率 最 简 单 的 办
法:PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17......这个算式的结果会无
限接近于圆周率的值,我国古代数学家祖冲之计算出,圆周率在3.1415926 和
3.1415927 之间,请编程计算,要想得到这样的结果,他要经过多少次加减法运
算?
public class Test215 {
public static void main(String[] args) {
double ltargetPi=3.1415926;
double rtargetPi=3.1415927;
int iteration=calculatePi(ltargetPi,rtargetPi);
System.out.println("在"+ltargetPi+'-'+rtargetPi+"范围内,进行了"+iteration+"次迭代!");
}
//不断更新calculatePi的值以至于获取逼近的Π的值
public static int calculatePi(double ltargetPi,double rtargetPi){
double calculatePi=0.0;//存储Π的值。下面计算的时候会一直更新这个值,一直去逼近Π
int sign=1;//表示正负号的
int denominator=1;//表示分母 每次迭代会+2
int iteration=0;//表示迭代的次数,0表示没有进行迭代
//每次迭代逼近目标的Π值
//每次循环计算的是精度,大于的话就是还没到精度就会一直循环下去
while (true){
double term=sign*(4.0/denominator);//必须是x.0的形式不然不是double
calculatePi+=term;//计算当前的Π值
sign*=-1;//变换符号
denominator+=2;//更新分母
iteration++;//更新迭代次数
if (ltargetPi<=calculatePi&&calculatePi<=rtargetPi){
break;
}
}
return iteration;//得到迭代次数
}
}
16. (循环)已知:faibonacci(费波那契)数列的前几个数分别为0,1,1,
2,3,5,……。从第3 项开始,每一项都等于前两项的和。
读入一个整数n,编程求出此数列的前n 项。
注意:这里的数列是从0 开始的。
public class Test216 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入数字");
int number= scanner.nextInt();
System.out.print("前n项");
for (int i = 0; i < number; i++) {
System.out.print(fibonacci(i)+" ");
}
System.out.println();
}
//求斐波那契数组
private static long fibonacci(int n){
if (n==0) {//递归出口
return 0;
}
else if (n==1) {
return 1;//递归出口
}
else {//递归方程
return fibonacci(n-1)+fibonacci(n-2);
}
}
}
17. (循环,操作符)一个int 类型的整数由32 个二进制位组成,每个二进
制位的值要么为0 要么为1。要求读入一个int 类型的整数n,计算它的32 个二
进制位中总共有多少位为1?
public class Test217 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入数字");
int number= scanner.nextInt();
System.out.println(number+"中1的数量为"+countOnes(number));
}
//计算int中的整数的量(采用移位的方式)
public static int countOnes(int n) {
int count = 0;
for (int i = 0; i < 32; i++) {
if ((n & 1) == 1) {
count++;
}
n >>= 1;
}
return count;
}
}
18. (循环)打渔还是晒网
中国有句老话叫“三天打渔,两天晒网”。假设有一个人从2000 年1 月1 日
开始“三天打渔两天晒网”,读入三个整数,分别表示年份、月份、日期,
问这三个整数所表示的那天这个人在打渔还是在晒网?
public class Test218 {
public static void main(String[] args) {
int year ; // 示例:年份为2000
int month ; // 示例:月份为1
int day ; // 示例:日期为5
Scanner scanner=new Scanner(System.in);
System.out.println("请输入年份");
year=scanner.nextInt();
System.out.println("请输入月份");
month=scanner.nextInt();
System.out.println("请输入日");
day=scanner.nextInt();
LocalDate startDate = LocalDate.of(2000, 1, 1); // 开始日期
LocalDate targetDate = LocalDate.of(year, month, day); // 给定日期
//计算出开始日期和目标日期之间的天数差,并将其加1,得到总天数
//ChronoUnit.DAYS.between 方法计算出开始日期和目标日期之间的天数差
long days = ChronoUnit.DAYS.between(startDate, targetDate) + 1; // 计算日期间隔,需要加1
int count = (int) (days % 5); // 取余数
if (count == 1 || count == 2 || count == 3) {
System.out.println("这个人在打渔。");
} else {
System.out.println("这个人在晒网。");
}
}
}