ACM题解记录,java版,001

2017年11月22日23:17:25 发表评论 633 views

 

数字求和

总时间限制:
1000ms
内存限制:
65536kB
描述
给定一个正整数a,以及另外的5个正整数,问题是:这5个整数中,小于a的整数的和是多少?
输入
输入一行,只包括6个小于100的正整数,其中第一个正整数就是a。
输出
输出一行,给出一个正整数,是5个数中小于a的数的和。
样例输入
10 1 2 3 4 11
样例输出
10
public class acm1001 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int x1 = sc.nextInt();
		int x2 = sc.nextInt();
		int x3 = sc.nextInt();
		int x4 = sc.nextInt();
		int x5 = sc.nextInt();
		int sum = 0 ;
		if(a>x1){
			sum += x1;
		} if(a>x2){
			sum+= x2;
		} if(a>x3){
			sum+= x3;
		} if(a>x4){
			sum+= x4;
		} if(a>x5){
			sum+= x5;
		}
		System.out.println(sum);
	}

}

与7无关的数

描述

一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7,则称其为与7相关的数.现求所有小于等于n(n<100)的与7无关的正整数的平方和.

输入

输入为一行,正整数n,(n<100)

输出

输出小于等于n的与7无关的正整数的平方和

样例输入

21

样例输出

2336

 

public class acm1002_1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int sum = 0,n ;
		n = sc.nextInt();
		for (int i = 1; i <= n; i++) {
			if (i % 7 != 0 && i % 10 != 7 && i / 10 != 7) {
				sum = sum + i*i;
			}
		}
		System.out.println(sum);

	}

}

和数

描述

给定一个整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。

输入

第一行是一个整数T,表示一共有多少组数据。 1<= T <= 100
接下来的每组数据共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个整数组成的数列。

输出

对于每组数据,输出一个整数(占一行),就是数列中等于其他两个数之和的数的个数。

样例输入

2
4
1 2 3 4
5
3 5 7 9 10

样例输出

2
1

 

思路:可以先将这个数组中所有两个数相加的和存入另一个数组(两重循环即可),然后再扫描一遍这个数组同相加的和的数组比较,如果相同则答案++

public class acm1003 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] n =new int[sc.nextInt()];
		int n1[][] = new int[n.length][100];
		for(int i = 0;i<n.length;i++){
			n[i] = sc.nextInt();
			for(int j = 0; j<n[i];j++){
				n1[i][j] = sc.nextInt();
			}
		}
		for(int i = 0 ;i<n.length;i++){
			int c = 0 ;
			for(int j = 0;j<n[i];j++){
				int b = 0;
				for(int x = 0 ;x<n[i];x++){
					for(int y = 0;y<n[i];y++){
						if(n1[i][j] == n1[i][x] + n1[i][y] && j!=x&&j!=y&&x!=y){
							c++;
							b=1;
							break;
						}
					}
					if(b==1){
						break;
					}
				}
			}
			System.out.println(c);
		}
		
	}

}

反转诗句

描述

你手中有些从右向左读的诗句,比如“rose red red a like is luve my O”。
现在为了阅读这些美妙的诗句,你要把这些语句反转成正常的从左到右,即“O my luve is like a red red rose”。

输入

每一行为原来从右向左读的诗句S。该诗句中不包含任何标点符号,单词间以空格隔开。每条诗句最多包含 50个单词,每个单词最多包含50个字符。

输出

每一行为正常的从左到右读的诗句。

样例输入

rose red red a like is luve my O
June in sprung newly That's
melodie the like is luve my O
tune in played sweetly That's

样例输出

O my luve is like a red red rose
That's newly sprung in June
O my luve is like the melodie
That's sweetly played in tune

 

以下代码没提交通过。说实话我也纳闷,网上那些C语言人为判断都不符合要求,50个字符都超了还能ac

public class acm1004 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		loop: while (sc.hasNext()) {
			String str = sc.nextLine();
			String[] arr = str.split(" ");

			if (arr.length <= 50) {
				for (int i = 0; i < arr.length; i++) {
					if (arr[i].length() > 50) {
						continue loop;
					}
				}

				String temp = "";
				for (int i = 0; i <= arr.length / 2; i++) {
					temp = arr[i];
					arr[i] = arr[arr.length - (1 + i)];
					arr[arr.length - (1 + i)] = temp;

				}
				for (int i = 0; i < arr.length; i++) {
					if (i != arr.length - 1) {
						System.out.print(arr[i] + " ");
					} else {
						System.out.print(arr[i]);
					}
				}
				System.out.println();

			}
		}
	}

}

 

1的个数

描述

给定一个十进制整数N,求其对应2进制数中1的个数

输入

第一个整数表示有N组测试数据,其后N行是对应的测试数据,每行为一个整数。

输出

N行,每行输出对应一个输入。

样例输入

4
2
100
1000
66

样例输出

1
3
6
2

 

public class acm1005 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for(int i = 0 ;i<n;i++){
			int a = sc.nextInt();
			String s = Integer.toBinaryString(a);
			String[] arr = s.split("");
			int num = 0 ;
			for(int j = 0 ;j<arr.length;j++){
				if(arr[j].equals("1")){
					num++;
				}
			}
			System.out.println(num);
			
		}
		
	}

}

放苹果

描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入

1
7 3

样例输出

8

 

public class acm1006 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		if(t>=0&&t<=20){
			for(int i=0;i<t;i++){
				System.out.println(fun(sc.nextInt(),sc.nextInt()));
			}
		}
	}

	private static int fun(int m, int n) {
		if(m==0||n==1){
			return 1;
		}
		if(n>m){
			return fun(m,m);
		}else{
			return fun(m,n-1)+fun(m-n,n);
		}
	}

}

递归求和

描述

递归是一种非常有效的程序设计方法,应用相当广泛,递归求和就是其中的一种。现在定义数列通项An = n * n,给定一个整数n(1 <= n <= 1000),要你求前n项和Sn,即Sn = 1 * 1 + 2 * 2 + ... + n * n。要求使用递归的方法进行计算。

输入

输入只有一行,包括一个整数n,表示要求的项数。

输出

输出只有一行,为一个整数Sn,表示对应的前n项和。

样例输入

7

样例输出

140

 

public class acm1019 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		acm1019 t = new acm1019();
		System.out.println(t.count(sc.nextInt()));
	}
	private  int count(int n) {
		if(n==1){
			return 1*1;
		}else{
			return n*n + count(n-1);
		}
		
	}

}

前段时间练的50道经典题就不发了,就直接发在poj上练习的代码。

此部分代码还算简单,就是苹果问题稍微难考虑。

未来一月可能就只发布练习的代码,及学习的代码还有可能是题目分析。把装到脑子的东西再复述出来也是一种学习方式。

o了,碎觉。

 

 

 

  • A+
所属分类:ACM

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: