洛谷题单:【入门1】顺序结构

(1) P1001 A+B Problem
入门题,这题估计只是为了让大家熟悉洛谷这个平台吧!题目给定数据范围|a|,|b|都小于10e9,所以用int即可,因为int可以储存的最大值是2147483647,就是2*10e9多一点。如果题目数据稍微再大一点,就要用long来存储了。

import java.util.Scanner;

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

(2) P1000 超级玛丽游戏
做这道题我就想起来上小学时的罚抄,也是这样无聊。我看题解有的大佬还是根据马里奥的头部身体分别写了几个函数(这是有多无聊,直接复制粘贴它不香嘛!)这道题就算单纯的打印图形,细心一点就是啦。注意提交代码的时候不要带package,主类名要改为Main,我做这道题的时候忘记改了导致编译错误。

public class Main {
	public static void main(String[] args) {
		System.out.println("                ********");
		System.out.println("               ************");
		System.out.println("               ####....#.");
		System.out.println("             #..###.....##....");
		System.out.println("             ###.......######              ###            ###");
		System.out.println("                ...........               #...#          #...#");
		System.out.println("               ##*#######                 #.#.#          #.#.#");
		System.out.println("            ####*******######             #.#.#          #.#.#");
		System.out.println("           ...#***.****.*###....          #...#          #...#");
		System.out.println("           ....**********##.....           ###            ###");
		System.out.println("           ....****    *****....");
		System.out.println("             ####        ####");
		System.out.println("           ######        ######");
		System.out.println("##############################################################");
		System.out.println("#...#......#.##...#......#.##...#......#.##------------------#");
		System.out.println("###########################################------------------#");
		System.out.println("#..#....#....##..#....#....##..#....#....#####################");
		System.out.println("##########################################    #----------#");
		System.out.println("#.....#......##.....#......##.....#......#    #----------#");
		System.out.println("##########################################    #----------#");
		System.out.println("#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#");
		System.out.println("##########################################    ############");
	}
}

(3)P5703 【深基2.例5】苹果采购
emmm,这道题的名字我觉得叫错了。这道题应该和A*B problem,明明和第一题一样嘛,连数据规模都还是10e9.但它还是没有设坑,两个10e9乘的话按理要用long来存的,但用int还是可以过,因为这题数据没那么大。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt(),b=sc.nextInt();
		System.out.println(a*b);
	}
}

(4) P5704 【深基2.例6】字母转换
这题有两种解法:
第一种:如果你所用的语言有自动转换的函数可以直接调用API来进行大小写转换。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println(sc.nextLine().toUpperCase());
	}
}

第二种:如果没有的话,如果看过ASCII码的同学都知道,小写字母-32=大写字母,这样也可以得出答案。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println((char)(sc.nextLine().charAt(0)-32));
	}
}

(5) P5705 【深基2.例7】数字反转
三种解法:
第一种,这道题虽然是数字反转,其实可以看作字符串来处理。直接调用语言自带的反转函数就可以啦。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		//调用StringBuilder的reverse函数反转
		System.out.println(new StringBuilder(sc.nextLine()).reverse());
	}
}

第二种,如果有些语言并没有反转函数,其实实现起来也不难,建立一个新的字符串,首字符等于原字符串最后一位,第二个字符等于原字符倒数第二位… 用一个for循环就可以搞定。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		StringBuilder sb=new StringBuilder();
		for(int i=s.length()-1;i>=0;i--) {
			sb.append(s.charAt(i));
		}
		System.out.println(sb);
	}
}

第三种,如果你不想用字符串。因为这题说明了小数点后面只有一位,整数部分也是一个3位数,完全就可以只把小数和整数拆开,只对整数做反转,然后输出时候把小数加在前面。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		double x=sc.nextDouble();
		int a=(int)x; //获得整数部分
		int b=(int)(x*10)%10; //获得小数位
		int c=0;
		while(a>0) {
			c=c*10+a%10;
			a/=10;
		}
		System.out.println(b+"."+c);
	}
}

(6) P5706 【深基2.例8】再分肥宅水
这题可以叫做一个A/B问题,还是和之前A*B,A+B一样,但不同的地方在于它是一个浮点数,要保留3位小数。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		double a=sc.nextDouble();
		int b=sc.nextInt();
		System.out.println(String.format("%.3f", a/b));
        System.out.println(b*2);
	}
}

(7) P1425 小鱼的游泳时间
又来了个A-B问题,四则运算都被凑齐了,这题就是两个时间差相减即可,如果分钟不够,要向时借一位。另外,1小时等于60分钟,不要写成100了。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt(),d=sc.nextInt();
		if(d<b) { //如果分钟要向时借一位
			System.out.println(c-1-a+" "+(d+60-b));
		}
		else {
			System.out.println(c-a+" "+(d-b));
		}
	}
}

(8) P1421 小玉买文具
这道题用小玉所有的钱除单价就可以得到能买的最多的数量啦。另外我们要知道如果钱数不足买一只笔是要向下取整的,刚好计算机中的整型除法满足这一点,所以我们把金额转换成角来计算,即1元等于10角。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt(),b=sc.nextInt();
		System.out.println((a*10+b)/19);
	}
}

(9) 深基2.习6】Apples Prologue
这题和上题有点相反,上题是向下取整,这题是要向上取整,因为题目要求输出完整的苹果数,也就是说,一个苹果吃到一半了它也不算完整的苹果。但int类型不会向上取整,所以我们要判断一下,如果有一个苹果吃到一半了,那么苹果数再减1。这题还有个小坑,就是说如果苹果不够吃了,那么就特判下输出0。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int m=sc.nextInt(),t=sc.nextInt(),s=sc.nextInt();
		int apple;
		if(s%t!=0) { //如果有苹果吃到一半
			
			apple=m-s/t-1;
		}
		else {
			apple=m-s/t;
		}
		if(apple<0) {   //如果苹果不够吃了
			System.out.println(0);
		}
		else {
			System.out.println(apple);
		}
	}
}

(10)P2181 对角线
这道题考查组合数学的知识,题目说明了不会有三条对角线交于一点。那么过一个交点只会有两条对角线,而两条对角线是由4个顶点组成的。所以这道题就是问,这个n边形可以转换为多少个4边形,也就是说在这个n边形种任意取4个点,有多少种情况?根据排列组合我们得出公式 C n 4 C_n^4 Cn4 ,所以得出O(1)复杂度的公式:n*(n-1)(n-2)(n-3)/24
这里的数据大小java是肯定会溢出的,所以要用高精度。而c++有long long类型,可以洛谷有大佬利用一些技巧使得数据不会溢出。
n*(n-1)是2的倍数,n*(n-1)(n-2)是3的倍速,所以可以将上述公式拆分成
n
(n-1)/2*(n-2)/3*(n-3)/4

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

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		BigInteger n=sc.nextBigInteger();
		BigInteger a=new BigInteger("1");
		for(int i=0;i<4;i++) {
			BigInteger b=new BigInteger(i+"");
			a=a.multiply(n.subtract(b));
		}
		a=a.divide(new BigInteger(24+""));
		System.out.println(a);
	}
}

你可能感兴趣的:(洛谷题单java解析)