湘潭大学Java练习题

Java练习题

第22题 编写程序:斐波那契图形
编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的斐波那契数列。
输入:
一个整型数n
输出:
题目可能有多组不同的测试数据,对于每组输入数据,
按题目的要求输出相应的斐波那契图形。
注意输出换行前不能有多余的空格。
样例输入:

6

样例输出:

0
0 1 1
0 1 1 2 3
0 1 1 2 3 5 8
0 1 1 2 3 5 8 13 21
0 1 1 2 3 5 8 13 21 34 55

import java.util.Scanner;
public class Main {
//递归方法求斐波那契数列
	public static int fun(int n)
	{
	  if(n==1) 
		  return 0;
	  if(n==2)
		  return 1;
	  else
		  return fun(n-2)+fun(n-1);
	}
	public static void main(String[] args) {
		  Scanner s=new Scanner(System.in);
		  while(s.hasNext()) {
			  int n=s.nextInt();
			  for(int i=1;i<=n;i++){
				  for(int j=1;j<=2*i-1;j++){
					  if(j!=2*i-1)
						  System.out.print(fun(j)+" ");
					  if(j==2*i-1)
						  System.out.println(fun(j));
				  }
			  }
		  }
	}
}

第23题 编程:求奇数的倒数之和值
Time Limit : 1.0 s Memory Limit : 32 MB

问题描述:
编写程序求1/1+1/3+…+1/(2n+1)的和值,其中整数n从键盘输入(0=<n<1000)。

输入格式
整数n
输出格式
1/1+1/3+…+1/(2n+1)的和值

样例输入
1
2
样例输出
Sum is 1.3333333333333333
Sum is 1.5333333333333332

此题的上机步骤是:

  1. 建立一个Java项目,名称可以按题号取名;
  2. 建立一个类, 类的名称为Main。这一点非常重要;
  3. 输入代码并运行;
  4. 提交代码,注意题号要一致。
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		  Scanner s=new Scanner(System.in);
		  while(s.hasNext()) {
			  int n=s.nextInt();
			  double sum=0;
			  for(int i=1;i<=2*n+1;i=i+2){
				  sum+=1.0/i;
			  }
			  System.out.println("Sum is "+sum);
		  }
		   s.close();
	}
}

第29题 编写程序输出对称平方数
题目描述:
打印所有不超过n(0<=n<256)的,其平方具有对称性质的数。
如11*11=121
输入:
无任何输入数据
输出:
输出具有题目要求的性质的数。如果输出数据不止一个,各个数据之间以回车隔开。

public class Main {
//判定是否为回文数
  public static boolean isPalindrome(int n) {
	  int temp=0;
	  int m=n;
	  while(m!=0) {
		  temp=temp*10+m%10;
		  m/=10;
	  }
	  if(temp==n)
		  return true;
	  else
		  return false;
  }
  public static void main(String[] args) {
    for(int i=0;i<256;i++) {
    	int num=i*i;
    	if(isPalindrome(num)==true) {
    		System.out.println(i);
    	}
    }
  }
}

第30题 编写程序:递推数列
题目描述:
给定a0,a1,以及an=pa(n-1) + qa(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。
输入:
输入包括5个整数:a0、a1、p、q、k。
输出:
第k个数a(k)对10000的模。
样例输入:
20 1 1 14 5
样例输出:
8359

import java.util.Scanner;
public class Main {
public static long getAn(int a0,int a1,int p,int q,int k) {
	  if(k==0)
		  return a0;
	  if(k==1)
		  return a1;
	  else
		  return p*getAn(a0,a1,p,q,k-1)+q*getAn(a0,a1,p,q,k-2);
}
public static void main(String[] args) {
	  Scanner s=new Scanner(System.in);
		  int[] n=new int[5];
		  for(int i=0;i<5;i++) {
			  n[i]=s.nextInt();
		  }
		  long an=getAn(n[0],n[1],n[2],n[3],n[4]);
		  long result=an%10000;
		  System.out.println(result);   
	  s.close();
}
}

第31题 编写程序求各位数字之和
题目描述:
对于给定的正整数 n,计算其十进制形式下所有位置数字之和,并计算其平方的各位数字之和。
输入:
每行输入数据包括一个正整数n(0<n<40000),如果n=0 表示输入结束,并不用计算。
输出:
对于每个输入数据,计算其各位数字之和,以及其平方值的数字之和,输出在一行中,之间用一个空格分隔,但行末不要有空格。
样例输入:
4
12
97
39999
0
样例输出:
4 7
3 9
16 22
39 36

import java.util.Scanner;
public class Main {
//计算数字各个位数之和
  public static int getSum(int n) {
	  int temp=0;
	  while(n!=0) {
		  temp+=n%10;
		  n/=10;
	  }
	  return temp;
  }
  public static void main(String[] args) {
	  Scanner s=new Scanner(System.in);
		 while(s.hasNext()) {
			 int n=s.nextInt();
			 if(n==0)
				 break;
			 System.out.println(getSum(n)+" "+getSum(n*n));
		 }
	  s.close();
  }
}

第32题 与7无关的数平方和
时间限制:1 秒 内存限制:32 兆
题目描述:
一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7,
则称其为与7相关的数.现求所有小于等于n(n<100)的与7无关的正整数的平方和。
输入:
案例可能有多组。对于每个测试案例输入为一行,正整数n,(n<100)
输出:
对于每个测试案例输出一行,输出小于等于n的与7无关的正整数的平方和。
样例输入:
21
样例输出:
2336

import java.util.Scanner;
public class Main {
  public static boolean isWithSeven(int n) {
	  int temp=0;
	  if(n%7==0)
		  return true;
	  else {
		  while(n!=0) {
			  temp=n%10;
			  n/=10;
			  if(temp==7)
				  return true;
		  }
	  }
	  return false; 
  }
  public static void main(String[] args) {
	  Scanner s=new Scanner(System.in);
		 while(s.hasNext()) {
			 int n=s.nextInt();
			 int Sum=0;
			for(int i=0;i<=n;i++) {
				if(isWithSeven(i)==false) {
					Sum+=i*i;
				}
			}
			 System.out.println(Sum);
		 }
	  s.close();
  }
}

第33题 编程题:最大公约数
时间限制:1 秒内存限制:32 兆
题目描述:
输入两个正整数,求其最大公约数。
输入:
测试数据有多组,每组输入两个正整数。
输出:
对于每组输入,请输出其最大公约数。
样例输入:
49 14
样例输出:
7

import java.util.Scanner;
public class Main {
  public static int gcd(int a,int b)
  {
	    if(b==0)
	       return a;
	    else
	       return gcd(b,a%b);
	}
  public static void main(String[] args) {
	  Scanner s=new Scanner(System.in);
		 while(s.hasNext()) {
			 int n=s.nextInt();
			 int m=s.nextInt();
			int num=gcd(n,m);
			 System.out.println(num);
		 }
	  s.close();
  }
}

第35题 编程题:输出字符串中的大写字母
输入n个字符串,输出字符串中的大写字母。

将有多组数据,组数预先未知。

输入格式
每组数据第一行为整数n,表示字符串的个数。
每组数据第二行开始有n个字符串,每个字符串的长度都小于10000。
输出格式
每组数据输出n行,每行为对应字符串中的大写字母
样例输入
2
123Rtii
erYY09
1
fg*&KK
样例输出
R
YY
KK

数据规模与约定
1 <= n <= 10000。

说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。
在输出时,你的程序必须满足要求,不能少任何内容,也不能多任何内容。如果你的内容和输出要求不一样,你的程序会被判断为错误,包括你输出了提示信息、中间调试信息、标点符号、计时或者统计的信息等。
所有这些样例都测试通过,也不代表你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。

此题的上机步骤是:

  1. 建立一个Java项目,名称可以按题号取名;
  2. 建立一个类, 类的名称为Main。这一点非常重要;
  3. 编写代码并运行;
  4. 提交代码,注意题号要一致。
import java.util.*;
public class Main {
//判断字符串中大写字母
  public static String newStr(String str)
  {
	 String s1="",s2="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	 for(int i=0;i<str.length();i++) {
		 if(s2.indexOf(str.charAt(i))!=-1) {
			 s1=s1+str.charAt(i);
		 }
	 }
	 return s1;
	}
  public static void main(String[] args) {
	  Scanner s=new Scanner(System.in);
		while(s.hasNext()) {
			int n=s.nextInt();
			 String[] str=new String[n];
			 for(int i=0;i<n;i++) {
				 str[i]=s.next();
			 }
			 for(int i=0;i<n;i++) {
				 System.out.println(newStr(str[i]));
			 }
		} 
	  s.close();
  }
}

第37题 编程:n个整数的逆序输出
请编写程序:对输入的n个整数进行逆序并输出.

输入格式
n
n个用空格分隔开的整数。
输出格式
逆序(n个用一个空格分隔开的整数)。

样例输入
3
1 3 2
样例输出
2 3 1
注意: 2 3 1 中间只有一个空格, 尾部1的后面一个空格

此题的上机步骤是:

  1. 建立一个Java项目,名称可以按题号取名;
  2. 建立一个类, 类的名称为Main。这一点非常重要;
  3. 输入代码并运行;
  4. 提交代码,注意题号要一致。
import java.util.*;
public class Main {
  public static void main(String[] args) {
	  Scanner s=new Scanner(System.in);
			int n=s.nextInt();
			int[] m=new int[n];
			 for(int i=0;i<n;i++) {
				 m[i]=s.nextInt();
			 }
			 for(int i=n-1;i>=0;i--) {
				 System.out.print(m[i]+" ");
			 }	
	  s.close();
  }
}

第38题 编程:计算M以内最大的10个能被3整除的自然数之和
问题描述:
题目:计算并输出M以内最大的10个能被3整除的自然数之和,其中100<=M<=5000。
测试数据可能有多组,组数未知。

输入格式
自然数n
输出格式
M以内最大的10个能被3整除的自然数之和

样例输入
270
120
样例输出
Sum is 2565
Sum is 1065

此题的上机步骤是:

  1. 建立一个Java项目,名称可以按题号取名;
  2. 建立一个类, 类的名称为Main。这一点非常重要;
  3. 输入代码并运行;
  4. 提交代码,注意题号要一致。
import java.util.*;
public class Main {
  public static void main(String[] args) {
	  Scanner s=new Scanner(System.in);
	  while(s.hasNext()) {
		  int n=s.nextInt();
		  int sum=0,k=0;
			 for(int i=n;i>=100;i--) {
				 if(i%3==0) {
					 sum+=i;
					 k++;
					 if(k==10)
						 break;
				 }
			 }
				 System.out.println("Sum is "+sum);
	  }	
	  s.close();
  }
}

第41题 编程求数组最大值及其下标

对于给定整数数组a[],寻找其中最大值,并返回下标。
输入格式
  整数数组a[],数组元素个数小于1等于100。输出数据分作两行:第一行只有一个数,表示数组元素个数;第二行为数组的各个元素。
输出格式
  输出最大值,及其下标
样例输入
3
33 2 1
样例输出
33 0

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		int[] a=new int[n];
		int[] b=new int[n];
		for(int i=0;i<n;i++) {
			a[i]=s.nextInt();
			b[i]=a[i];
		}	 
		//冒泡排序求最大值
		int temp=0,f = 0;
		for(int j=0;j<n;j++) {
			for(int k=j+1;k<n;k++) {
				if(b[j]>b[k]) {
					temp=b[j];
					b[j]=b[k];
					b[k]=temp;
				}
			}
		}
		for(int q=0;q<n;q++) {
			if(a[q]==b[n-1]) {
				f=q;
			}
		}
		System.out.println(b[n-1]+" "+f);
	 
	  s.close();
  }
}

第41题 编程求数组最大值及其下标

对于给定整数数组a[],寻找其中最大值,并返回下标。
输入格式
  整数数组a[],数组元素个数小于1等于100。输出数据分作两行:第一行只有一个数,表示数组元素个数;第二行为数组的各个元素。
输出格式
  输出最大值,及其下标
样例输入
3
33 2 1
样例输出
33 0

import java.util.*;
public class Main {
	public static void bSort(int n,int[] b) {
		int[] a=new int[n];
		for(int i=0;i<n;i++) {
			a[i]=b[i];
		}	
		int temp=0,max=0,min=0;
		for(int j=0;j<n;j++) {
			for(int k=j+1;k<n;k++) {
				if(a[j]>a[k]) {
					temp=a[j];
					a[j]=a[k];
					a[k]=temp;
				}
			}
		}
		for(int i=0;i<n;i++) {
			if(b[i]==a[0])
				min=i;
			if(b[i]==a[n-1])
				max=i;
		}
		temp=b[min];
		b[min]=b[max];
		b[max]=temp;
	}
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		int[] b=new int[n];
		for(int i=0;i<n;i++) {
			b[i]=s.nextInt();
		}	
		bSort(n,b);
		for(int j=0;j<n;j++) {
			if(j!=n-1)
				System.out.print(b[j]+" ");
			else
				System.out.print(b[j]);
		}
	  s.close();
  }
}

第43题 编写. 计算某日是星期几
下面程序计算某日是星期几。
此题的上机步骤是:

  1. 建立一个Java项目,名称可以按题号取名;
  2. 建立一个类, 类的名称为Main。这一点非常重要;
  3. 按要求编写代码;
  4. 提交代码,注意题号要一致。

输入:
以空格分隔的日期,形式为YYYY MM DD
输出:
星期=n, 这里n是数字
The Main class is end.

样例输入:
1990 2 12
样例输出:
星期=1
The Main class is end.

import java.util.*;
public class Main {
public static void main(String[] args) {
	Scanner cin = new Scanner(System.in);
	int W;
	int y=cin.nextInt();
	int m=cin.nextInt();
	int d=cin.nextInt();
	if(m==1||m==2) {
 	   m+=12;
	    y--;}
	W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1;
	System.out.println("星期="+W);
	System.out.println("The Main class is end.");
}
}
/*基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。

注意:在公式中有个与其他公式不同的地方:

把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。*/

第44题 编写程序:分解质因数(10分)
  求出区间[a,b]中所有整数的质因数分解。
输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=2
3
7=7
8=222
9=33
10=2
5
提示
  先筛出所有素数,然后再分解。
数据规模和约定
  2<=a<=b<=10000

import java.util.Scanner;
 
public class Main {
 
	/**
	 * (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
	 * (2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商作为新的正整数n,重复执行第一步。
	 * (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
	 * 
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Integer a = sc.nextInt();
		Integer b = sc.nextInt();
		for (int i = a; i <= b; i++) {
			// 输入值大于等于3
			if (i >= 3) {
				String m = "";
				int k = 2;
				int j = i;
				while (j != k) {
					// 如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商作为新的正整数n
					if (j % k == 0) {
						m = m + k + "*";
						j = j / k;
					}
					// 如果n不能被k整除,则用k+1作为k的值
					else if (j % k != 0) {
						k++;
					}
				}
				m = m + k;
				System.out.println(i + "=" + m);
			} else {
				System.out.println(i + "=" + i);
			}
		}
	}
}

第54题 编写程序:完美(回文串)的代价(10分)
  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad
  第一次交换 ad : mamda
  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)
输入格式
  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母
输出格式
  如果可能,输出最少的交换次数。
  否则输出Impossible
样例输入
5
mamad
样例输出
3

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int n = Integer.parseInt(scanner.nextLine());
			String str = scanner.nextLine();
			char[] chs = str.toCharArray();
			int[] count = new int[26];
			char ch = '0';
			int oddchar = 0;
			for (int j = 0; j < chs.length; j++) {
				int index = chs[j] - 'a';
				count[index]++;
			}
			for (int i = 0; i < 26; i++) {
				if (count[i] % 2 != 0) {
					oddchar++;
					ch = (char) (i + 'a');
				}
			}
			if (oddchar > 1) {
				System.out.println("Impossible");
			} else {
				int result = exchange(chs, n, ch);
				System.out.println(result);
			}
		}
	}
	private static int exchange(char[] chs, int n, char ch) {
		int count = 0, i, j, k;
		for (i = 0; i < n / 2; i++) {
			if (chs[i] == ch) {
				for (j = i; j < n - i - 1; j++) {
					if (chs[j] == chs[n - i - 1]) {
						break;
					}
				}
				count += j - i;
				for (k = j; k > i; k--) {
					chs[k] = chs[k - 1];
				}
				chs[i] = chs[n - i - 1];
			} else {
				for (j = n - i - 1; j >= i; j--) {
					if (chs[j] == chs[i]) {
						break;
					}
				}
				count += n - i - 1 - j;
				for (k = j; k < n - i - 1; k++) {
					chs[k] = chs[k + 1];
				}
				chs[n - i - 1] = chs[i];
			}
		}
		return count;
	}
}

第55题 编写程序:字符串对比(10分)
  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
  1:两个字符串长度不等。比如 Beijing 和 Hebei
  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入格式
  包括两行,每行都是一个字符串
输出格式
  仅有一个数字,表明这两个字符串的关系编号
样例输入
BEIjing
beiJing
样例输出
3

import java.util.Scanner;
public class Main
{
   public static void main(String[] args)
   {
	 Scanner r=new Scanner(System.in);
     String str1=r.nextLine();
     String str2=r.nextLine();
     String strTem1=str1.toLowerCase();
     String strTem2=str2.toLowerCase();
     if(str1.length()!=str2.length()){
    	 System.out.println("1");
     }
     else{
    	 if(str1.equals(str2)){
    		 System.out.println("2"); 
    	 }
    	 if((str1.equals(str2)==false)&&(strTem1.equals(strTem2)==true)){
    		 System.out.println("3"); 
    	 }
    	 if((str1.equals(str2)==false)&&(strTem1.equals(strTem2)==false)){
    		 System.out.println("4"); 
    	 }
     }
   }
}

第65题 编写部分代码, 使用内部类判断一个long型整数n是否为回文数(10分)
下面程序判断一个long型整数n是否为回文数.如果是回文数,则输出"yes",否则输出"no".
回文数是它从左边读和从右边读是一样,例如121和55666655都是回文数.
但内部类Calc中部分代码缺失.请编写程序代码,使程序运行正确。

import java.util.*;
public class Main
{
   public static void main(String[] args)
   {
      Scanner reader=new Scanner(System.in);
      long n=reader.nextLong();
      Calc a=new Calc();
      boolean b=a.judge(n);
      if(b==true)
     System.out.println("yes");
      if(b==false)
     System.out.println("no");
      System.out.println("The Main class is end.");
   }
}
 
class Calc {
public Calc(){
}
public boolean judge(long n){
/*-----请编写代码-----*/
 boolean flag=true;
 long newed=0,p;
 while(p>0){
	 newed=newed*10+p%10;
	 p/=10;
 }
 if(newed==n)
	 flag=true;
 else
	 flag=false;
 return flag;
/*-----编写的代码结束-----*/
}
}

第83题 编写程序:关联矩阵(10分)
  有一个n个结点m条边的有向图,请输出他的关联矩阵。
输入格式
  第一行两个整数n、m,表示图中结点和边的数目。n<=100,m<=1000。
  接下来m行,每行两个整数a、b,表示图中有(a,b)边。
  注意图中可能含有重边,但不会有自环。
输出格式
  输出该图的关联矩阵,注意请勿改变边和结点的顺序。
样例输入
5 9
1 2
3 1
1 5
2 5
2 3
2 3
3 2
4 3
5 4
样例输出
1 -1 1 0 0 0 0 0 0
-1 0 0 1 1 1 -1 0 0
0 1 0 0 -1 -1 1 -1 0
0 0 0 0 0 0 0 1 -1
0 0 -1 -1 0 0 0 0 1

#include<iostream> 
 

using namespace std;

 
int a[101][1001]={{0}};

int main()  
{  
	
int n,m,j,k;
	
cin>>n>>m;
	
for(int i=1;i<=m;i++) 
	
{
		
cin>>j>>k;
		
a[j][i]=1;
		
a[k][i]=-1;
	}
	
for(int i=1;i<=n;i++)
		
for(int l=1;l<=m;l++)
			
if(l!=m)
				
cout<<a[i][l]<<" ";
			
else
				
cout<<a[i][l]<<endl;		
	
return 0;
}     
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值