java acm练习题
给定一个日期,输出这个日期是该年的第几天。
Input
数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
输出一行,表示该日期是该年的第几天。
Sample Input 1
1985/1/20
Sample Output 1
20
import java.util.Scanner; import static java.lang.Math.abs; //input:1985/1/20 output:20 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String date = sc.nextLine(); String[] array = date.split("/"); int year = Integer.parseInt(array[0]); int month = Integer.parseInt(array[1]); int day = Integer.parseInt(array[2]); boolean flag = isleap(year); if(!flag){ System.out.println(whatday(month,day)); }else{ if(month<=2){ System.out.println(whatday(month,day)); }else { System.out.println(whatday(month,day)+1); } } } public static int whatday(int month,int day) { if (month == 1) return day; if (month == 2) return day + 31; if (month == 3) return day + 31 + 28; if (month == 4) return day + 31 + 28 + 31; if (month == 5) return day + 31 + 28 + 31 + 30; if (month == 6) return day + 31 + 28 + 31 + 30 + 31; if (month == 7) return day + 31 + 28 + 31 + 30 + 31 + 30; if (month == 8) return day + 31 + 28 + 31 + 30 + 31 + 30 + 31; if (month == 9) return day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31; if (month == 10) return day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30; if (month == 11) return day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; if (month == 12) return day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; return 0; } public static boolean isleap(int year){ boolean flag =false; if(year%4==0){ flag=true; if(year%100==0){ flag=false; if(year%400==0){ flag=true; } } } return flag; } }
2.
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 Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { long n = sc.nextLong(); long sum = 0; for (long i = 1; i <= n; i++) { sum += i; } System.out.println(sum); } } }
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 Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int x = sc.nextInt(); int y = sc.nextInt(); if(x==0&&y==0) return; boolean flag = false; for(int i=x;i<=y;i++){ int res = function(i); flag = isprime(res); if(!flag){ System.out.println("Sorry"); return; } } System.out.println("OK"); } } public static boolean isprime(int num){ if(num<2) return false; if(num==3||num==2) return true; int temp = (int) Math.sqrt(num); for(int i= 2;i <=temp; i++){ if(num%i==0) return false ; } return true ; } public static int function(int x){ return x*x+x+41; } }
4.绝对值排序
Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
Sample Input 1
3 3 -4 2 4 0 1 2 -3 0
Sample Output 1
-4 3 2 -3 2 1 0
import java.util.Scanner; import static java.lang.Math.abs; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int count = sc.nextInt(); while(sc.hasNext()){ String[] strr = sc.nextLine().split(" "); String[] str = new String[strr.length-1]; if (str.length >= 0) System.arraycopy(strr, 1, str, 0, str.length); int[] num = new int[str.length]; for(int i=0;i<str.length;i++){ num[i] = Integer.parseInt(str[i]); } for(int i=0;i<num.length-1;i++){ for(int j=0;j<num.length-1-i;j++){ if(abs(num[j])<abs(num[j+1])){ int temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } for(int n:num){ System.out.print(n+" "); } } } }
5.二进制数
Description
若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B类数。
例如:
(13)10=(1101)2
其中1的个数为3,0的个数为1,则称此数为A类数;
(10)10=(1010)2
其中1的个数为2,0的个数也为2,称此数为B类数;
(24)10=(11000)2
其中1的个数为2,0的个数为3,则称此数为B类数;
程序要求:
求出1~1000之中(包括1与1000),全部A、B两类数的个数。
Input
无
Output
在一行中输出两个整数A和B,A表示A类数的个数,B表示B类数的个数,AB之间由一个空格分隔,除此之外不要再输出其他多余的东西。
public class Main { public static void main(String[] args) { int countA=0,countB=0; for(int i=1;i<=1000;i++){ int countone = 0,countzero = 0; String[] str = String.valueOf(Binary(i)).split(""); for(String s:str){ if("1".equals(s)){ countone++; }else{ countzero++; } } if(countone>countzero){ countA++; }else{ countB++; } } System.out.println(countA+" "+countB); } public static int Binary(int n){ String result = Integer.toBinaryString(n); return Integer.parseInt(result); } }
6.交换最小值和最大值
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 Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = sc.nextInt(); if(n == 0) return; int[] num = new int[n]; for(int i=0;i<n;i++){ num[i] = sc.nextInt(); } //找最小值并交换 int indexmin = 0; int min = num[0]; int k; for(k=1;k<n;k++){ if(num[k]<min) { min=num[k]; indexmin = k; } } int temp = num[indexmin]; num[indexmin] = num[0]; num[0] = temp; //找最大值并交换 int indexmax = 0; int max = num[0]; int j; for(j=1;j<n;j++){ if(num[j]>max) { max=num[j]; indexmax = j; } } temp = num[indexmax]; num[indexmax] = num[n-1]; num[n-1] = temp; for(int c:num){ System.out.print(c+" "); } System.out.println(); } } }
7.DNA排序
Description
逆序数可以用来描述一个序列混乱程度的量,例如,"DAABEC"的逆序数为5,其中D大于它右边的4个数,E大于它右边的1个数,4+1=5;又如,"ZWQM"的逆序数为3+2+1+0=6。
现在有许多长度一样的字符串,每个字符串里面只会出现四种字母(A,T,G,C)。请编写程序,将这些字符串按照它们的逆序数进行排序。
Input
输入由多组测试数据组成。每组测试数据的第一行为两个数n和m,0<n<=50,0<m<=100。n表示每个序列的长度(同一组测试数据中各序列的长度都为n),m表示此组测试数据中的序列个数。接下来有m行,每行为一个长度为n的DNA字母序列。
Output
对于每组测试数据,输出排序后的序列列表。在排序时,逆序数小的序列排在前面。如果两个序列的逆序数相等,那么它们在列表中出现的顺序和它们在输入中的顺序相同。
在每组测试数据后输出一行“********************”(二十个星号)。
Sample Input 1
3 3 ACG CGT AGT 6 2 TAAAAA ATAAAA
Sample Output 1
ACG CGT AGT ******************** ATAAAA TAAAAA ********************
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { int length = sc.nextInt(); int count = sc.nextInt(); sc.nextLine(); String[] array = new String[count]; for (int i = 0; i < count; i++) { String str = sc.nextLine(); array[i] = str; } for (int i = 0; i < array.length - 1; i++) { for (int j = 0; j < array.length - 1 - i; j++) { if (countReverse(array[j]) > countReverse(array[j + 1])) { String temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } for (String s : array) { System.out.println(s); } System.out.println("********************"); } } public static int countReverse(String str){ String[] array = str.split(""); int length = array.length; int count=0; for(int i=0;i<length;i++){ if("A".equals(array[i])) continue; if("C".equals(array[i])){ for(int k=i+1;k<length;k++){ if("A".equals(array[k])) count++; } } if("G".equals(array[i])){ for(int k=i+1;k<length;k++){ if("A".equals(array[k])||"C".equals(array[k])) count++; } } if("T".equals(array[i])){ for(int k=i+1;k<length;k++){ if("A".equals(array[k])||"C".equals(array[k])||"G".equals(array[k])) count++; } } } return count; } }
8.求整数的位数以及各位数之和
Description
输入一个正整数repeat(0<repeat<10),做repeat次下列运算:
输入一个整数,输出它的位数以及各位数之和。
Input
正整数repeat及repeat个整数
Output
整数的位数以及各位数之和
Sample Input 1
4 123456 -100 -1 99
Sample Output 1
number=6,sum=21 number=3,sum=1 number=1,sum=1 number=2,sum=18
import java.util.Scanner; import static java.lang.Math.abs; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i=0;i<n;i++){ int num = abs(sc.nextInt()); String[] array = String.valueOf(num).split(""); int count = array.length; int sum = 0; for(String s:array){ sum+=Integer.parseInt(s); } System.out.println("number="+count+",sum="+sum); } } }
9.输出Fibonacci序列
Description
输入一个正整数repeat(0<repeat<10),做repeat次下列运算:
输入2个正整数m和n(1<=m,n<=300000),输出m和n之间所有的Fibonacci数。
Fibonacci序列除第一个和第二个数外,任意一个数都可由前两个数相加得到,第一个数和第二个数的值均为1。
Fibonacci序列(第1项起):1 1 2 3 5 8 13 21 ......
Input
输入一个正整数repeat(0<repeat<10),代表做repeat次运算
输入repeat个正整数m和n
Output
输出
repeat次
m和n之间所有的Fibonacci数
每两个Fibonacci数之间用一个空格隔开,m和n之间的最后一个Fibonacci数后面也有一个空格
Sample Input 1
3 1 10 20 100 1000 6000
Sample Output 1
1 1 2 3 5 8 21 34 55 89 1597 2584 4181
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i=0;i<n;i++){ int start = sc.nextInt(); int end = sc.nextInt(); int[] res = Fibonacci(start,end); for(int num:res){ System.out.print(num+" "); } System.out.println(); } } public static int[] Fibonacci(int start,int end){ int[] array = new int[30]; array[0] = 1; array[1] = 1; for(int i=2;i<30;i++) { array[i]=array[i-1]+array[i-2]; if(array[i] > end) break; } List<Integer>list = new ArrayList<>(); for(int n:array) { if(n>=start && n<=end) { list.add(n); } } int[] fibonacci = new int[list.size()]; for(int i = 0;i<list.size();i++){ fibonacci[i] = list.get(i); } return fibonacci; } }
10.请完成汇率和金额排序程序
Description
在国际机场,我们会发现有多个货币兑换的窗口,这是由于各国货币的单位价值是不一样的。
下面列出了某日国际货币的汇率表(相对于100人民币的各国货币值)。
货币 | CNY | HKD | USD | EUR
汇率 | 100 | 118 | 15 | 13
例如,100元人民币可以兑换118香港币。请利用继承机制与Comparable接口实现不同数目货币对象价值的排序。
Input
输入3个数字
Output
金额价值从小到大
Sample Input 1
100 100 100
Sample Output 1
HKD100 USD100 EUR100
import java.util.Arrays; import java.util.Scanner; class Currency { private String name; //货币名称 private int originalValue; //原始值 private int value; //转换为人民币后的值 public static String[] CURRENCY_NAME = { "CNY", "HKD", "USD", "EUR" }; public static int[] CURRENCY_RATIO = { 100, 118, 15, 13 }; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getOriginalValue() { return originalValue; } public void setOriginalValue(int originalValue) { this.originalValue = originalValue; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } } class HKD extends Currency implements Comparable { // 实现你的构造函数与Comparable中的接口 public HKD(int hkd){ this.setName("HKD"); this.setValue(hkd); this.setOriginalValue((int)(100.0/118.0*hkd)); } @Override public int compareTo(Object o) { Currency oo = (Currency)o; if(this.getOriginalValue()<oo.getOriginalValue()){ return -1; }else{ return 0; } } } class USD extends Currency implements Comparable { public USD(int usd){ this.setName("USD"); this.setValue(usd); this.setOriginalValue((int)(100.0/15.0*usd)); } @Override public int compareTo(Object o) { Currency oo = (Currency)o; if(this.getOriginalValue()<oo.getOriginalValue()){ return -1; }else{ return 0; } } } class EUR extends Currency implements Comparable { public EUR(int eur){ this.setName("EUR"); this.setValue(eur); this.setOriginalValue((int)(100.0/13.0*eur)); } @Override public int compareTo(Object o) { Currency oo = (Currency)o; if(this.getOriginalValue()<oo.getOriginalValue()){ return -1; }else{ return 0; } } } public class Main { public static void main(String[] args) { Currency[] cs = new Currency[3]; //初始化 Scanner sc = new Scanner(System.in); //利用hasNextXXX()判断是否还有下一输入项 int a = 0; int b = 0; int c = 0; if (sc.hasNext()) { a = sc.nextInt(); cs[0] = new HKD(a); } if (sc.hasNext()) { b = sc.nextInt(); cs[1] = new USD(b); } if (sc.hasNext()) { c = sc.nextInt(); cs[2] = new EUR(c); } Arrays.sort(cs); for(int i=0;i<3;i++){ System.out.println(cs[i].getName()+""+cs[i].getValue()); } } }