ACN经典例题1

1、韩信点兵

描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。

输入

输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5

输出

输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89

样例输入

2 1 6

样例输出

41

public class Demo1 {
    public static void main(String[] args) {
        //System.out.println(ChooseOne.getRandom()+" -> 将完成此道题目。");
        
        String str=aA(2,1,6); //方法调用
        str=str.substring(0, str.length()-1); //字符串截取,去掉最后一个逗号
        System.out.println("总共有士兵数:"+str);
    }
    
    //韩信点兵
    public static String aA(int a,int b,int c){
        String s="";
        for(int x=10;x<=1000;x++){ //遍历10道1000之间的整数
            if(x%3==a && x%5==b && x%7==c){ //如果3人一排余a,并且5人一排余b,并且7人一排余c
                s+=x+",";
            }
        }
        if(!s.equals("")){
            return s;
        }
        return "No answer";
    }
}

2、另一种阶乘问题

描述

大家都知道阶乘这个概念,举个简单的例子:5!=1*2*3*4*5.现在我们引入一种新的阶乘概念,将原来的每个数相乘变为i不大于n的所有奇数相乘例如:5!!=1*3*5.现在明白现在这种阶乘的意思了吧!

现在你的任务是求出1!!+2!!......+n!!的正确值(n<=20)

输入

第一行输入一个a(a<=20),代表共有a组测试数据

接下来a行各行输入一个n.

输出

各行输出结果一个整数R表示1!!+2!!......+n!!的正确值

样例输入

2
3
5

样例输出

5
23


public class Demo2 {
    public static void main(String[] args) {
        System.out.println(ChooseOne.getRandom()+" -> 将完成此道题目。");
        
        //1!!+2!!+3!!...+n!!
        int n=5;
        
        int sum=0;
        for(int i=1;i<=n;i++){
            sum+=jieChengOther(i);
        }
        //以上是业务
        
        System.out.println(sum);
    }
    
    //另一种阶乘
    public static int jieChengOther(int x){
        int sum=1;
        for(int i=1;i<=x;i++){
            if(i%2!=0){ //如果是奇数
                sum*=i;
            }
        }
        return sum;
    }
}

3、6174问题

描述

假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数

比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4

输入

第一行输入n,代表有n组测试数据。

接下来n行每行都写一个各位数字互不相同的四位数

输出

经过多少次上面描述的操作才能出现循环

样例输入

1
1234

样例输出

4


public class Demo3 {

    public static void main(String[] args) {
        
        System.out.println(ChooseOne.getRandom()+" -> 将完成此道题目。");
        
        int n=1234;
        //6532-2356=4176
        //=7641-1467=6174
        //System.out.println(fromBigToSmall(5632)); //测试单个方法是否可用
        
        int count=0;
        while(n!=6174){
            n=fromBigToSmall(n)-fromSmallToBig(n);
            count++;
        }
        count++; //6174->6174也算一次
        System.out.println("次数"+count);

    }
    public static int fromBigToSmall(int x){
        //5632 -> 6532
        String str=x+"";
        int[] ins=new int[str.length()];
        for(int i=0;i<str.length();i++){
            ins[i]=Integer.parseInt(str.charAt(i)+"");
        }
        Arrays.sort(ins);
        
        String temp="";
        for(int i=0;i<ins.length;i++){
            temp+=ins[i];
        }
        
        //将temp进行字符串反转赋给ret
        String ret="";
        for(int i=0;i<temp.length();i++){
            ret+=temp.charAt(temp.length()-1-i);
        }
        
        return Integer.parseInt(ret);
    }
    public static int fromSmallToBig(int x){
        
        String str=x+"";
        int[] ins=new int[str.length()];
        for(int i=0;i<str.length();i++){
            //System.out.print(str.charAt(i)+" ");
            ins[i]=Integer.parseInt(str.charAt(i)+"");
            //System.out.print(ins[i]+" ");
        }
        
        Arrays.sort(ins); //从小到大排序
        
        String temp="";
        for(int i=0;i<ins.length;i++){
            temp+=ins[i];
        }
        
        return Integer.parseInt(temp);
    }
}

posted on 2017-12-03 23:07  bingo1717  阅读(565)  评论(0编辑  收藏  举报