杭电水题_Java-2006

先言:

        这是一题接触杭电半年多写的第一次用JAVA编译的题目,且很荣幸的耗时3小时解决所有杂七杂八的问题成功AC的题目。有一些过程中遇到的小问题下列将一一解释:

代码演示:

package test_2006;

import java.util.Scanner;

/* 
 * 需求:给n个整数,求其中的奇数积
 * 分析:
 *     键盘录入数据(!!!测试多组数据)
 *     对给定的数据遍历,将其中的奇数累积
 *     定义一个变量oddMul
 *     最后将oddMul打印输出
 */
public class OddMultipliction {
    public static void main(String[] args) {
        //键盘录入数据
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()){
            //分配堆内存空间
            int[] arr = new int[sc.nextInt()];
                     
            //输入多组数据
            for(int i = 0; i < arr.length; i++) {
                arr[i] = sc.nextInt();
            }
            //定义并初始化变量oddMul
            int oddMul = 1;
            //遍历数组的各个元素
            for(int i = 0; i < arr.length; i++) {
                //对遍历到的元素进行奇数判断
                if(arr[i]%2 == 1 || arr[i]%2 == -1) {
                    oddMul *= arr[i];
                }
            }

            //打印结果
            System.out.println(oddMul);
        }
    }
}

思路:
       看题目得知需求只是要从测试的数据中调出奇数来做乘积。所以,我想到的是将数据录入存放在一个数组里,对其遍历。将其中满足条件的元素与一个存放数据的变量(初始化为1)做乘法运算。

现在来说说遇到的问题呗:

a.主类问题:提交代码HDOJ对各类语言的输入输出格式有特定要求。这边特别是JAVA(说明源于F.A.Q):

关于Java的特别说明:
1、HDOJ上使用的是JDK 1.50 Update 8多国语言版。
2、您提交的Java程序必须是单个文件的,也就是所有的类必须写在一个文件里。但是必须有一个类的里面必须包含一个名字为'main'的静态方法(函数),这个方法是程序的入口。
3、如果您将主类申明为public公有类,则这个类名必须是'Main'(注意大小写,请参看第二个程序)。
4、每个题目对于Java程序的时间和内存限制一般都会放宽的。但是即便如此,有些题目还是不适合用Java来解,对于这些题目我们建议您使用编译性语言来解。

import  java.util.Scanner;

class Sum{        //另一种格式:public class Main

public static void main(String[] args){

               Scanner sc = new int(System.in);

                int a,b;

              //录入多组数据

               while(sc.hasNextInt()){

               a = sc.nextInt();

               b = sc.nextInt();

               System.out.println(a + b);

              }

         }

}

b.判断奇数:实数范围内的整数中对二求余的绝对值为一的数

             

   if(arr[i]%2 == 1 || arr[i]%2 == -1) {
                代码块(^@^)
                }

———————————————————————————分割线——————————————————————————————

另一种思想:

扫描二维码关注公众号,回复: 2536885 查看本文章

将录入的数据直接判断是不是奇数。如果是的话,就对他进行乘法运算;如果不是的话,就跳过判断下一个数据。

代码演示:

package test_2006;
/*
 * 采用录入数据直接对奇数求和
 */
import java.util.Scanner;

public class OddMul_02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(sc.hasNextInt()) {
			int n = sc.nextInt();
			//定义变量oddMul
			int oddMul = 1;
			//遍历数组的各个元素
			int value;
			for(int i = 0; i < n; i++) {
				//录入数据
				value = sc.nextInt();
				//对测试数据做判断
				if(value%2 == 1 || value%2 ==-1) {
					oddMul *= value;
				}
			}
			System.out.println(oddMul);
		}
	}
}

这个Demo较之前一个,解决该问题更优。

        第一个Demo为了存入数据,从而创建一个数组的堆内存空间存数据,所以空间复杂度为O(n)。先前存数据再到之后的条件判断,两个for循环。即时间复杂度为O(2n)。

        第二个Demo只有初始化一个变量value的空间l来存放数组,空间复杂度为O(1)。再对录入到value上的直接判断是否满足条件,所以其时间复杂度为O(n)。

综上,Demo_02优于Demo_01。

猜你喜欢

转载自blog.csdn.net/Black_ZT/article/details/81389172