从今天开始在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都是不错的选择,但是scanf和printf需要记背类型取址符(格式符),这里有个表,是从《CCF中学生计算机程序设计入门篇》中扣下来的:
格式字符 | 意义 |
d | 以十进制形式输出带符号整数(正整数不输出符号) |
o | 以八进制形式输出无符号整数(不输出前缀0) |
x,X | 以十六进制形式输出无符号整数(不输出前缀Ox) |
u | 以十进制形式输出无符号整数 |
f,lf | 以小数形式输出单、双精度实数 |
e,E | 以指数形式输出单、双精度实数 |
g,G | 以%f或者%e中较短的输出宽度输出单、双精度实数 |
c | 输出单个字符 |
s | 输出字符串 |
格式符 | 说明 |
d,i | 勇于输入十进制整数 |
u | 以无符号十进制形式输入十进制整数 |
o | 用于输入八进制整数 |
x | 用于输入十六进制整数 |
c | 用于输入单个字符 |
s | 用于输入字符串(非空格开始,空格结束,字符串变量以“\0”结尾) |
f | 用于输入实数(小数或者指数均可) |
e | 与f相同(可与f互换) |
l | l用于double型实数(%lf,%le) |
域宽(一个整数) | 制定输入所占列宽 |
* | 表示对应输入量不赋给一个变量 |
o_O | 安切洛蒂 |
由于printf和scanf的输入要被的东西太多,虽然很多字符都是变量类型的缩写,比如f表示float,c表示char,s表示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