【ACM】P2006、P2007、P2008、P2009、P2010代码演示

【p2006问题描述】给你n个整数,求他们中所有奇数的乘积:

/**
 * 求奇数的乘积
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 92889    Accepted Submission(s): 57119


Problem Description
给你n个整数,求他们中所有奇数的乘积。


Input
输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,
接着是n个整数,你可以假设每组数据必定至少存在一个奇数。


Output
输出每组数中的所有奇数的乘积,对于测试实例,输出一行。


Sample Input

3 1 2 3
4 2 3 4 5



Sample Output

3
15
 */

代码演示:

package ac;

import java.util.Scanner;

public class P2006 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int sum=1;
            for(int i=0;i<n;i++){
                int temp=sc.nextInt();
                if(temp%2!=0){
                    sum=sum*temp;
                }
            }
            System.out.println(sum);
        }
    }
}

运行结果:

这里写图片描述

【p2007问题描述】给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和:

/**
平方和与立方和
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 169171    Accepted Submission(s): 53722


Problem Description
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。


Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。


Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。


Sample Input

1 3
2 5



Sample Output

4 28
20 152
*/

代码演示:

package ac;

import java.util.Scanner;

public class P2007{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int m=sc.nextInt();
            int n=sc.nextInt();
            /**此处必须判断m、n大小,因为只有这样才能确保一个m到n的序列值*/
            if(m>n){
                int temp;
                temp=m;
                m=n;
                n=temp;
            }
            int sum1=0;
            int sum2=0;
            for(int i=m;i<=n;i++){
                if(i%2==0){
                    sum1=sum1+i*i;
                }else{
                    sum2=sum2+i*i*i;
                }
            }
            System.out.println(sum1+" "+sum2);
        }
    }
}

运行结果:

这里写图片描述

【p2008问题描述】统计给定的n个数中,负数、零和正数的个数:

/**
 * 数值统计
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 105710    Accepted Submission(s): 51231


Problem Description
统计给定的n个数中,负数、零和正数的个数。


Input
输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;
如果n=0,则表示输入结束,该行不做处理。


Output
对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。


Sample Input

6 0 1 2 3 -1 0
5 1 2 3 4 0.5
0 



Sample Output

1 2 3
0 0 5


 */

代码演示:

package ac;

import java.util.Scanner;

public class P2008 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in    );
        while(sc.hasNext()){
            int n=sc.nextInt();
            if(n==0){
                System.exit(0);
            }
            int positive=0;//正数
            int negative=0;//负数
            int zero=0;//零
            for(int i=0;i<n;i++){
                double temp=sc.nextDouble();//注意题意中输入了一个double型值
                if(temp>0){
                    positive++;
                }else if(temp<0){
                    negative++;
                }else{
                    zero++;
                }
            }
            System.out.println(negative+" "+zero+" "+positive);
        }
    }
}

运行结果:

这里写图片描述

【p2009问题描述】数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和:

/**
 * 求数列的和
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 82255    Accepted Submission(s): 49930


Problem Description
数列的定义如下:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。


Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。


Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。


Sample Input

81 4
2 2



Sample Output

94.73
3.41


 */

代码演示:

package ac;

import java.util.Scanner;

public class P2009 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int m=sc.nextInt();
            /**注意此处有个陷阱:数列的第一项为n ,因为总共为m项,
            所以后边有m-1项,所以sum因该是从sum=n开始*/
            double sum=n;
            double temp=n;
            for(int i=0;i<m-1;i++){
                temp=Math.sqrt(temp);
                sum=sum+temp;
            }
            System.out.printf("%.2f",sum);
            System.out.println();
        }
    }
}

运行结果:

这里写图片描述

【p2010问题描述】现在要求输出所有在m和n范围内的水仙花数:

/**
 * 水仙花数
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 190659    Accepted Submission(s): 54493


Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。


Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。


Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,
就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,
则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。


Sample Input

100 120
300 380



Sample Output

no
370 371
 */

代码演示:

package ac;

import java.util.Scanner;

public class P2010 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int m=sc.nextInt();
            int n=sc.nextInt();
            int count=0;
            for(int i=m;i<=n;i++){
                int a=i/100;
                int b=i%100/10;
                int c=i%100%10;
                int sum=a*a*a+b*b*b+c*c*c;
                /**每次当i==sum出现水仙花数的时候,进行格式化输出*/
                if(i==sum){
                    count=count+1;
                    /**第一个必须没有空格,当后边还有输出的时候其自动补空格,输出一个数之前补一个空格*/
                    if(count==1){
                        System.out.print(i);
                    }else{
                        System.out.print(" "+i);
                    }
                }
            }
            /**通过所得到的计数count,来判断是否有水仙花数*/
            if(count==0){
                System.out.print("no");
            }
            System.out.println();
        }
    }
}

运行结果:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值