一、题干



Description
魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下,并对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看”。魔术师将最上面的那张牌数为1,把牌翻过来正好是黑桃A,将黑桃A放在桌子上;然后按顺序从上到下数手上的余牌,第二次数1、2,此时将第一章牌放在这迭牌的下面,将第二张牌翻过来正好是黑桃2,也将它放在桌子上;第三次数1、2、3,此时将前面两张依次放在这迭牌的下面,再翻开第三张牌正好是黑桃3。这样依次进行,将13张牌全部翻出来,准备无误。问魔术师手中的牌原始顺序是怎样安排的?
Input
无输入。
Output
输出一行数字,即魔术师手中牌的原始顺序。(样例输出只是格式提示)
Sample Input
无输入
Sample Output
2 3 4 5 6 7 8 9 10


View Code

二、代码



public class T17 {

        //笔算,还快些
    public static void main(String[] args) {
        
        System.out.println("1 8 2 5 10 3 12 11 9 4 7 6 13");

    }

}


View Code

 

1018.金蝉素数

一、题干



Description
某古寺的一块石碑上依稀刻着一些神秘的自然数。这些数是由1,3,5,7,9这五个奇数排列组成的5位素数,且同时去掉它的最高位和最低位数字后剩下的3位数还是素数,同时去掉它的高二位与低二位数字后剩下的一位数还是素数,人们把这些神秘的素数称为金蝉素数,寓意金蝉脱壳之后仍为美丽的金蝉。编程找出石碑上的金蝉素数。
Input
无输入。
Output
每行输出一个金蝉素数。(样例输出只是格式提示)
Sample Input
无输入
Sample Output
123456
789123


View Code

二、代码



public class T18 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        //答案
//        System.out.println(13597);
//        System.out.println(53791);
//        System.out.println(79531);
//        System.out.println(91573);
//        System.out.println(95713);
        
        int[] num=new int[]{1,3,5,7,9};
        for (int i = 0; i < num.length; i++) {
            for (int j = 1; j < num.length; j++) {
                for (int j2 = 0;j2 < num.length; j2++) {
                    
                    if (j2!=i && j2!=j && i!=j && j!=4) {
                        int sum = num[j2]+num[j]*10+num[i]*100;

                        if (getSuNum(sum)) {
                            
                            for (int k = 0; k < num.length; k++) {
                                for (int k2 = 0; k2 < num.length; k2++) {
                                    
                                    if ( k!=j2 && k!=j && k!=i && k2!=i && k2!=j && k2!=j2 && k2!=k) {
                                        
                                         int sum1 = sum*10+num[k2]+num[k]*10000;
                                         if (getSuNum(sum1)) {
                                            System.out.println(sum1);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private static boolean getSuNum(int sum) {
        
        boolean fa=true;
        
        for (int i = 2; i < sum/2+1; i++) {
            
            if (sum%i==0) {
                fa=false;
                break;
            }
            
        }
        
        return fa;
    }
}


View Code

 

1019.完全数

一、题干



Description
完全数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数),恰好等于它本身。例如,6就是完全数,6的约数有1、2、3、6,除去本身6外,1+2+3=6。编程找出10000以内的所有完全数。
Input
无输入。
Output
每行输出一个完全数。(样例输出只是格式提示)
Sample Input
无输入
Sample Output
6
28


View Code

二、代码



public class T19 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        for (int i = 1; i < 10000; i++) {
            
            int sum=1;
            for (int j = 2; j < i/2+1; j++) {
                
                if (i%j==0) {
                    sum+=j;    
                }
            }
            if (sum==i) {
                System.out.println(i);
            }
        }

    }

}


View Code

 

1020.自守数

一、题干



Description
如果某个数的平方的末尾几位数等于这个数本身,那么就称这个数为自守数。例如,5是自守数,5*5=25。编程找出10000以内的所有自守数。
Input
无输入
Output
每行输出一个自守数。(样例只是格式提示)
Sample Input
无输入
Sample Output
1
5
6


View Code

二、代码



public class T20 {

    /**
     * 如果某个数的平方的末尾几位数等于这个数本身,那么就称这个数为自守数。
     * 例如,5是自守数,5*5=25。编程找出10000以内的所有自守数。
     */
    public static void main(String[] args) {

        for (int i = 1; i < 10000; i++) {
            int j = 10;
            for (; ;) {
                if (i/j>0) {
                    j*=10;
                }else{
                    break;
                }
            }
            if ((i*i-i)%j==0) {
                System.out.println(i);
            }

        }

    }

}


View Code

 

1021.分数数列

一、题干



Description
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 
Input
无输入
Output
输入该数列的前20项,并在下一行输出该数列的总和。(输出样例只是格式提示)
Sample Input
无输入
Sample Output
2.0/1.0 + 3.0/2.0 + 5.0/3.0 + 
sum:12.123456


View Code

二、代码



import java.math.BigDecimal;


public class T21 {

    /**
     * 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 
     */
    public static void main(String[] args) {
        
        float s=1f;
        float sum=0 ;
        for (int i = 2; i < 22; i++) {
            float chu=getSum(i)/s;

            sum=sum+chu;
            System.out.print(getSum(i)+"/"+s+" + ");
            s=getSum(i);
        }
        System.out.println();
        System.out.println("sum:"+sum);
    }
    public static float getSum(int a) {
        if (a==1) {
            return 1;
        }else if(a==2){
            return 2;
        }else {
            return getSum(a-1)+getSum(a-2);
        }
    }
}


View Code

 

1022.拉丁方阵

一、题干



Description
在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
编一程序,从键盘输入N值后,打印出其N阶拉丁方阵。
        1  2  3  4  5
        2  3  4  5  1
        3  4  5  1  2
        4  5  1  2  3
        5  1  2  3  4
Input
任输入一个(大于3,小于20)的介数
Output
打印出其N阶拉丁方阵
Sample Input
4
Sample Output
 1  2  3  4 
 2  3  4  1 
 3  4  1  2 
 4  1  2  3


View Code

二、代码



import java.util.Scanner;


public class T22 {

    /**
     * 在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,
     * 这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
     * 编一程序,从键盘输入N值后,打印出其N阶拉丁方阵。
     */
    public static void main(String[] args) {
        
        Scanner scanner=new Scanner(System.in);
        
        int a=scanner.nextInt();

        getHH(a);
        
    }
    public static void getHH(int a) {
        
        for (int i = 0; i < a; i++) {
            
            for (int j = 0; j < a; j++) {
                if (i+j+1<=a) {
                    System.out.print(i+j+1+" ");
                }else {
                    System.out.print((i+j+1)-a+" ");
                }
                
                
            }
            System.out.println();
        }
    }
}


View Code

 

1023.拾麦子

一、题干



Description
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,
问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,
在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,
在第4个棋盘格放8粒麦子,......后一格的数字是前一格的两倍,
直到放完所有棋盘格(国际象棋共有64格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
Input
无输入
Output
输出到底需要多少粒麦子。(样例输出只是格式提示)
Sample Input
无输入
Sample Output
1234567889


View Code

二、代码



import java.math.BigInteger;


public class T23 {

    /**
     * @param args
     */
    public static void main(String[] args) {

        BigInteger sum=new BigInteger("2");
        for (int i = 0; i < 64; i++) {
            sum=sum.add(BigInteger.valueOf((long)(Math.pow(2, i))));
        }
        System.out.println(sum);
    }

}


View Code

 

1024.退圈报数

一、题干



Description
有50个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,请将出圈的序号罗列显示出来。
Input
无输入
Output
将出圈的序号以逗号分隔开依次显示出来。(样例输出只是格式提示)
Sample Input
无输入
Sample Output
1,2,3,4,5,


View Code

二、代码



public class T24 {

    /**
     * 有50个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
     * 凡报到3的人退出圈子,请将出圈的序号罗列显示出来。
     */
    public static void main(String[] args) {

        int[] arr=new int[50];
        
        for (int i = 0; i < arr.length; i++) {
             arr[i]=i+1;
        }
        
        int co=0;
        int le=50;
        
        while (le>2) {
            int conut=0;
            for (int i = 0; i < 50; i++) {

                if (arr[i]!=-1) {
                    co++;
                }
                if (co==3) {
                    System.out.print(arr[i]+",");
                    arr[i]=-1;
                    conut++;
                    co=0;
                }
            }
            le-=conut;
        }
    }
}


View Code

 

1025.运动员分组

一、题干



Description
有N个人参加100米短跑比赛。跑道为8条。程序的任务是按照尽量使每组的人数相差最少的原则分组。
 例如:
 N=8时,分成1组即可。
 N=9时,分成2组:一组5人,一组4人。
 N=25时,分4组:7、6、6、6。


 请编程计算分组数字。
 要求从标准输入获得一个正整数(1~100之间,不必考虑输入错误的情况),表示参赛的人数。
 程序输出每个组的人数。从大到小顺序输出,每个数字一行。

Input
一个正整数(1~100之间,不必考虑输入错误的情况),表示参赛的人数。
Output
程序输出每个组的人数。从大到小顺序输出,每个数字一行。
Sample Input
25
Sample Output
7
6
6
6


View Code

二、代码



import java.util.Scanner;


public class T25 {

    /**
     * 有N个人参加100米短跑比赛。跑道为8条。程序的任务是按照尽量使每组的人数相差最少的原则分组。
     例如:
     N=8时,分成1组即可。
     N=9时,分成2组:一组5人,一组4人。
     N=25时,分4组:7、6、6、6。
    
    
     请编程计算分组数字。
     要求从标准输入获得一个正整数(1~100之间,不必考虑输入错误的情况),表示参赛的人数。
     程序输出每个组的人数。从大到小顺序输出,每个数字一行。
     */
    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        
        int a=scanner.nextInt();
        
        int le=0;
        le=a%8==0?(a/8):(a/8+1);
        
        int ji=a/le;
        
        for (int i = 0; i < le; i++) {
            
            if (a==le*ji) {
                System.out.println(ji);    
            }else {
                System.out.println(ji+1);
                a--;
            }
        }
    }
}


View Code

 

1026.排列序数

一、题干


Description
  如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
  abcd  0
  abdc  1
  acbd  2
  acdb  3
  adbc  4
  adcb  5
  bacd  6
  badc  7
  bcad  8
  bcda  9
  bdac  10
  bdca  11
  cabd  12
  cadb  13
  cbad  14
  cbda  15
  cdab  16
  cdba  17
  ...

    现在有不多于10个两两不同的小写字母(从a开始连续的字母),给出它们组成的串,你能求出该串在所有排列中的序号吗?

Input
一行,一个串。
Output
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
Sample Input
cedab
Sample Output
70


View Code

二、代码



import java.util.Arrays;  
import java.util.Scanner;  
  
public class T26 {  
    public static char [] array;  
    public static boolean flag [];  
    public static char[] all_P ;  
    public static int count = 0;  
    public static void main(String[] args) {  

        Scanner scan = new Scanner(System.in);  
        String string = scan.next();  
        array = string.toCharArray();
        
        Arrays.sort(array); 
        
        flag= new boolean[array.length];  
        all_P = new char[array.length];  
        dfs(0,string);  
    }  
    private static void dfs(int n,String string) {  
  
        if(n == array.length){  
            if(string.equals(String.valueOf(all_P))){  
                System.out.println(count);  
            }  
 
            count++;  
            return;  
        }  
        for(int i = 0; i < array.length; i++){  
            if(!flag[i]){  
                flag[i] = true;  
                all_P[n] = array[i];  
                dfs(n+1, string);  
                flag[i] = false;  
            }  
        }  
    }  
  
}


View Code

 

1027高斯日记

一、题干



Description
大数学家高斯有个好习惯:无论如何都要记日记。

    他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

    后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

    高斯出生于:1777年4月30日。
    
    在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

    高斯获得博士学位的那天日记上标着:8113  

    请你算出高斯获得博士学位的年月日。

Input
一个正整数
Output
算出的日期,按照格式yyyy-mm-dd, 例如:1980-03-21
Sample Input
5343
Sample Output
1791-12-15


View Code

二、代码


import java.util.Date;
import java.util.Scanner;

public class T27 {

    /**
     * 1027.高斯日记
     * 
     * 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
     * 
     * 高斯获得博士学位的那天日记上标着:8113 
     */
    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        
        int day=scanner.nextInt();

        int Y=1777,M=4,D=30;
        
        int[] a={0,31,28,31,30,31,30,31,31,30,31,30,31};
        
        int y=0,m,d;
        
        if (day==1) {
            System.out.println("1777-4-30");
            return;
        }
        day--;
        if (day<=245) {
            y=1777;
            for ( m = 5; m <= 12; m++) {
                if (day<a[m]) {
                    break;
                }else {
                    day-=a[m];
                }
            }
        }else{
    
            for (m=5;m<=12;m++) {
                day-=a[m];
            }
            y=Y+1;
            
            while (day>365) {
                if(getPy(y)){
                    day-=366;
                }else {
                    day-=365;
                }
                y++;
            }
            if (getPy(y)) {
                a[2]++;
            }
            for ( m = 1; m <= 12; m++) {
                if (day<a[m]) {
                    break;
                }else {
                    day-=a[m];
                }
            }
        }
        String ma=m<10?"0"+m:m+"";
        String daya=day<10?"0"+day:day+"";
        System.out.println(y+"-"+m+"-"+day);
    }
    
    
    //判断平年还是闰年
    public static boolean getPy(int y) {
        if (y%400 == 0 || (y%4 == 0 && y%100!=0)) {
            return true;
        }else {
            return false;
        }
    }
}


View Code

 

1028.生物芯片

一、题干


Description
X博士正在研究一种生物芯片,其逻辑密集度、容量都远远高于普通的半导体芯片。

    博士在芯片中设计了 n 个微型光源,每个光源操作一次就会改变其状态,即:点亮转为关闭,或关闭转为点亮。

    这些光源的编号从 1 到 n,开始的时候所有光源都是关闭的。

    博士计划在芯片上执行如下动作:

    所有编号为2的倍数的光源操作一次,也就是把 2 4 6 8 ... 等序号光源打开

    所有编号为3的倍数的光源操作一次, 也就是对 3 6 9 ... 等序号光源操作,注意此时6号光源又关闭了。

    所有编号为4的倍数的光源操作一次。

    .....

    直到编号为 n 的倍数的光源操作一次。


    X博士想知道:经过这些操作后,某个区间中的哪些光源是点亮的。

Input
3个用空格分开的整数:N L R  (L<R<N<10^15)  N表示光源数,L表示区间的左边界,R表示区间的右边界。
Output
输出1个整数,表示经过所有操作后,[L,R] 区间中有多少个光源是点亮的。
Sample Input
10 3 6
Sample Output
3


View Code

二、代码



import java.math.BigInteger;
import java.util.Scanner;

import javax.xml.namespace.QName;


public class T28 {

    /**
     * 思路:完全平方数的因子个数为奇数。

    一个光源最后是打开的,当且仅当他被操作了奇数次,也即是说该数的因子数为奇数,
    即该数为完全平方数,但是这题是不算1的,故最终答案是,若该数不是完全平方数,则最后为打开状态。
     */
    public static void main(String[] args) {
        
        Scanner scanner=new Scanner(System.in);
        String inString=scanner.nextLine();
        
        String[] arrStrings=inString.split(" ");
        
        BigInteger n=BigInteger.valueOf(Integer.parseInt(arrStrings[0]));
        BigInteger l=BigInteger.valueOf(Integer.parseInt(arrStrings[1]));
        BigInteger r=BigInteger.valueOf(Integer.parseInt(arrStrings[2]));
        
        BigInteger q=BigInteger.valueOf(1);
        
        BigInteger sum=r.subtract(l);
        
        for (BigInteger i = l; i.multiply(i).compareTo(r)==1; i.add(q)) {

            if (i.multiply(i).compareTo(l)==-1&&i.multiply(i).compareTo(r)==1) {
                sum.subtract(q);
            }
            
        }
        System.out.println(sum);

    }

}


View Code

1029.打印十字图

一、题干


略..

View Code

二、代码



import java.util.Scanner;  
public class T29 {  
    public static void main(String[] args) {  
        Scanner input=new Scanner(System.in);  
        int n=input.nextInt();  
        int low,row,center;  
        low=row=4*(n-1)+9;  
        int [][]array=new int[low][row];  
        for(int i=0;i<low;i++)  
            for(int j=0;j<row;j++){  
                array[i][j]='.';  
            }  
        center=row/2;  
        for(int i=center-2;i<=center+2;i++){  
            array[center][i]='$';  
            array[i][center]='$';  
        }  
        for(int m=0;m<n;m++){  
        for(int i=center-2-2*m;i<(center+3+2*m);i++){  
            array[center-(4+m*2)][i]='$';  
            array[center+(4+m*2)][i]='$';  
            array[i][center-(4+m*2)]='$';  
            array[i][center+(4+m*2)]='$';  
        }  
        }  
        for(int m=0;m<n;m++){  
        for(int i=center-3-2*m;i<=center+3+2*m;i++){  
            array[center-(2+2*m)][i]='$';  
            array[center+(2+2*m)][i]='$';  
            array[i][center-(2+2*m)]='$';  
            array[i][center+(2+2*m)]='$';  
        }  
          
        array[center-(2+2*m)][center-(1+2*m)]='.';  
        array[center-(2+2*m)][center+(1+2*m)]='.';  
        array[center-(1+2*m)][center-(2+2*m)]='.';  
        array[center-(1+2*m)][center+(2+2*m)]='.';  
        array[center+(1+2*m)][center-(2+2*m)]='.';  
        array[center+(1+2*m)][center+(2+2*m)]='.';  
        array[center+(2+2*m)][center-(1+2*m)]='.';  
        array[center+(2+2*m)][center+(1+2*m)]='.';  
        }  
          
        for(int i=0;i<low;i++){  
            for(int j=0;j<row;j++){  
        System.out.print((char)array[i][j]);  
            }  
         System.out.println();  
        }  
    }  
  
}

View Code