学习目标:
首先带着大家把牛客java基础语法篇的题目过一遍。
今日学习内容:
笔记:
1、数列求和
有数列为:9,99,999,…,9999999999。要求使用程序计算此数列的和,并在控制台输出结果。(请尝试使用循环的方式生成这个数列并同时在循环中求和)。
分析: 既然题目说直接在循环中求和,那我们就没必要定义一个数组放这些数了。观察该数列的数字规律,我们可以发现都和9有关,那我们就先定义一个long型的变量来赋值一个9,然后每次进行乘10在加9,乘几个十就与循环体中的i有关了。
扩展:也可以尝试使用parseLong(String x)方法,该方法目的在于将String参数解析为有符号的long。简单来讲该方法是一个将字符转换为数字的方法。 以本题为例:sum = Long.parseLong(a);意思就是将字符串"9"以十进制的方式转换为数字。代码如下:
public class Main {
public static void main(String[] args) {
long sum = 0;
long base = 9;
for(int i = 0;i < 10;i++){
sum += base;
base = base * 10 + 9;
}
System.out.println(sum);
}
}
2、统计输入正数个数
控制台输入整数,请设计一个死循环,当用户输入非正数时停止输入。请给出用户输入的正整数个数(默认输入个数不超过2147483647)
代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
int count = 0;
Scanner scanner = new Scanner(System.in);
while(true){
if(scanner.nextInt() <= 0){
System.out.print(count);
break;
}
else{
count++;
}
}
}
}
3、求最小公倍数
编写一个方法,该方法的返回值是两个不大于100的正整数的最小公倍数 示例1 输入:3 7 输出:21
分析:如何找到两数的最小公倍数?我们可以想到这两个数肯定是能被最小公倍数整除的,即以这两个数较大的数为基数,设计一个循环,每次进行判断这个基数能否整除那个较小的数,不能则基数再加上较大的数,能则返回。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
int m = console.nextInt();
int n = console.nextInt();
int result = getCM(m, n);
System.out.println(result);
}
public static int getCM(int m, int n){
int max = (m > n ? m : n);
int min = (m < n ? m : n);
for(int i = max;i <= m * n;i += max){
if(i % min == 0){
return i;
}
}
return 0;
}
}
4、小球走过路程计算
一球从h米高度自由落下,每次落地后反弹回原高度的一半再落下,求它在第n次落地时共经过了多少米?第n次反弹多高?(先输出反弹的高度再输出经过的距离,中间用空格隔开) 备注: 结果保留三位小数,保留方式已经写在预设方法备注中
分析: 定义一个变量sum,用于记录第n次反弹后经过的总距离。 使用循环模拟落地反弹的过程,每次反弹,高度减半,每次经过的距离为反弹后距离的2倍,总距离只需将累加的数再减去初始的高度,因为对于初始高度我们也乘了2。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
float h=scanner.nextFloat();
int n =scanner.nextInt();
float high = h;
float sum = 0;
for(int i = 0;i < n;i++){
sum += 2 * h;
h /= 2;
}
System.out.println(String.format("%.3f",h) + " " + String.format("%.3f",sum - high));
}
}
5、求平均数
键盘输入任意多个10000以内正整数(负数代表结束),求出它们的平均数。(平均数为double类型,保留两位小数)
分析: 定义一个计数变量i和一个累加和变量sum,分别用于记录整数个数,以及它们的累加和。 使用一个循环进行模拟输入,如果是负数,则终止循环。每轮循环,计数加一,并且累加和加上对应数字,最后将累加和与计数的商作为平均数输出。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double average = 0,sum = 0;
int i = 0;
while(true){
int num = scan.nextInt();
if(num < 0){
break;
}
sum += num;
i++;
}
average = sum / i;
System.out.print(String.format("%.2f",average));
}
}
5、判断质数
请补全预设代码中判断质数的方法。 import java.util.Scanner; public class Main { public static void main(String[] args) { Main main = new Main(); Scanner scan = new Scanner(System.in); int number = scan.nextInt(); System.out.println(main.isPrimeNumber(number)); } public Boolean isPrimeNumber(int number) { //write your code here… } } 输入:2 输出:true
分析: 定义一个boolean型变量,判断是否是质数。 使用一个循环进行判断,如果number能被2到number的任意一个数整除(这个数的平方根要小于number),说明不是质数。自己思考为什么是平方根。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main main = new Main();
Scanner scan = new Scanner(System.in);
int number = scan.nextInt();
System.out.println(main.isPrimeNumber(number));
}
public Boolean isPrimeNumber(int number) {
for(int i = 2;i * i < number;i++){
if(number % i == 0){
return false;
}
}
return true;
}
}
6、计算整数位数
输入一个整数,计算它的位数。如果输入的整数不大于0则输出这个数 示例1 输入:9999 输出:4 示例2 输入:0 输出:0 示例3 输入:-1 输出:-1
分析: 定义一个位数变量cnt,记录对应位数变化,初始值记为1. 使用一个for循环,只要num/10大于0,则位数加一,否则输出cnt。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
scan.close();
int cnt = 1;
if(num <= 0){
System.out.print(num);
}
for(int i = 0; ;i++){
if((num /= 10) > 0)
cnt++;
else{
System.out.print(cnt);
break;
}
}
}
}
|