洛谷刷题计划1

从今天开始在CSDN上发布洛谷官方题单的题解,题解语言包含c++和java,本篇博客包含【入门1】顺序结构内得所有题目

B2002 Hello,World!

实属是真·入门级题目,对于c++而言输出使用cout或者printf,对于java而言有些点需要注意:如果需要换行的话可以使用System.out.print("\n")或者System.out.println(""),但如果你使用后者,则不能再括号内再填入"\n",因为println本来就是自带换行,如果再填"\n",就会出现两个换行,导致WA.下面贴上程序:

#include<iostream>
using namespace std;
int main()
{
    cout<<"Hello,World!";
    return  0;
}
public static Main{  //对于洛谷而言,java程序提交需要用Main作为文件名
    public static void main(String[] args){
        System.out.print("Hello,World!");
    }
}

B2025 输出字符菱形

也是简单的输出题目,不过我很好奇,为什么选了这题还要加超级玛丽游戏来折磨各位,有多少人在编译器上调了多久才打出AC程序:

#include<iostream>
using namespace std;
int main()
{
    cout<<"  *"<<endl;
    cout<<" ***"<<endl;
    cout<<"*****"<<endl;
    cout<<" ***"<<endl;
    cout<<"  *";
    return 0;
}
public class Main{
    public static void main(String[] args){
        System.out.println("  *\n"+" ***\n"+"*****\n"+" ***\n"+"  *");
    }
}

趁这个机会讲一下java的连续输出。

可以类比一下c++,c++中的连续输出的格式是这样的:cout<<" "<<" "<<...(<<endl);在java中用“+”代替“<<”,而对于数据而言,会将数据变成string类型再输出,毕竟打印肯定是打印字符串嘛。

P1000 超级玛丽游戏

我本来是不想写这题的,但考虑着可能各位在学校会被要求写,抄题解的话,嗯,我还是写吧。

#include<cstdio>
using namespace std;
int main()
{
	printf(
	"                ********\n"
    "               ************\n"
    "               ####....#.\n"
    "             #..###.....##....\n"
    "             ###.......######              ###            ###\n" 
    "                ...........               #...#          #...#\n"
    "               ##*#######                 #.#.#          #.#.#\n"
    "            ####*******######             #.#.#          #.#.#\n"
    "           ...#***.****.*###....          #...#          #...#\n"
    "           ....**********##.....           ###            ###\n"
    "           ....****    *****....\n"
    "             ####        ####\n"
    "           ######        ######\n"
    "##############################################################\n"
    "#...#......#.##...#......#.##...#......#.##------------------#\n"
    "###########################################------------------#\n"
    "#..#....#....##..#....#....##..#....#....#####################\n"
    "##########################################    #----------#\n"
    "#.....#......##.....#......##.....#......#    #----------#\n"
    "##########################################    #----------#\n"
    "#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n"
    "##########################################    ############\n"
    );
	return 0; 
}

你看,用printf是多么的方便啊。

import java.util.Scanner;

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

想要换行码字吗?建议使用双双引号!

对了,洛谷上貌似有个语言叫做文言,为了水长度,就把文言程序贴上来吧,为了防止有人说这程序不是我写的,嘿!你怎么能这么说呢?这可是我辛辛苦苦从网上找到的!

吾有一數。曰二十二。名之曰「高」。吾有一數。曰六十二。名之曰「宽」。
吾有一列。名之曰「图」。
吾有一言。曰「「#」」。名之曰「井」。吾有一言。曰「「.」」。名之曰「点」。
吾有一言。曰「「-」」。名之曰「减」。吾有一言。曰「「 」」。名之曰「空」。
吾有一言。曰「「*」」。名之曰「星」。

吾有一術。名之曰「画」。欲行是術。必先得五數。曰「甲一」。曰「乙一」。曰「甲二」。曰「乙二」。曰「字」。乃行是術曰。
	減「甲二」以「甲一」。加其以一。名之曰「甲」。
	減「乙二」以「乙一」。加其以一。名之曰「乙」。
	為是「甲」遍。
		吾有一數。曰「乙一」。名之曰「丙」。
		為是「乙」遍。
			乘「甲一」以「宽」。加其以「丙」。加其以一。名之曰「丁」。
			昔之「图」之「丁」者。今「字」是矣。
			加「丙」以一。昔之「丙」者。今其是矣。
		云云。
		加「甲一」以一。昔之「甲一」者。今其是矣。
	云云。
是謂「画」之術也。

吾有一術。名之曰「画点」。欲行是術。必先得三數。曰「甲」。曰「乙」。曰「字」。乃行是術曰。
	施「画」於「甲」。於「乙」。於「甲」。於「乙」。於「字」。
是謂「画点」之術也。

吾有一術。名之曰「画地」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「甲」以八。名之曰「丙」。加「乙」以十三。名之曰「丁」。
	施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「井」。
	吾有一列。名之曰「戊」。充「戊」以一。以三。以五。以七。
	凡「戊」中之「己」。
		加「己」以「甲」。名之曰「庚」。加「乙」以一。名之曰「丙」。加「乙」以十二。名之曰「丁」。
		施「画」於「庚」。於「丙」。於「庚」。於「丁」。於「点」。
	云云。
	加「甲」以一。名之曰「丙」。加「乙」以四。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以十一。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以三。名之曰「丙」。加「乙」以三。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以三。名之曰「丙」。加「乙」以八。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以五。名之曰「丙」。加「乙」以六。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以七。名之曰「丙」。加「乙」以二。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以七。名之曰「丙」。加「乙」以五。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以七。名之曰「丙」。加「乙」以十。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
是謂「画地」之術也。

吾有一術。名之曰「画島」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「甲」以三。名之曰「丙」。加「乙」以十九。名之曰「丁」。
	施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以一。名之曰「丁」。加「甲」以二。名之曰「戊」。加「乙」以十八。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「减」。
	加「甲」以四。名之曰「丙」。加「乙」以四。名之曰「丁」。加「甲」以八。名之曰「戊」。加「乙」以十五。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「井」。
	加「甲」以四。名之曰「丙」。加「乙」以五。名之曰「丁」。加「甲」以七。名之曰「戊」。加「乙」以十四。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「减」。
是謂「画島」之術也。

吾有一術。名之曰「画币」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「甲」以五。名之曰「丙」。加「乙」以四。名之曰「丁」。
	施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以一。名之曰「丁」。加「甲」以四。名之曰「戊」。加「乙」以三。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「点」。
	加「甲」以二。名之曰「丙」。加「乙」以二。名之曰「丁」。加「甲」以三。名之曰「戊」。加「乙」以二。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「井」。
	施「画点」於「甲」。於「乙」。於「空」。
	加「甲」以五。名之曰「丙」。施「画点」於「丙」。於「乙」。於「空」。
	加「乙」以四。名之曰「丙」。施「画点」於「甲」。於「丙」。於「空」。
	加「甲」以五。名之曰「丙」。加「乙」以四。名之曰「丁」。施「画点」於「丙」。於「丁」。於「空」。
是謂「画币」之術也。

吾有一術。名之曰「画人」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「乙」以五。名之曰「丙」。加「乙」以十二。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以四。名之曰「丙」。加「乙」以十五。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以四。名之曰「丙」。加「乙」以七。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以八。名之曰「丙」。加「乙」以十三。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「乙」以十二。名之曰「丙」。施「画点」於「甲」。於「丙」。於「井」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以二。名之曰「丙」。加「乙」以十四。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以三。名之曰「丙」。加「乙」以四。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「乙」以八。名之曰「丙」。加「乙」以十二。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「乙」以十五。名之曰「丙」。加「乙」以十八。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以二。名之曰「丙」。加「乙」以十七。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以五。名之曰「丙」。加「乙」以十一。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以五。名之曰「丙」。加「乙」以十五。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以四。名之曰「丙」。加「乙」以十三。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以六。名之曰「丙」。施「画点」於「甲」。於「丙」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以一。名之曰「丙」。加「乙」以十七。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以五。名之曰「丙」。加「乙」以十一。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「甲」以二。名之曰「丙」。加「乙」以二十。名之曰「丁」。施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「点」。
	加「乙」以四。名之曰「丙」。加「甲」以二。名之曰「丁」。加「乙」以十六。名之曰「戊」。施「画」於「甲」。於「丙」。於「丁」。於「戊」。於「星」。
	加「乙」以三。名之曰「丙」。施「画点」於「甲」。於「丙」。於「井」。
	加「乙」以十四。名之曰「丙」。加「甲」以一。名之曰「丁」。加「乙」以十六。名之曰「戊」。施「画」於「甲」。於「丙」。於「丁」。於「戊」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以十六。名之曰「丁」。施「画点」於「丙」。於「丁」。於「点」。
	加「甲」以二。名之曰「丙」。加「乙」以八。名之曰「丁」。加「甲」以二。名之曰「戊」。加「乙」以十一。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「空」。
	加「乙」以七。名之曰「丙」。施「画点」於「甲」。於「丙」。於「点」。
	加「乙」以十二。名之曰「丙」。施「画点」於「甲」。於「丙」。於「点」。
	加「甲」以三。名之曰「丙」。加「甲」以四。名之曰「丁」。加「乙」以十九。名之曰「戊」。
	施「画」於「丙」。於「乙」。於「丁」。於「戊」。於「井」。
	加「甲」以三。名之曰「丙」。加「乙」以六。名之曰「丁」。加「甲」以四。名之曰「戊」。加「乙」以十三。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「空」。
	加「甲」以三。名之曰「丙」。加「甲」以三。名之曰「丁」。加「乙」以一。名之曰「戊」。
	施「画」於「丙」。於「乙」。於「丁」。於「戊」。於「空」。
	加「甲」以三。名之曰「丙」。加「乙」以十八。名之曰「丁」。加「甲」以三。名之曰「戊」。加「乙」以十九。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「空」。
是謂「画人」之術也。

施「画人」於一。於十二。
施「画地」於十四。於一。施「画地」於十四。於十五。施「画地」於十四。於二十九。
施「画島」於十四。於四十三。
施「画币」於五。於四十三。施「画币」於五。於五十八。

吾有一數。曰一。名之曰「甲」。
為是「高」遍。
	吾有一言。曰「「」」。名之曰「果」。
	吾有一數。曰一。名之曰「乙」。
	為是「宽」遍。
		乘「甲」以「宽」。加其以「乙」。加其以一。名之曰「丙」。
		夫「图」之「丙」。名之曰「丁」。
		若「丁」等於變者。昔之「丁」者。今「空」是矣也。
		加「果」以「丁」。昔之「果」者。今其是矣。
		加「乙」以一。昔之「乙」者。今其是矣。
	云云。
	吾有一言。曰「果」。書之。
	加「甲」以一。昔之「甲」者。今其是矣。
云云。

P1001 A+B Problem

一个真正踏出第一部的程序,涉及到定义变量,数据输入和处理。无论是c++和java在输入上有些相似之处,比如#include<iostream>import java.util.Scanner;简单来说都是引入输入输出流,并且都是写在程序最头上。

c++的输入都比较简单,cin或者是scanf都是不错的选择,但是scanfprintf需要记背类型取址符(格式符),这里有个表,是从《CCF中学生计算机程序设计入门篇》中扣下来的:

printf函数的格式符
格式字符意义
d以十进制形式输出带符号整数(正整数不输出符号)
o以八进制形式输出无符号整数(不输出前缀0)
x,X以十六进制形式输出无符号整数(不输出前缀Ox)
u以十进制形式输出无符号整数
f,lf以小数形式输出单、双精度实数
e,E以指数形式输出单、双精度实数
g,G以%f或者%e中较短的输出宽度输出单、双精度实数
c输出单个字符
s输出字符串
scanf函数的格式符
格式符说明
d,i勇于输入十进制整数
u以无符号十进制形式输入十进制整数
o用于输入八进制整数
x用于输入十六进制整数
c用于输入单个字符
s用于输入字符串(非空格开始,空格结束,字符串变量以“\0”结尾)
f用于输入实数(小数或者指数均可)
e与f相同(可与f互换)
ll用于double型实数(%lf,%le)
域宽(一个整数)制定输入所占列宽
*表示对应输入量不赋给一个变量
o_O安切洛蒂

由于printf和scanf的输入要被的东西太多,虽然很多字符都是变量类型的缩写,比如f表示floatc表示chars表示string,但还是太麻烦,所以我选择使用cin,这里是c++代码:

#include<iostream>
using namespace std;
int main
{
    int a,b;
    cin>>a>>b;
    cout<<a+b;
    return 0;
}

//很奇怪,我在c++里头不喜欢把花括号打在行末,但在java里面喜欢这样做:(

c++里头又很简单的输入方法,java里头就复杂得多了。首先是变量定义的问题。和c++一样,变量分大致为三种类型——全局变量、局部变量和常量。全局变量设定在函数(方法、类)外头,局部变量设定在函数(方法、类)里头,常量有特殊的定义方式。

对于c++而言,局部变量和全局变量的定义都是一样的,数据类型+变量名,而java不同,如果你直接在函数(方法、类)外面定义变量,编译时,编译器会告诉你“无法从静态上引用”,这是由于没有加static修饰符导致的。

常量的定义就比较简单了,对于c++而言可以用#define或者const

#define maxn 1000
const int main=-1000;

对于java而言使用public static final:

public static final int max=1000;

这些都是简单易懂且实用的写法,对于新手而言极为友好。

说完了变量定义,接着说输入。在java里头输入用的Scanner其实是一个类,这也是为什么我们还要自己定义扫描器,c++里头的scanf去掉f就是scan,这两个斯干一个是名词,一个是动词,追根到底还是同一个东西。

定义扫描器的写法是Scanner 扫描器名称=new Scanner(System.in);你问为什么,不,你不需要知道为什么。

Scanner类里面自带的有next()输入字符串,nextInt()输入整数,nextLong()输入龙,nextByte()输入比特,虽然我也不知道在oi里什么情况下会定义byte类型,nextFloat()输入单精度浮点,nextDouble()输入双精度浮点,nextChar()?对不起没有nextChar(),你问我怎么输入char类型?以后再说吧~


import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int a=in.nextInt(),b=in.nextInt();
        System.out.print(a+b);
        in.close()  //释放空间
    }
}

文尾的in.close()表示关闭扫描器,用以释放空间,但是oi程序都不是很大,再加上要崩崩的是oj又不是我的电脑,所以这东西可写可不写,但是作为c++转java,总觉得最后要写点什么,return 0?但是java里面的System.exit(0)会导致测评机RE,所以还是写个close比较舒服~

B2005 字符三角形

没想到这么快就到了“以后”,你以为我会用char?你明知道不能直接输入char,为什么不用string呢?

#include<iostream>
using namespace std;
char a;
int main()
{
    cin>>a;
    cout<<"  "<<a<<endl;
    cout<<" "<<a<<a<<a<<endl;
    cout<<a<<a<<a<<a<<a;
    return 0;
}

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String a=in.next();
        System.out.println("  "+a+"\n"+" "+a+a+a+"\n"+a+a+a+a+a);
        in.close();
    }
}

P5703 苹果采购

我搞不明白,为什么这题的通过率低得吓人,题目都说了保证输入输出在int范围内,难不成有人开的short或者byet

#include<iostream>
using namespace std;
int a,b;
int main()
{
    cin>>a>>b;
    cout<<a*b;
    return 0;
}

import java.util.Scanner;

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

P5704 字母转换

这题要是打表的话相当简单,但是对于新手而言这简直是太难了,但如果你知道ascll码的话,其实也非常好做,你问我ascll码是什么,你不会自己百度吗?

在ascll码里面,一个大写字母的编号要比其小写字母的编号小32,所以我们直接拿输入的字符减一个32就可以了,然后你就可以听取WA声一片。因为直接减的话会得到编号,也就是说输出变成了一个整数,这个时候要做强制的类型转化。

c++为 变量类型(变量或由变量组成的多项式);

java为 (变量类型)(变量或由变量组成的多项式);

#include<iostream>
using namespace std;
int main()
{
	char a;
	cin>>a;
	cout<<char(a-32);
    return 0;
}

你问我用如果我输入的变量类型为string,然后用string去减32行不行?当然不行,string是字符串,ascll码里都是字符,所以字符串是不能和整数类型直接相减的。你问我怎么办?你不会直接输入char吗?

字符串是由字符组成的,使用charAt()函数可以取出字符串中指定位置的字符,这样就能实现字符的输入了:


import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        char a=in.next().charAt(0);
        System.out.print((char)(a-32));
        in.close();
    }
}

你问我为什么括号内的数字是0不是1?你试着改一下不就知道了~

P5705 数字反转

如果你精通字符串的话非常简单,但是这就需要用到循环,这显然和这个题单的类型不符,所以这题肯定有另外的解法。

读题,可以发现,要求数据在100和1000之间,并且还是浮点数,所以必定会读入5个字符,那么我们就定义5个字符类型的变量,正着输入反着输出就可以了。

#include<iostream>
using namespace std;
int main()
{
	char a,b,c,d,e;
	cin>>a>>b>>c>>d>>e;
	cout<<e<<d<<c<<b<<a;
	return 0;
}

你问我为什么把这个程序翻译成java就RE了?难道你没有发现绝大多数的输入都是以空格或者回车作为结尾吗,c++之所以能够这样写,是因为char本身就是单个字符,单个字符只有一位,当然可以连着输入,但是java连连续输入都做不到,怎么可能还能允许连着输入呢?

这里只能用字符串来解决了,幸好我们的java花里胡哨的函数确实很多,这里找了一个,可以实现字符串反转的功能:


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        String n=in.next();
        String x=new StringBuilder(n).reverse().toString();
        System.out.print(x);
        in.close();
    }
}

好吧,我也不想这么写,但毕竟c++写的是底层,逻辑更重要,java面向对象,方法更重要:)

P5706 再分肥仔水

不会还有人不知道肥仔水是什么吧:(

这题就是考保留小数位数的方法,对于c++而言是setprecision(n)<<fixed你问我怎么记?set设置,precision精度,fixed固定,这都不会?除了precision是四六级词汇其他都是初中词汇,回炉重造吧。

#include<bits/stdc++.h>
using namespace std;
float t;
int n;
int main()
{
	cin>>t>>n;
	cout<<setprecision(3)<<fixed<<t/n<<endl<<n*2;
    return 0;
}

java的精度设定就比较简单了,毕竟java的函数是真的多:String.format(" ", )这个就比较好理解了,format即格式,这个函数之所以在String下,是因为输出的格式依旧是以字符串输出:


import java.util.Scanner;

public class Main{
    static float t;
    static int n;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        t=in.nextFloat();
        n=in.nextInt();
        System.out.print(String.format("%.3f",t/n)+"\n"+(int)(n*2));
        in.close();
    }
}

P5708 三角形面积

人家秦九韶公式都给你了还不会写?什么?不会开方?平方根的英文是sqrt,所以sqrt()函数就是用来开方的函数:

#include<bits/stdc++.h>
using namespace std;
double a,b,c;
int main()
{
	cin>>a>>b>>c;
	cout<<setprecision(1)<<fixed<<sqrt(0.5*(a+b+c)*(0.5*(a+b+c)-a)*(0.5*(a+b+c)-b)*(0.5*(a+b+c)-c));
    return 0;
}

你说java里头没有sqrt()?java里头很少有不包含在类里面的函数,开方属于数学类,所以这个函数应该写作Math.sqrt()


import java.util.Scanner;

public class try2{
    static double a,b,c;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        a=in.nextDouble();
        b=in.nextDouble();
        c=in.nextDouble();
	    System.out.println(String.format("%.1f",Math.sqrt(0.5*(a+b+c)*(0.5*(a+b+c)-a)*(0.5*(a+b+c)-b)*(0.5*(a+b+c)-c))));
        in.close();
    }
}

P5707 上学迟到

这题只要用顺序结构写的难点在于补零,如果是java的话,用Calendar类来写,加上三目运算,应该可以只用顺序结构,所以索性就简单的模拟了一下,其中ceil()表示的是向上取整:

#include<bits/stdc++.h>
using namespace std;
double s,v,m;
int n,a,t,b;
int main()
{
	cin>>s>>v;
	n=8*60+24*60;
	t=ceil(s/v)+10;
	n=n-t;
	if(n>=24*60) 
        n-=24*60;
	b=n%60;
	a=n/60;
	if(a<10)
	{
		if(b<10) 
			cout<<"0"<<a<<":0"<<b;
		else 
			cout<<"0"<<a<<":"<<b;
	}
	else
	{
		if(b<10) 
			cout<<a<<":0"<<b;
		else 
			cout<<a<<":"<<b;
	}
	return 0;
}

后来仔细想了想,发现确实可以只用顺序就够就可以解决补零的问题,实现方法也很简单,使用补位符就可以了。

“%02d”表示如果输出小余两位就补零,需要用printf输出,但我觉得这种东西oi中似乎很少用到,与其花些心思在这种小寄巧上,还不如琢磨些数据结构和算法,所以就不给补零程序了。

再说到ava,java的Calendar类就是日历,这么简单的功能实现这道题不难:


import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int s=in.nextInt();
        int y=in.nextInt();
        Calendar date=Calendar.getInstance();
        date.set(2024,Calendar.August,8,30,0,0);
        date.add(Calendar.MINUTE,-10);
        date.add(Calendar.MINUTE,s%y==0?-(s/y):-(s/y)-1);
        SimpleDateFormat format=new SimpleDateFormat("HH:mm");
        System.out.println(format.format(date.getTime()));
        in.close()
    }
}

你问我为什么写成这样?我问你为什么I跟am,you跟are?语法就是这样。唯一值得一说的是倒数第三行的运算方法,这个叫做三目(元)运算,格式如下:

表达式1 ? 表达式2 : 表达式3

为了方便大家看这个表达式,所以我在字符之间都打了空格,但实际在写的时候需不需要空格还是看个人喜好。

这个表达是的运算规则是这样的:计算表达式1的值,如果表达式1的值为真(非0),那么只计算表达式2,并将结果作为整个表达式的值,反之,如果表达式1的值为假,则只计算表达式3,并将其结果作为整个表达式的值。

这个东西其实和一个if_else没什么区别,就是输出的时候更方便;(

B2029 大象喝水

这题有个坑点,输入的单位是厘米,但是要喝的水的单位是升,这之间隔着1000的进制,要记得转:

#include<bits/stdc++.h>
using namespace std;
#define PI 3.14
double r,h;
double v;
int main()
{
	cin>>h>>r;
	v=20000/(PI*r*r*h);
	cout<<ceil(v);
	return 0;
}

import java.util.Scanner;

public class try2{
    public static final double PI=3.14;
    static double r,h,v;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        h=in.nextDouble();
        r=in.nextDouble();
        v=20000/(PI*r*r*h);
	    System.out.println(Math.ceil(v));
        in.close();
    }
}

要注意,java中的Math.ceil()函数中只能填入double类型的值,所以千万不要定义float的数据作为输入,虽然可以强制转类型。

P1425 小鱼的游泳时间

我已经不想写这种有关时间的题目了:(

模拟一下就行了嘛,虽然这题确实可以用顺序结构写,但是,你自己手算的时候肯定是先看两个时间的分钟位,看是否要向小时位借1,那么有何必强制写一个顺序结构呢:(

#include<iostream>
using namespace std;
int main()
{
	int a,b,c,d;
	cin>>a>>b>>c>>d;
	if(d>b)
		cout<<c-a<<" "<<d-b;
	else
		cout<<c-1-a<<" "<<d+60-b;
	return 0;
}

import java.util.Scanner;

public class Main{
    static int a,b,c,d;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        a=in.nextInt();
        b=in.nextInt();
        c=in.nextInt();
        d=in.nextInt();
        if(d>b)
            System.out.print((c-a)+" "+(d-b));
        else
            System.out.print((c-1-a)+" "+(d+60-b));
        in.close();
    }
}

P1421 小玉买文具

这不就是几个破式子算一算就出来了嘛:

#include<iostream>
using namespace std;
int main()
{
	float a,b;
	int c;
	cin>>a>>b;
	a+=b/10;
	a=a/1.9;
	c=a; 
	cout<<c;
	return 0;
}

import java.util.Scanner;

public class Main{
    static float a,b;
    static int c;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        a=in.nextFloat();
        b=in.nextFloat();
        a+=b/10;
        a=(float) (a/1.9);
        c=(int) a;
        System.out.print(c);
        in.close();
    }
}

java中要注意,在程序里面自己打出来的浮点数都是双精度浮点数,这些数据是不能直接和单精度浮点数做除法的,所以要转类型。

P3954 成绩

把百分数换成小数直接乘不就得了。。。

#include<iostream>
using namespace  std;
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    cout<<a*0.2+b*0.3+c*0.5;
    return 0;
}

import java.util.Scanner;

public class Main{
    static int a,b,c;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        a=in.nextInt();
        b=in.nextInt();
        c=in.nextInt();
        System.out.print((int)(a*0.2+b*0.3+c*0.5));
        in.close();
    }
}

java啊,真是个神奇的东西,如果你直接将上面的c++程序翻译成java交上去绝对是WA(亲测有效),我上一题说了,java中直接出现的浮点数都是双精度浮点数,所以算完之后这个数据也是双精度浮点数,而java的浮点数小数点后一位为零的话,输出会自动补一个零,所以,如果不强制转类型的话,你的样例输出应该是:90.0和79.0

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值