• ACM 韩信点兵 、n的另一种阶乘、6174的问题


    3、6174问题

    描述

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

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

    import java.util.Arrays;

    public class ACM6174 {

    public static void main(String[] args) {
    int x=1234;
    int count=0;
    while(x!=6174){
    x=jianfa(x);
    count++;
    }
    System.out.println(count+1);
    }

    public static int jianfa(int a){
    int b=congdadaoxiao(a)-congxiaodaoda(a);
    return b;
    }
    public static int congdadaoxiao(int a){
    String str=a+"";
    int[] in=new int[str.length()];
    for(int i=0;i<str.length();i++){
    char ch=str.charAt(i);
    in[i]=Integer.parseInt(ch+"");
    }
    Arrays.sort(in);
    String st="";
    for(int i=0;i<in.length;i++){
    st=st+in[i];
    }
    String s="";
    for(int i=st.length()-1;i>=0;i--){
    char ch=st.charAt(i);
    s=s+ch;
    }
    int b=Integer.parseInt(s);
    return b;
    }
    public static int congxiaodaoda(int a){
    String str=a+"";
    int[] in=new int[str.length()];
    for(int i=0;i<str.length();i++){
    char ch=str.charAt(i);
    in[i]=Integer.parseInt(ch+"");
    }
    Arrays.sort(in);
    String st="";
    for(int i=0;i<in.length;i++){
    st=st+in[i];
    }
    int b=Integer.parseInt(st);
    return b;
    }
    }

    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!!的正确值

    public class Demo1 {

    public static void main(String[] args) {
    int n=5;
    System.out.println(method(n));

    }
    public static int method(int n){
    int sum=0;
    for(int i=1;i<=n;i++){
    sum+=method1(i);
    }
    return sum;
    }
    public static int method1(int n){
    int sum=1;
    for(int i=1;i<=n;i++){
    if(i%2==1){
    sum*=i;
    }
    }
    return sum;
    }
    }

    1、韩信点兵

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

    解法一:

       method(2,3,4);

    public static void method(int a,int b,int c){
    for(int i=10;i<=100;i++){
    if(i%3==a&&i%5==b&&i%7==c){
    System.out.println(i);
    }
    }
    }

    扩展二:

    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道100之间的整数
    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";
    }
    }

  • 相关阅读:
    线程池的扩展 beforeExecute() afterExecute() terminaerd()
    信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport
    ReenTrantLock可重入锁 和synchronized 内部所锁的
    integer.valueof和integer.parseint
    守护线程
    notify wait sleep join yield yield
    Thread.stop()不要随意调用
    iterate使用了parallel() 反而消耗了更多的时间
    Stream 分支/合并 框架的实际例子
    区分Collection、Collector和collect Collectors类的静态工厂方法
  • 原文地址:https://www.cnblogs.com/w-xibao/p/7977721.html
Copyright © 2020-2023  润新知