为了阅读方便,对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 中创建实例的关键字,要是不好理解就理解成创建一个新的东西.