130道基础OJ编程题之: 8~19 道
文章目录
OJ技巧
#include <stdio.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld")
printf("%d\n", a + b);
}
return 0;
}
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int a = in.nextInt();
int b = in.nextInt();
System.out.println(a + b);
}
}
}
0. 昔日的OJ题目:
8. 题目八:BC8 十六进制转十进制
十六进制转十进制_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
本题考查的就是%d的格式控制域宽指定。
补充:
通过 0x
十六进制的格式表示 ABCEF是十六进制的格式的。
我们在通过 printf
格式化输出,将其二进制的内容转化为 10 进制显示出来。
计算机存储的数据与你输入的是十进制还是十六进制无关,都是以同样值的二进制存储在计算机中的,
而我们通过你什么样的形式获取计算机中的二进制数是以十进制获取显示,还是十六进制
思路: 通过printf
的格式化输出,到达效果
int main()
{
printf("%15d", 0xABCDEF); // 通过0x 十六进制的格式输入 ABCDEF
return 0;
}
Java实现:
补充:
思路: 先以字符串的形式,保存该数据十六进制。再通过 Java当中的 Integer.parseInt(s,16)
将字符s的字母转为十六进制,最后通过Java中的 printf
的格式输出到达效果。
import java.util.*;
public class Main{
public static void main(String[] args){
String s = "ABCDEF";
System.out.printf("%15d",Integer.parseInt(s,16));
// paseInt 将字符串转 xx进制返回 int 类型
}
}
9.题目九:BC9 printf的返回值
printf的返回值_牛客题霸_牛客网 (nowcoder.com)
补充:
注意 prinyf
返回值是显示在屏幕上的字符个数,其中 ‘\n’ 也算是一个字符。
思路: 通过分析 printf
的返回值,知道printf 返回值是显示再屏幕上的字符个数,同时注意 ‘\n’ 也是算一个字符
// 方式一:
int main()
{
int num = printf("Hello world!");
printf("\n%d", num);
// `prinyf` 返回值是显示在屏幕上的字符个数,其中 '\n' 也算是一个字符。
return 0;
}
// 方式二:
int main()
{
printf("\n%d", printf("Hello world!"));
// `prinyf` 返回值是显示在屏幕上的字符个数,其中 '\n' 也算是一个字符。
return 0;
}
9.1题目扩展:
请看如下代码:打印显示的内容是:
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
解析:
从右边开始,因为左边的
printf
需要被执行结束的话·,需要先将左边中的printf
执行结束才行。从左边开始的第一个
printf
打印的是数值 43,没有换行从左边开始的第二个
printf
打印的是第一个printf
在屏幕上显示的字符个数 是 “43” 这个数值,共有 2 个字符,所以是 2;没有换行从左边开始的第三个
printf
打印的是第二个printf
中在屏幕上显示的字符个数是 “2” 这个数值,共有 1 个字符,所以是 1, 没有换行。结合上述所有的打印结果拼接起来,因为没有换行,所以结果是
4321
Java实现:
补充 :
从上述C语言实现我们分析到了,printf
其实就是打印显示在屏幕上的字符个数,而这也就是这个字符串的个数。
所以我们在Java中直接求 字符串“Hello World!” 的字符串个数就可以了。使用 我们的方法 length
思路: 从C语言分析 printf
的返回值就是打印显示在屏幕上的字符个数,我们可以通过Java中的length
直接求出字符串的个数。
import java.util.*;
public class Main{
public static void main(String[] args){
String str = "Hello world!";
System.out.println(str);
System.out.println(str.length());
}
}
10. 题目十:BC11 学生基本信息输入输出
学生基本信息输入输出_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
补充:
注意在C语言中 scanf()
的括号中是什么格式,你输入是就必须是什么格式,不然是会输入失败的,例如:
scanf(“%d;%d”) 你输入的时候,就必须输入两个值中间加上 “’;”分号,才行2;6
注意: 在C语言中的格式输出 printf 以及 scanf 格式输入中,float 是 %f
double 是 %lf
是 l 字母,不是数字
思路: 通过scanf
格式化输入,以及 printf
格式化输出到达效果
#include<stdio.h>
int main()
{
int num = 0;
float f1 = 0;
float f2 = 0;
float f3 = 0;
scanf("%d;%f,%f,%f",&num,&f1,&f2,&f3);
printf("The each subject score of No. %d is %.2f, %.2f, %.2f.",num,f1,f2,f3);
return 0;
}
java实现:
思路: 将学号字符串通过函数分割成一个一个的对应的数值,分割好后,使用 Java中的printf
格式输出。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine(); // 将输入转为了字符串.
// 获取学号
String student_id = s.substring(0, s.indexOf(";"));
// 利用分割函数获取分数
// 使用format函数实现保留两位小数并实现四舍五入
String[] scores = s.substring( s.indexOf(";") + 1).split(",");
for (int i = 0; i < scores.length; i++) {
float fl = Float.parseFloat(scores[i]);
// 不可以直接对String操作,所以这里转一下float
scores[i] = String.format("%.2f", fl);
}
// 数据修改好,之后重新转成字符串并输出
String result = String.join(", ", scores);
System.out.println("The each subject score of No. " + student_id + " is " +
result + ".");
}
}
11. 题目十一:BC35 判断字母
C语言实现:
思路: 通过if 语句比较判断是否是字母。if( (c >= ‘a’ && c <= ‘z’) || (c >= ‘A’ && c <= ‘Z’))
方式一:
int main()
{
int c = 0;
while((c = getchar() )!= EOF)
{
getchar();
if( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
printf("YES");
}
else
{
printf("NO");
}
}
return 0;
}
方式二:
使用库函数isalpha
来判断是否为字母
如下信息的网站链接: isalpha – C++ Reference (cplusplus.com)
#include<stdio.h>
#include<ctype.h> // isalpha 导入的头文件
int main()
{
int c = 0; // getchar 的返回值是 int 类型
while((c= getchar())!=EOF)
{
getchar();
if(isalpha(c)) // isalpha() 判断是否是字母
{
printf("YES");
}
else
{
printf("NO");
}
}
return 0;
}
Java语言实现:
思路: 通过读取的是字符串,再通过获取该字符串的第一个字符,转化为字符类型,再判断是否是字母。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) { // 多组数据的输入
String ch = scanner.next();
char c = ch.charAt(0); // 截取字符串的一个字符转为 字符类型
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}
12. 题目十二: BC12 字符圣诞树
C语言实现:
思路: 通过分解处理问题,1. 先将圣诞树的层数使用循环表示;2.将空格使用循环解决,3. 最后的字符显示使用循环解决。
#include<stdio.h>
/*
1
1 1
1 1 1
1 1 1 1
1 1 1 1 1
*/
int main()
{
char c = getchar();
// 循环5层
for(int i = 0; i <= 4;i++)
{
// 循环空格
for(int j = 4-i; j>0;j--)
{
printf(" ");
}
// 循环打印字符
for(int z = 0; z <= i;z++)
{
printf("%c ",c);
}
printf("\n");
}
return 0;
}
Java实现:
思路: 通过分解处理问题,1. 先将圣诞树的层数使用循环表示;2.将空格使用循环解决,3. 最后的字符显示使用循环解决。
import java.util.*;
public class Main {
/*
1
1 1
1 1 1
1 1 1 1
1 1 1 1 1
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next(); // 获取字符串
char ch = str.charAt(
0); // 字符串的第一个字符转化为字符存储起来
// 处理圣诞树的层数
for (int i = 0; i <= 4; i++) {
// 处理空格
for(int j = 4-i; j > 0; j--){
System.out.print(" ");
}
// 处理字符
for(int z = 0; z<=i;z++){
System.out.print(ch+" ");
}
System.out.println(""); // 换行
}
}
}
13. 题目十三:BC13 ASCII码
ASCII码_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
方式一: 直接使用 printf
格式转化
#include<stdio.h>
int main()
{
printf("%c%c%c%c%c%c%c%c%c%c%c%c",73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33);
return 0;
}
方式二: 使用数组存储其所有的数值,再通过循环一一取出,并以字符的形式显示
#include<stdio.h>
int main()
{
// 数组存放其数值
int arr[] = {73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33};
for(int i = 0; i<12;i++)
{
printf("%c",arr[i]);
}
return 0;
}
Java实现:
思路: 通过数组存放所有的数值,然后使用循环遍历,再通过 将数值类型的强制转化为字符类型。达到效果。
import java.util.*;
public class Main{
public static void main(String[] args){
int[] arr = new int[]{73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33};
for(int i = 0; i<arr.length;i++){
System.out.print(""+(char)arr[i]); // 数值强制转化为字符类型
}
}
}
14. 题目十四: BC14 出生日期输入输出
出生日期输入输出_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
思路: 通过定义多个变量,存储多个数值,再通过 %0 格式输出,注意这个十0 ,表示左边不足使用0 补充
通过scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数),按此宽度截取所需数据;通过printf函数的%0格式控制符,输出数值时指定左面不使用的空位置自动填0。
#include<stdio.h>
int main()
{
int year = 0;
int month = 0;
int date = 0;
scanf("%4d%2d%2d",&year,&month,&date);
printf("year=%d\n",year);
printf("month=%02d\n",month);
printf("date=%02d\n",date);
return 0;
}
Java实现:
思路: 通过使用String中的substring方法,获取对应需要的字符值
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
// substring(x,y) 获取该字符串从0下标开始到4的字符值(不包括4)
System.out.println("year="+str.substring(0,4));
System.out.println("month="+str.substring(4,6));
System.out.println("date="+str.substring(6,8));
}
}
15 . 题目十五: BC29 2的n次方计算
2的n次方计算_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
思路: 使用 <<
左移操作符,左移一位就是乘 * 2 ,>>
右移操作符,右移一位就是除以 / 2
#include <stdio.h>
int main()
{
int num = 1;
int n = 0;
scanf("%d",&n);
printf("%d\n",num << n); // 注意num 的值并不会发生改变
return 0;
}
Java实现:
思路: 使用 <<
左移操作符,左移一位就是乘 * 2 ,>>
右移操作符,右移一位就是除以 / 2
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in); // 实例化对象
int num = 1;
int n = scanner.nextInt();
System.out.println(num << n);
}
}
16. 题目十六: BC15 按照格式输入并交换输出
按照格式输入并交换输出_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
思路: 通过三次的 ^
异或运算交换两个数值
int main()
{
int a = 0;
int b = 0;
scanf("a=%d,b=%d",&a,&b);
// 交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d,b=%d",a,b);
return 0;
}
Java实现:
思路: 1.将输入的内容全部以字符串的形式,存储起来,2.再通过标记分割开来,存入到数组中去,3.通过 substring
方法,获取到指定的数值,存入到变量中,4. 通过 ^ 实现变量的交换。5.最后再通过substring
获取到指定的内容,显示出来。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
String[] strs = str.split(","); //字符串以 ,分隔开
// 取出 strs 数组中第一元素中的第二个字符,从 0 开始
int a = Integer.parseInt(strs[0].substring(2));
int b = Integer.parseInt(strs[1].substring(2));
a = a^b;
b = a^b;
a = a^b;
System.out.println(strs[0].substring(0,1)+"="+a+","+strs[1].substring(0,1)+"="+b);
// strs[0].substring(0,1) 获取数组中字符串从0开始到1(不包含1)的数值
}
}
17. 题目十七: BC16 字符转 ASCII
字符转ASCII码_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
思路: 通过输入字符”scanf 字符输入格式是 %c”,再通过printf 格式输出;
#include<stdio.h>
int main()
{
printf("%d",getchar());
return 0;
}
或者
#include<stdio.h>
int main()
{
char c = 0;
scanf("%c",&c);
printf("%d",c);
return 0;
}
Java实现:
思路: 1.将输入的内容转化为字符串,因为Java中没有获取一个字符的方法,有获取字符串的方法,我们通过将字符 串截断获取对应的字符内容就可以了,获取到后还是字符串,我们将字符串转化为字符,再将字符转化为数值显示出来。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in); // 实例化对象
String str = scanner.next(); // 输入字符串
char ch = str.charAt(0); // 提取输入str中的第一字符,从0下标开始到0;
System.out.println((int)ch); // 字符强制转化为 int类型
}
}
18.题目十八:BC18 计算带余除法
计算带余除法_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
思路: 将除以就是 \
,求余数就是: %
取模
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
printf("%d %d",a/b,a%b);
return 0;
}
Java实现:
思路: 反正是以空格为分隔输入数值的,所以我们直接使用两个 nextInt()
就可以了。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt(); // 反正是以空格为分隔输入数值
System.out.println(a/b+" "+a%b);
}
}
19. 题目十九:BC17 计算表达式的值
计算表达式的值_牛客题霸_牛客网 (nowcoder.com)
C语言实现:
思路: 直接复制公式就可以了,注意C语言中的乘是 *
, 除法是 /
#include<stdio.h>
int main()
{
int a = 40;
int c = 212;
printf("%d\n",(-8+22) * a - 10 + c / 2);
return 0;
}
Java实现:
思路: 直接复制公式就可以了,注意C语言中的乘是 *
, 除法是 /
import java.util.*;
public class Main{
public static void main(String[] args){
int a = 40;
int c = 212;
System.out.println((-8+22)*a-10+c/2);
}
}
最后:
限于自身水平,其中存在的错误,希望大家,给予指教韩信点兵——多多益善,谢谢大家,江湖再见,后会有期 !!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83018.html