130道基础OJ编程题之: 20~28

导读:本篇文章讲解 130道基础OJ编程题之: 20~28,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

130道基础OJ编程题之: 20~28


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题目

130道基础OJ编程题之: 1~7道_ChinaRainbowSea的博客-CSDN博客

130道基础OJ编程题之: 8~19 道_ChinaRainbowSea的博客-CSDN博客

21. BC25 计算体重指数

计算体重指数_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现:

补充:

注意在C语言中的printf 中的格式输出

int 类型格式输出 是 %d

long 类型格式输出是 %ld

long long 类型格式输出是%lld

float 类型的格式输出是 %f

double 类型的格式输出是 %lf

char 类型的格式输出是 %c

String 类型的格式输出是 %s

如果不遵守的话是,会报错的。

方式一:

思路: 最后的结果是浮点数的结果,所以我们这里通过 整数类型 / 浮点数类型 隐式转化为浮点数

#include<stdio.h>

int main()
{
    int wight = 0;
    int hight = 0;
    double bmi = 0.0;

    scanf("%d %d",&wight,&hight);
    
    bmi = wight / ((hight/100.0)*(hight/100.0));  // 注意最后的结果是浮点数
     // 我们需要通过 100.0 隐式转化为浮点数
    printf("%.2lf\n",bmi);  // 注意浮点数的格式输入是: 双lf, 单 f 

    return 0;
}

方式二:

思路: 通过调用C语言标准库中pow的函数,求一个数的平方值,注意其该函数的返回值是 double 双精度的浮点数类型,导入的头文件是 include<math.h>

在这里插入图片描述

#include<stdio.h>
#include<math.h>  // pow 的头文件

int main()
{
    int wight = 0;
    int hight = 0;
    double bim = 0.0;

    scanf("%d %d",&wight,&hight); 
    bim = wight /pow((hight/100.0),2.0); // 注意是浮点数类型,不然
    // int 类型会发生截断。

    printf("%.2lf\n",bim); // 注意浮点数的格式输出是 %lf ,双是 lf, 单是 f
    
    return 0;
}

Java实现:

方式一:

思路: 使用Java当中的System.out.printf 中的格式化输出,需要注意的是Java当中的格式符输出与C语言有所不同:具体如下:

  • 在Java 的 System.out.printf中 的格式输入
    • 对于整形只能使用 %d ,不可以使用 %ld,不然报错
    • 浮点数只能使用 %f .不可以使用 %lf。不然报错

这里我们直接使用 Java当中的 nextInt() ,读取到键盘当中的输入数据,因为在 nextInt()当中一个空格本身就表示的就是是另外的一个输入(空格本身就可以分割多个输入的内容)。所以根据题意我们,就可以直接使用它。

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        double bim = 0.0;
        
        int wight = scanner.nextInt();
        int hight = scanner.nextInt();

        bim = wight / ((hight/100.0)*(hight/100.0)); // 注意最后的结果是浮点数,
        // 这里我们使用隐式类型转化为浮点数类型

        System.out.printf("%.2f\n",bim);

    }
}

方式二:

思路: 通过将输入的内容改为是字符串,注意使用可以读取到空格的 nextLine() 的方法,next() 无法读取到空格,再使用 split的字符串的方法,将字符串的内容以 “ ”空格,分割开,返回值为字符串类型的数组。

再通过获取到分割好的数组中元素的数值,在通过对应的 Integer 包装类中的方法parseInt() 将字符串转化为十进制的数值。或者使用 Double 包装类中的方法parseDouble将字符串的内容转化为浮点数类型。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String strs ;

        strs = scanner.nextLine();  
        double bim = 0.0;
        /*
        next 不可以读取到空格,nextLine()可以读取到空格
        */
        String[] arrs = strs.split(" ");  // 将字符串 strs以空格的分割开,存入到数组中
        int wight = Integer.parseInt(arrs[0]);  // 将字符串转化为十进制的数值
        int hight = Integer.parseInt(arrs[1]); // Integer 是一个包装类的

        /*或者转化为double类型
        int hight = Double.parseDouble(arrs[1]);
        */

      //  bim = wight / ((hight/100.0)*(hight/100.0));
        // 也可以使用 Math类中的 pow 求几次方
        bim = wight / Math.pow((hight/100.0),2.0);

        System.out.printf("%.2f\n",bim);

    }
} 

22. BC26 计算三角形的周长和面积

计算三角形的周长和面积_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述

C语言实现:

方式一:

思路: 海伦公式,我们知道三角形的三条边以及周长,可以使用海伦公式 ,求出三角形的面积

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
#include<math.h> // sqrt 求平方的头文件

int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
    float circumference = 0.0;
    float area = 0.0;

    scanf("%d %d %d",&a,&b,&c);

    circumference = a+b+c;
    float p =circumference/2;  // 注意这里是浮点数类型

    area = sqrt(p*(p-a)*(p-b)*(p-c) );
    printf("circumference=%.2f area=%.2f",circumference,area);
    return 0;
}

方式二:

思路: 对于数值的输入,我们通过循环,多次实现多个值的输入,将数值保存道数组当中,最后将数值一一取出,进行运算,得到结果

#include<stdio.h>
#include<math.h>

int main()
{
    int arr[3] = {0,0,0};
    double circumference = 0.0;
    double area = 0.0;
    double p = 0.0;

    for(int i = 0; i <3; i++)
    {
        scanf("%d",&arr[i]);
        
        // 注意 不可以使用 arr[i] = scanf(”%d“,&arr[i]);表示的是赋值的是scanf的返回值
    }

    circumference = arr[0]+arr[1]+arr[2];
    p = circumference / 2;
    area = sqrt(p*(p-arr[0])*(p-arr[1])*(p-arr[2]));

    printf("circumference=%.2lf area=%.2lf\n",circumference,area);

  
    return 0;
}

Java实现:

方式一:

思路: 直接使用Java当中的 Scanner 类中的 nextInt 的方法,读取到数值,因为空格本身就是分割开一个数值结果的输入,所以这里可以直接通过(循环多次输入)将结果赋值到对应的元素中,注意其中的结果要的是浮点数类型的,这里使用上隐式类型的转化,获取到结果使用 海伦公式 求三角形的面积。

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[]{0,0,0};
        // int[] arr = {0,0,0};
        double p = 0.0;
        double circumference = 0.0;
        double area = 0.0;

        for(int i = 0; i<arr.length;i++){
            arr[i] = scanner.nextInt();
            
            circumference = circumference + arr[i];
        }

        p = circumference / 2.0;  // 注意是浮点数类型
        area = Math.sqrt(p*(p-arr[0])*(p-arr[1])*(p-arr[2])); // Math.sqrt求平方根
        System.out.printf("circumference=%.2f area=%.2f",circumference,area);

    }
}

方式二: 通过将内容全部变成字符串的形式输入,再通过 字符串方法 split 将字符串的内容根据 ” “空格,分隔开,存入到字符串数组当中,再通过对应的包装类Integer 中的方法,将字符串数组的字符串元素转化为十进制数值,最后进行一个计算得到,结果,注意:最后的结果是浮点数。

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        double p = 0.0;
        double circumference = 0.0;
        double area = 0.0;

        String str = scanner.nextLine(); // nextLine可以读取到空格,next不可以读取到空格
        String arrs[] = str.split(" "); // str.split 以" "空格分隔开,并赋值到字符串数组中
        int a = Integer.parseInt(arrs[0]); // Integer 包装类,将字符串的转化为十进制数值
        int b = Integer.parseInt(arrs[1]);
        int c = Integer.parseInt(arrs[2]); 

        circumference = a + b + c;
        p = circumference / 2.0;
        
        area = Math.sqrt(p*(p-a)*(p-b)*(p-c));
        System.out.printf("circumference=%.2f area=%.2f",circumference,area);
        
    }
}

23. BC27 计算球体的体积

计算球体的体积_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述

C语言实现:

方式一:

思路: 直接使用,我们乘以多个数值,完成注意在这里 float 精度无法通过测试用例的,所以我们使用double 精度类型

#include<stdio.h>

int main()
{
    double p = 3.1415926;
    double r = 0.0;  // 注意精度上的问题,float 是不可以的
    scanf("%lf",&r);

    double v = (4.0/3)*p*(r*r*r); //注意是浮点数 
    printf("%.3lf",v); 

    return 0;
}

方式二:

思路: 使用C语言的标准库中的,#include 头文件中 pow 求立方

#include<stdio.h>
#include<math.h>
int main()
{
    double p = 3.1415926;
    double r = 0.0;  // 注意精度上的问题,float 是不可以的
    scanf("%lf",&r);

    double v = (4.0/3)*p*pow(r,3.0);  // 使用math头文件的pow函数实现求立方
    printf("%.3lf",v); 

    return 0;
}

Java实现:

思路: 使用 Scanner 中的 scnaner.Double 立方使用 Math类中 pow 的方法,注意: 在本题目中只能使用 double 双精度的浮点数,float 单精度的浮点数的精度不够。

import java.util.*;

public class Main{
    public static void main(String[] args){
        double p = 3.1415926;
        Scanner scanner = new Scanner(System.in);
        double r = scanner.nextDouble();
        double v = 4/3.0*p*Math.pow(r,3.0);
        System.out.printf("%.3f",v); // 注意在Java当中的printf 的浮点数的格式输出是%f,没有%lf的
        

    }
}

24. BC10 成绩输入输出

成绩输入输出_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现:

方式一: 多个内容的输入,直接使用 scanf 就可以了,

思路:

#include<stdio.h>

int main()
{
    int scorel = 0;
    int score2 = 0;
    int score3 = 0;
    scanf("%d %d %d",&scorel,&score2,&score3);

    printf("score1=%d,score2=%d,score3=%d",scorel,score2,score3);
    return 0;
}

方式二:

思路: 多个值的输入,使用循环实现:将输入的内容赋值到数组当中去:

#include<stdio.h>

int main()
{
    int arr[] = {0,0,0};
    for(int i = 0; i < 3; i++)
    {
        scanf("%d",&arr[i]);

    }
    printf("score1=%d,score2=%d,score3=%d",arr[0],arr[1],arr[2]);
    return 0;
}

java实现:

方式一:

思路: 直接使用 Java当中的Scanner 类中的 nextInt()的方法,读取键盘中的内容,因为一个空格本身就可以作为每一个数值的间隙的输入,所以我们直接使用就好了。

 import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int[] arr = {0,0,0};

        for(int i = 0; i< arr.length;i++){
            arr[i] = scanner.nextInt();
        }

        System.out.printf("score1=%d,score2=%d,score3=%d",arr[0],arr[1],arr[2]);
    } 
}

方式二:

思路: 将输入的内容作为字符串的形式输入,再通过使用 字符串的内置方法的 sqlit 将字符串的内容,以 空格” “为依据,进行分隔开,并将分割的内容赋值到字符串数组当中,再通过对应的 Integer 包装类的方法Integer.parseInt(arrs[2]) 将字符串的内容转化为十进制的数值类型,再使用 Math类中的 pow方法,求数值的立方。通过公式得对应的结果:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();  // 可以读取到空格
        String[] str = s.split(" ");  // 将字符串以根据空格分隔开来,赋值到数组中去

        int score1 = Integer.parseInt(str[0]); // Integer包装类,parseInt将字符串转为,十进制的数值
        int score2 = Integer.parseInt(str[1]);
        int score3 = Integer.parseInt(str[2]);

        System.out.printf("score1=%d,score2=%d,score3=%d",score1,score2,score3);
    }
}

25. BC20 kiki算数

kiki算数_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述

C语言实现:

思路: 通过除以10再模10 判断十位上的数值,是否是 0 ,是,只保留个位,不是只要后两位值

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d",&a,&b);
    int sum = a + b;
    if((sum/10%10) == 0)
    {
        printf("%d",sum%10); // 只保留个位,
    }
    else
    {
        printf("%d",sum%100);
    }

    return 0;
}

Java实现:

方式一: 直接使用 Scanner 中的 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();
        int sum = a + b;

        if( 0 == (sum / 10 % 10)){
            System.out.println(""+sum%10); // 只保留个位
        } else {
            System.out.println(""+sum%100);
        } 
    }
}

方式二:

思路: 将输入的内容改为字符串,再通过 字符串内置的方法split 以空格,将字符串分隔开,返回赋值到 字符串数组中,再通过对应的 Integer 的包装类中的方法parseInt,将字符串数组中的字符串元素转化为十进制的数值。求结果

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner =  new Scanner(System.in);
        String s = scanner.nextLine(); // 可以读取到空格
        String[] str = s.split(" "); // 将字符串以空格分隔开来,返回赋值到字符串数组中
        int a = Integer.parseInt(str[0]); // Integer:int类型的包装类将字符串转化为十进制的数值
        int b = Integer.parseInt(str[1]); 

        int sum = a + b;

        if(0 == (sum / 10 % 10)){
            System.out.println(sum%10); // 只保留个位
        } else {
            System.out.println(sum%100);
        }
    }
}

26. BC24 浮点数的个位数字

浮点数的个位数字_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述

C语言实现:

思路: 首先从键盘中读取到浮点数类型,再将给数值的类型转换为 int 整型,把小数舍弃掉,最后通过取模 10,得到个位值

#include<stdio.h>

int main()
{
    float n = 0.0;
    scanf("%f",&n);
    int temp = n;
    printf("%d\n",temp%10);
    return 0;
}

Java实现:

思路:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        float n = scanner.nextFloat();

        int temp = (int)n; // 强制转换,将小数去了
        System.out.println(temp%10);
    }
}

27. BC32 你能活多少秒

你能活多少秒_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现:

方式一:

思路: 使用科学计数法,表示 3.156*10^7,3.156e7 e 表示 10 为底 7 次方

int main()
{
    int year = 0;
    long e = 3.156e7;
    scanf("%d",&year);
    
    printf("%ld",year*e);
    return 0;
}

方式二:

思路: 使用C语言标准库里面的函数#include<math> pow,计算表示次方:

#include <stdio.h>
#include <math.h>

int main()
{
    int year = 0;
    scanf("%d",&year);
    long temp = 3.156*pow(10.0,7.0); // pow 求什么底数,的几次方

    printf("%ld",year*temp);
    return 0;
}

java实现:

方式一:

思路: 同样使用科学计数法,表示 3.156*10^7 3.156e7,注意科学计数法,在Java当中表示的是浮点数类型

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        long temp = (long)3.156e7; // 强制转换为整型

        int year = scanner.nextInt();

        System.out.println(temp*year);
    }
}

方式二:

思路: 使用Java当中的Math类中的方法pow 表示什么数的几次方

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        double temp = 3.156*Math.pow(10.0,7.0);

        int year = scanner.nextInt();

        System.out.println(year*(long)temp); 
    }
}

28. BC92 变种水仙花

变种水仙花_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述


C语言实现:

思路: 通过取模 10 ,以及除以 10 ,10* 10 不断累加

在这里插入图片描述

#include<stdio.h>

int main()
{
    
    for(int i = 10000; i<= 99999;i++)
    {
        int sum = 0; // 重置防止再次叠加上
        for(int j = 10;j <= 10000; j *= 10)
        {
            sum = sum + (i/j)*(i%j);
        }
        
        if(i == sum)
        {
            printf("%d ",i);
        }
        
    }

    return 0;
}

Java实现:

思路:
在这里插入图片描述

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        for(int i = 10000;i <= 99999;i++){
            int sum = 0;
            for(int j = 10; j <= 10000;j *= 10){
                sum = sum + (i/j)*(i%j);
            }
            if( sum == i){
                System.out.print(sum+" ");
            }
        }
    }
}

总结:

解决bug技巧:

  1. 先从阅读代码,看是否可以发现错误。
  2. 再从代码的调试,找到问题所在,解决:
    1. 找到后,从阅读代码上,看是否可以解决,
    2. 不能,在查看相关的函数的使用的文档chm
    3. 还不能就查看源代码,
    4. 还不能就百度。
  3. float f = 0.0; 这是错误的,在Java当中不可以这样赋值。double d = 0.0; 可以
  4. 在Java当中的 System.out.printf("") 格式输出中,浮点数就只有 %f ,没有**%lf** ,整型就是 %d,没有**%ld** ,这样的
  5. 字符串格式分隔方法 split() 根据什么“ ” ,将字符串分隔开,返回给字符串类型的数组
  6. Integer.parseInt("") Integer 是 Int 的包装类,其中 parseInt方法是将字符串转换为十进制的数值,或者 Double.parseDouble(" ") Double 是 double 的包装类,其中的 parseDouble 方法是将字符串转换为 double 的浮点数值
  7. 注意 next() 读取不到空格,nextLine() 可以读取到空格
  8. 注意C语言中的 不要这样 int num = 0; num = scanf("%d",&num) 这是一个错误的方式,其中 num 一直会等于 1, num 赋的值是 scanf 的返回值,导致 num 就不是键盘中读取到的值。

最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83014.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!