算法入门——洛谷第三章_循环结构(JAVA)

目录

        P5718 【深基4.例2】找最小值

        P5719 【深基4.例3】分类平均​

        P5720 【深基4.例4】一尺之棰​

        P5721 【深基4.例6】数字直角三角形​

        P1009 [NOIP1998 普及组] 阶乘之和​

        P1980 [NOIP2013 普及组] 计数问题​

        P1035 [NOIP2002 普及组] 级数求和​

        P2669 [NOIP2015 普及组] 金币​

        P5722 【深基4.例11】数列求和​

        P5723 【深基4.例13】质数口袋​

        P1217 [USACO1.5] 回文质数 Prime Palindromes​

        P1423 小玉在游泳​

        P1307 [NOIP2011 普及组] 数字反转​

        P1720 月落乌啼算钱(斐波那契数列)​

        P5724 【深基4.习5】求极差 / 最大跨度值​

        P1420 最长连号​

        P1075 [NOIP2012 普及组] 质因数分解​

        P5725 【深基4.习8】求三角形​

        P5726 【深基4.习9】打分​

        P4956 [COCI2017-2018#6] Davor​

        P1089 [NOIP2004 提高组] 津津的储蓄计划​


P5718 【深基4.例2】找最小值

import java.math.MathContext;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a,b = 1000;
		int n = sc.nextInt();
		for(int i = 0;i<n;i++) {
			a = sc.nextInt();
			b= b<a?b:a;
		}
		System.out.println(b);
	}
}

因为题中给出了,最大的值是1000,故最小值肯定不大于1000,所以将b设为1000


P5719 【深基4.例3】分类平均

import java.math.MathContext;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		double a = 0 ,b = 0;
		int n1 = 0, n2 = 0;
		for(int i = 1;i<=n;i++) {
			if(i%k == 0) {
				a += i;
				n1++;
			}
			else {
				b += i;
				n2++;
			}
		}
		System.out.printf("%.1f %.1f",a/n1,b/n2);
	}
}

P5720 【深基4.例4】一尺之棰

import java.math.MathContext;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		double a = sc.nextInt();
		int n = 1;
		while(true) {
			if(Math.floor(a/2) == 1) {
				n++;
				break;
			}
			else if(a==1) {
				break;
			}
			else {
				n++;
				a = Math.floor(a/2);
			}
		}
		System.out.println(n);
	}
}

P5721 【深基4.例6】数字直角三角形

import java.math.MathContext;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int b = 1;
		for(int i = n;i>=1;i--) {
			for(int a = 1;a<=i;a++) {
				System.out.printf("%02d",b);
				b++;
			}
			System.out.println();
		}
	}
}

 外层循环控制行数,内层控制数字递增


P1009 [NOIP1998 普及组] 阶乘之和

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		BigInteger a = new BigInteger("0");
		BigInteger c = BigInteger.valueOf(1);
		for(int i =1;i<=n;i++) {
			for(int b = i;b<=i;b++) {
				c = c.multiply(BigInteger.valueOf(b));
			}
		a = a.add(c);
		}
		if(n==0)
			System.out.println(0);
		else
			System.out.println(a);
	}
}

外层循环需要相加的阶乘数量,内层计算阶乘

高精度到【算法1-1】补充喵~


P1980 [NOIP2013 普及组] 计数问题

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int d = 0;
		char b = sc.next().charAt(0);
		int a = 0;
		for(int i = 1;i<=n;i++) {
			String e = String.valueOf(i);
			String c = e.replaceAll(b+"","");
			int a1 = e.length() - c.length();
			d += a1;
		}
		System.out.println(d);
	}
}

 循环内部将从1开始的每个数依次都转换为字符串,再替换掉所需要查找的字符,最后两者的长度差就是所查字符占据的位数。


P1035 [NOIP2002 普及组] 级数求和

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int k = sc.nextInt();
            double sum = 0;
            for(int i = 1;;i++){
                sum += 1.0/i;
                if(k<sum) {
                    k = i;
                    break;
                }
            }
            System.out.println(k);
        }
    }

P2669 [NOIP2015 普及组] 金币

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int m = 1;
            int sum = 0;
            int i = 0;
            int k = sc.nextInt();
            for(;;){
                for(int l = 1;l<=m;l++){
                    sum += m;
                    i++;
                    if(l == m){
                        m++;
                        break;
                    }
                    if(i == k)
                        break;
                }
                if(i == k)
                    break;
            }
            System.out.println(sum);
        }
    }

i:总天数

l:发放这次工资的天数

m:发放这次工资每天得到的金币数

思路:外部循环:更新m,l;内部循环:计算总共得到的钱数,以及总天数(i)

内外循环结束条件均为:达到题目指定循环总天数


P5722 【深基4.例11】数列求和

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int sum = 0;
            int a = sc.nextInt();
            for(int i = 0;i<=a;i++){
                sum+=i;
            }
            System.out.println(sum);
        }
    }

P5723 【深基4.例13】质数口袋

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int k = sc.nextInt();
            int sum = 0;
            int n = 0;
            for(int m = 2;;m++){
                if(b(m)){
                    sum+=m;
                    if(sum>k)
                        break;
                    n++;
                    System.out.println(m);
                }
            }
            System.out.println(n);
        }
        static boolean b(int q){
            for(int a = 2;a<=Math.sqrt(q);a++){
                if(q%a == 0)
                    return false;
            }
            return true;
        }
    }

 b方法用来判断这个数是否为质数,在主循环中,如果这个数为质数,放入口袋,如果不超过口袋的荷载量,就打印,超过就跳出循环。


P1217 [USACO1.5] 回文质数 Prime Palindromes

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int a = sc.nextInt();
            int b = sc.nextInt();
            int pa = 0;
            String sb = String.valueOf(b);
            int bl = sb.length();
            for(int i = 1;i<=bl;i++) {
                switch (i) {
                    case 1:
                        //质数一定不是二的倍数,简化掉以2的倍数结尾的数
                        for (int a1 = 1; a1 <= 9; a1 += 2) {
                            pa = a1;
                            if (pa >= a && pa <= b && zhishu(pa))
                                System.out.println(pa);
                        }
                        break;
                    case 2:
                        for (int a1 = 1; a1 <= 9; a1 += 2) {
                            pa = a1 * 10 + a1;
                            if (pa >= a && pa <= b && zhishu(pa))
                                System.out.println(pa);
                        }
                        break;
                    case 3:
                        for (int a1 = 1; a1 <= 9; a1 += 2) {
                            for (int b1 = 0; b1 <= 9; b1++) {
                                pa = a1 * 100 + b1 * 10 + a1;
                                if (pa >= a && pa <= b && zhishu(pa))
                                    System.out.println(pa);
                            }
                        }
                        break;
//                    case 4:
//                        for (int a1 = 1; a1 <= 9; a1 += 2) {
//                            for (int b1 = 0; b1 <= 9; b1++) {
//                                pa = a1 * 1000 + b1 * 100 + b1 * 10 + a1;
//                                if (pa >= a && pa <= b && zhishu(pa))
//                                    System.out.println(pa);
//                            }
//                        }
//                        break;
                    //偶数次回文数没有质数,除11外
                    case 5:
                        for (int a1 = 1; a1 <= 9; a1 += 2) {
                            for (int b1 = 0; b1 <= 9; b1++) {
                                for (int c1 = 0; c1 <= 9; c1++) {
                                    pa = a1 * 10000 + b1 * 1000 + c1 * 100 + b1 * 10 + a1;
                                    if (pa >= a && pa <= b && zhishu(pa))
                                        System.out.println(pa);
                                }
                            }
                        }
                        break;
                    case 6:
                        for (int a1 = 1; a1 <= 9; a1 += 2) {
                            for (int b1 = 0; b1 <= 9; b1++) {
                                for (int c1 = 0; c1 <= 9; c1++) {
                                    pa = a1 * 100000 + b1 * 10000 + c1 * 1000 + c1*100+ b1 * 10 + a1;
                                    if (pa >= a && pa <= b && zhishu(pa))
                                        System.out.println(pa);
                                }
                            }
                        }
                        break;
                    case 7:
                        for (int a1 = 1; a1 <= 9; a1 += 2) {
                            for (int b1 = 0; b1 <= 9; b1++) {
                                for (int c1 = 0; c1 <= 9; c1++) {
                                    for(int d1 = 0;d1<=9;d1++) {
                                        pa = a1 * 1000000 + b1 * 100000 + c1 * 10000+ d1*1000+ c1 * 100 + b1 * 10 + a1;
                                        if (pa >= a && pa <= b && zhishu(pa))
                                            System.out.println(pa);
                                    }
                                }
                            }
                        }
                        break;
                    case 8:
                        for (int a1 = 1; a1 <= 9; a1 += 2) {
                            for (int b1 = 0; b1 <= 9; b1++) {
                                for (int c1 = 0; c1 <= 9; c1++) {
                                    for(int d1 = 0;d1<=9;d1++) {
                                        pa = a1 * 10000000 + b1 * 1000000 + c1 * 100000+ d1*10000 +d1*1000+ c1 * 100 + b1 * 10 + a1;
                                        if (pa >= a && pa <= b && zhishu(pa))
                                            System.out.println(pa);
                                    }
                                }
                            }
                        }
                        break;
//                    case 9:
//                        for (int a1 = 1; a1 <= 9; a1 += 2) {
//                            for (int b1 = 0; b1 <= 9; b1++) {
//                                for (int c1 = 0; c1 <= 9; c1++) {
//                                    for(int d1 = 0;d1<=9;d1++) {
//                                        for(int e1 = 0;e1<=9;e1++) {
//                                            pa = a1 * 100000000 + b1 * 10000000 + c1 * 1000000 + d1 * 100000+e1*10000 + d1 * 1000 + c1 * 100 + b1 * 10 + a1;
//                                            if (pa >= a && pa <= b && zhishu(pa))
//                                                System.out.println(pa);
//                                        }
//                                    }
//                                }
//                            }
//                        }
//                        break;
                    //一亿并不是回文数,也不是质数
                }
            }
        }
        static boolean zhishu(int a){
            if(a<5)
                return false;
            for(int b = 2;b <= Math.sqrt(a);b++){
                if( a % b == 0)
                    return false;
            }
            return true;
    }
}

 在判断质数时注意,题目范围时5-100000000,所以5之前的质数不考虑

思路:以五位回文质数为例,其形式为: abcba,所以可以利用三次循环分别给abc赋值来得到这个数。


P1423 小玉在游泳

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            double a = sc.nextDouble();
            double b = 2;
            double c = 2;
            int n = 1;
            for(;;){
                if(c<a) {
                    b *= 0.98;
                    c += b;
                    n++;
                }
                else{
                    System.out.println(n);
                    break;
                }
            }
        }
}

P1307 [NOIP2011 普及组] 数字反转

import java.util.Scanner;
//此题坑点 : 需考虑0的情况

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();
            char[] arr = new char[str.length()];
            boolean is = false;
            boolean a = false;
            if(str.length() == 1)
                System.out.println(str.charAt(0));
            else if(str.charAt(0) == '-')
                arr = new char[str.length() - 1 ];
            for(int i = 0 ; i<arr.length;i++){
                if (str.charAt(0) == '-'){
                    is = true;
                    arr[i] = str.charAt(i+1);
                }
                else{
                    arr[i] = str.charAt(i);
                }
            }
            if(is)
                System.out.printf("-");
            for(int i = 0;i<arr.length;i++) {
                if(arr[arr.length - i -1] != '0' || a){
                    System.out.printf("%c",arr[arr.length - i - 1]);
                    a = true;
                }
            }
        }
}

 思路:正着输入,倒着输出。

先看输入的字符串有没有符号,来决定数组的长度,输出的时候从最后一位往前输出,并且需要判断首位是否是零,但是除首位外,其他的零都需要保留

这题直接用字符串做会更简单,可以看之后【入门5-字符串】中的数字反转


P1720 月落乌啼算钱(斐波那契数列)

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            double a = Math.sqrt(5);
            double b = (Math.pow((1+a),n)-Math.pow((1 - a),n))/(Math.pow(2,n)*a);
            System.out.printf("%.2f",b);
        }
}

 这题好像能化简,但是直接输这个公式也行

所以说,这题跟斐波那契数列有啥关系喵?真没看出来qwq


P5724 【深基4.习5】求极差 / 最大跨度值

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int min = 1000,max = 0;
            for(int i = 0;i<n;i++) {
                int a = sc.nextInt();
                if(a>max)
                    max = a;
                if(a<min)
                    min = a;
            }
            int c = max - min;
            System.out.println(c);
        }
}

P1420 最长连号

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int b = sc.nextInt();
            int max = 1;
            int m = 1;
            for(int i = 0; i<n-1;i++){
                int a = sc.nextInt();
                if(b+1 == a){
                    m++;
                }
                else{
                    m = 1;
                }
                if(m>max)
                    max = m;
                b = a;
            }
            System.out.println(max);
        }
}

思路:直接先读入一个数,再读入下一个数,看看后一个数是否等于前一个数加一,若等,连号数加一,若不等,初始化连号数,每次操作完连号数都需要将a,b重新赋值,以便下一次循环使用


P1075 [NOIP2012 普及组] 质因数分解

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int a = sc.nextInt();
            int b = 2;
            for(int i = 1;2*i+1<Math.sqrt(a);i++){
                if(a%b==0){
                    break;
                }
                b = 2*i+1;
            }
            System.out.println(Math.max(b, a / b));
        }
}

P5725 【深基4.习8】求三角形

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                int n = sc.nextInt();
                int n1 = 0;
                int c = 1;
                for(int i = 1; i<= n*n;i++){
                        System.out.printf("%02d",i);
                        if(i%n == 0)
                                System.out.println();
                }
                System.out.println();
                for(int i = 1;i<=n;i++){
                        for(int a = 1;a<=(n-i)*2;a++)
                                System.out.printf(" ");
                        for(int b = 1;b<=i;b++){
                                System.out.printf("%02d",c);
                                n1++;c++;
                                if(n1 == i) {
                                        System.out.println();
                                        n1 = 0;
                                }

                        }
                }
        }
}

 正方形直接打印即可,三角形的需要打印空格占位


P5726 【深基4.习9】打分

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                int n = sc.nextInt();
                int max = 0,min = 10;
                int sum = 0;
                for(int i = 0;i<n;i++){
                        int a = sc.nextInt();
                        sum+=a;
                        if(a<min)
                                min = a;
                        if(a>max)
                                max = a;
                }
                sum = sum - min - max;
                double n1 = n-2;
                double avg = sum/n1;
                System.out.printf("%.2f",avg);
        }
}

P4956 [COCI2017-2018#6] Davor

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                int sum = sc.nextInt();
                int x = 1;
                int xm = 0;
                int k = 0;
                int km = 0;
                for(;x<=100;x++){
                        km = sum - 7*52*x;
                        if(km%(52*21) == 0 && km>0) {
                                xm = x;
                                k = km / (52 * 21);
                        }
                }
                System.out.println(xm);
                System.out.println(k);
        }
}

思路:在筹集到的总钱数里,一部分是7*52*x另一部分是52*(1+2+3+4+5+6)*k,且注意x,k均为正整数。


P1089 [NOIP2004 提高组] 津津的储蓄计划

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                int b = 0;
                int sum = 0;//结余
                int save = 0;
                int m = 0;
                boolean d = true;//钱是否够用
                for(int i = 1;i<=12;i++){
                        int a = sc.nextInt();
                        b = 300 + sum - a;
                        if(b/100>=0){
                                save += b/100;//存入整百的个数
                                sum = b - b/100*100;//目前结余减去整百的金额
                        }
                        if(b<0) {
                                m = i;
                                System.out.println("-" + m);
                                d = false;
                                break;
                        }
                }
                if(d){
                        int e = (int) (sum+save*100*1.2);
                        System.out.printf("%d",e);
                }
        }
}

 很简单的一个小模拟,不好懂的地方已经标注在代码里了


有问题欢迎大家来评论区留言

我们下次见喵~

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值