java学习笔记<二>——OJ习题练习(8-14)

为了阅读方便,对oj习题进行分割。

2020.8.25

习题8:素数和(第n个素数和第m个素数之间的素数之和)

Description:我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
注意,是第n个素数到第m个素数之间的所有的素数,并不是n和m之间的所有的素数。
Input:两个整数,第一个表示n,第二个表示m。
Output:一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
Sample Input 1 :2 4
Sample Output 1:15

代码1:

package fhla;


import java.util.Scanner;   
public class Prime {  	
	public static void main(String[] args) 
	{
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		int num=0;//第num个素数
		int digit=1;//观察该数据是否为素数
		int sum=0;
		
		while(num<m) {
			digit++;
			int a=1;
			for(int i=2;i<=Math.sqrt(digit);i++) {
				if(digit%i==0) {
					a=0;
					break;
				}
			}
			if(a==1) {
				num++;
				if(num>=n && num<=m) {
					sum=sum+digit;
				}
			}
			
		}
		System.out.println(sum);
	}
}

在这里插入图片描述

代码2:
这个代码感觉和第一个差不多,不过我改了好一会,总有地方不太对


import java.util.Scanner;   
public class Prime {  	
	public static void main(String[] args) 
	{
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		int num=0;//第num个素数
		int digit=2;//观察该数据是否为素数
		int sum=0;
		while(num<m) {
			int a=1;			
			for(int i=2;i<=Math.sqrt(digit);i++) {
				if(digit%i==0) {
					a=0;
					break;
				}
			}
			if(a==1) {
				num++;
				if(num>=n && num<=m) {
					sum=sum+digit;
				}	
			}
			
			digit++;
		}
		System.out.println(sum);
	}
}


在这里插入图片描述

代码3:
这个代码不是我写的,逻辑可以理解一下。

import java.util.Scanner;


public class Prime {
    public static void main(String[] args){
        int num = 0;//素数个数
        int star = 2;//数
        int output = 0;//输出
        int a = 0;//是否为素数
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//2
        int m = sc.nextInt();//4
        while (num < m) {//0 4;1 4
            if(star == 2){//初始star为2,即这里给出第一个素数,num=1
                num++;//1
                if(num >= n){
                    output = output + star;
                }
            }else {
                for (int i = 2; i < star; i++) {//针对不同的数star,如果该数可以被其他数整除,则不为素数,否则,即为素数
                    if (star % i != 0) {
                        a = 1;   //为素数
                    } else {
                        a = 0;   //不为素数
                        break;
                    }
                }
            }
            if(a==1){//素数的情况下
                num++; //2
                if(num >= n){
                    output = output + star;
                }
            }
            a=0;
            star+=1;//当素数个数不够
        }
        System.out.println(output);
    }
}

补充习题:判断101-200之间有多少个素数(质数),并输出所有素数。

判断素数的方法: 用一个数分别去除2到sqrt(这个数的平方根),如果能被整除, 则表明此数不是素数,反之是素数。

public class prime_1 {
	public static void main(String[] args) {
		int count1 = 0, count2 = 0;
	    for (int i = 101; i <= 200; i++) {
	        // 每一个数一个个接受检验是否为素数
	        for (int j = 2; j <= Math.sqrt(i); j++) {
	             if (i % j != 0) {
	                  //不能被整除累计一次
	                  count1++;
	             }
	        }
	        // 转为int的类型
	        int num = (int) Math.sqrt(i);
	        //如果累计次数num - 1个数相等则为素数
	        if (count1 == (num - 1)) {
	             System.out.println("素数:" + i);
	             count2++;
	        }
	        // 统计素数个数
	        count1 = 0;
	    }
	    System.out.println(count2);
	

	}
}

在这里插入图片描述

补充习题:判断101-200之间有多少个素数(质数)
如果只需要输出多少素数,不需要具体的素数,下面的代码也可以
//求两个数a,b之间的素数的个数
public class prime_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int count1 = 0, a=101,b=200;
	    for (int i = a; i <= b; i++) {
	        // 每一个数一个个接受检验是否为素数
	        for (int j = 2; j <= Math.sqrt(i); j++) {
	             if (i % j == 0) {
	                  count1++;
	                  break;
	             }
	        }

	    }
	    System.out.println(b-a+1-count1);

	}
}

在这里插入图片描述

习题9:求和

Description:计算 1 + 2 + 3 + … + n
Input:输入将包含一系列整数n,每行一个整数。
Output:对于每种情况,在一行中输出答案, 结果将在32位整数的范围内。
Sample Input 1 :
1
100
Sample Output 1:
1
5050

import java.util.Scanner;
public class sum {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()) {
			long s = 0;
	           int a = sc.nextInt();
	           for(int i = 0 ; i <= a ; i++){
	               s= s+i;
	           }
	           System.out.println(s);
		}

	}

}

在这里插入图片描述

注:这题我用n*(n+1)/2没成功,我用int不成功,要用long,成功代码可以理解,但不知道我的代码那里出了问题

import java.util.Scanner;
public class sum {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()) {
	           int n = sc.nextInt();
	           long out=(long)(n*(n+1))/2;
	           System.out.println(out);
		}
		


	}

}

在这里插入图片描述

在这里插入图片描述

习题10:
习题11:素数判断

Description:对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
Input:输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
Output:对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。
Sample Input 1 :
0 1
0 0
Sample Output 1:OK

代码:


import java.util.Scanner;

public class primejudge1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc =new Scanner(System.in);
		while(sc.hasNext()) {
			int x = sc.nextInt();
			int y=sc.nextInt();
			boolean aaa=true;
			if(x==0 && y==0) 
				break;
			for(int i=x;i<=y;i++) {
				//int out=i*i+i+41;
				double out = Math.pow(i,2) + i + 41;
				if(out==2) {//out=2是素数
					break;
				}else {
					for (int j = 2; j <= Math.sqrt(out); j++) {
						//out!=2 判断out是否为素数,若不是,则为false,停止
				        if (out % j == 0) {
				        	aaa=false;
				            break;
				        }
				   }
				}
				if(!aaa) {//若out不是素数,输出false,停止
					break;
				}
				
			}
			if(aaa) {
				  System.out.println("OK");
			  }else {
				  System.out.println("Sorry");
			  }		
		}

	}

}

在这里插入图片描述
代码理解:
pow() 方法 用于返回第一个参数的第二个参数次方。

语法:`double pow(double base, double exponent)
注意:这是double类型。

参数
base -- 任何原生数据类型。
exponent -- 任何原生数据类型。
返回值
返回第一个参数的第二个参数次方。
习题12:
习题13:
习题14:交换最小值和最大值)

Description:输入一个正整数n,再输入n个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。
Input:有多个测试用例。 每个案例包含一个正整数n,接着n个正整数。 n = 0时测试用例输入结束。 该测试用例不做处理。
Output:将每个测试用例输入的n个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。

Sample Input 1 :
5 4 3 5 1 2
4 1 5 6 7
5 5 4 3 2 1
0
Sample Output 1:
1 3 2 4 5
1 5 6 7
1 4 3 2 5


import java.util.Scanner;
public class maxmin {
    public static void main(String args[]) {
    	Scanner sc=new Scanner(System.in);
    	int min=0;
    	int max=0;
    	while(sc.hasNext()) {
    		int m=sc.nextInt();
    		int[] a=new int[m];
    		for(int i=0;i<m;i++) {
        		a[i]=sc.nextInt();
        	}
    		if(m==0) {
    			break;
    		}else {
    			for(int i=0;i<m;i++) {
            		if(a[i]<a[min]) {
            			min=i;
            		}
            	}
    			int tmp1=a[0];
            	a[0]=a[min];
            	a[min]=tmp1;
    			for(int i=0;i<m;i++) {
    				if(a[i]>a[max]) {
            			max=i;
            		}
    				
            	}
    			int tmp2=a[m-1];
	        	a[m-1]=a[max];
	        	a[max]=tmp2;
    			
    		}
        	
        	for(int i=0;i<m;i++) {
        		System.out.print(a[i]+" ");
        	}
        	System.out.println();
        	
    	}

    }
}

在这里插入图片描述

补充一下我学习的代码吧,看懂之后自己写的代码在上面。


import java.util.Scanner;

public class sc_next {
    public static void main(String args[]) {
        int []a= new int[100];
        int min=0;
        int max=0;
        Scanner in = new Scanner(System.in);
        while (in.hasNext()){
            int num = in.nextInt();
            for(int i=0;i<num;i++){
                a[i]=in.nextInt();
            }
            if(num==0)break;
            else {
                for (int k = 0; k < num; k++) {
                    if (a[k] < a[min]) min = k;
                }
                int change = a[0];
                a[0] = a[min];
                a[min] = change;

                for (int k = 0; k < num; k++) {
                    if (a[k] > a[max]) max = k;
                }
                int change1 = a[num-1];
                a[num-1] = a[max];
                a[max] = change1;
            }
            

            for(int k=0;k<num;k++){
                System.out.print(a[k]+" ");
            }
            System.out.print("\n");
        }

    }
}

代码理解
int a[ ]=new int[5]
//创建一个数组,数组名是a ,大小为5 ,数组里存放的数据类型是int型。
//new 是JAVA 中创建实例的关键字,要是不好理解就理解成创建一个新的东西.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值