黄金队列,汉诺塔,奇怪的比赛,第一个数字,割圆,最大数,矩形的交集和并集,趣味算式(第三届蓝桥杯Java本科预赛试题)

来源:互联网 发布:淘宝网包包女包 编辑:程序博客网 时间:2024/05/06 12:34


/*黄金队列求鲁卡斯队列
 *
    黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处,墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子....

    黄金分割数是个无理数,也就是无法表示为两个整数的比值。0.618只是它的近似值,其真值可以通过对5开方减去1再除以2来获得,我们取它的一个较精确的近似值:0.618034

    有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊!

    1 3 4 7 11 18 29 47 .... 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。

    如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 ... 会发现它越来越接近于黄金分割数!

    你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与0.618034一致的精度。

    请写出该比值。格式是:分子/分母。比如:29/47

    答案写在“解答.txt”中,不要写在这里!


3571/5778*/
public class HJDuiLie {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        double a[]=new double[100];
        a[0]=1;
        a[1]=3;
        for(int i =2;i<100;i++)
        {
            a[i]=a[i-1]+a[i-2];
            if(Math.abs(a[i-1]/a[i]-0.618034)<1e-7)
            {
                System.out.println(a[i-1]+"/"+a[i]);
                break;
            }
        }
    }

}



/*汉诺塔问题
 *
    汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
    大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上(可以借助第三根柱子做缓冲)。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

    如图【1.jpg】


是现代“山寨”版的该玩具。64个圆盘太多了,所以减为7个,金刚石和黄金都以木头代替了......但道理是相同的。

    据说完成大梵天的命令需要太多的移动次数,以至被认为完成之时就是世界末日!

    你的任务是精确计算出到底需要移动多少次。

    很明显,如果只有2个圆盘,需要移动3次。

    圆盘数为3,则需要移动7次。

    那么64个呢?
    
 * */

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


public class HanNuoTa {

    private static int step=0;
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        char a='a';
        char b='b';
        char c='c';
        f(n,a,b,c);
        /*BigInteger[] s=new BigInteger[64];
        s[1]=new BigInteger("1");
        for(int i=2;i<=63;i++)
        {
            s[i]=(s[i-1].multiply(new BigInteger("2"))).add(new BigInteger("1"));
        }
        System.out.println(s[63]);*/
        System.out.println(step);
    }
    
    public static void f(int n,char a,char b,char c)
    {
        if(n==1)
        {
            step++;
        }
        else
        {
            f(n-1,a,c,b);
            step++;
            f(n-1,b,a,c);    
        }
    }
}


/*奇怪的比赛
 *  某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

    每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

    每位选手都有一个起步的分数为10分。

    某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

    如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。

    你的任务是算出所有可能情况。每个答案占一行。
*/
public class StrangeScore {

    private static int n=10;//题的总数
    private static int[] temp=new int[11];//记录题是否答对,0代表答错,1代表答对
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        f(10,1);
    }

    public static void f(int sum,int cur)
    {
        
        if(sum==100&&cur==11)//执行成功
        {
            for(int i=1;i<=10;i++)
            {
                System.out.print(temp[i]);
            }
            System.out.println();
            return;
        }
        if(cur>=11||sum<0)//错误情况
        {
            return;
        }
        
        temp[cur]=1;
        sum*=2;
        f(sum,cur+1);
        sum/=2;
        temp[cur]=0;
        sum-=cur;
        f(sum,cur+1);
        sum+=cur;
    }
}


/*第一个数字
以下的静态方法实现了:把串s中第一个出现的数字的值返回。
如果找不到数字,返回-1

例如:
s = "abc24us43"  则返回2
s = "82445adb5"  则返回8
s = "ab"   则返回-1    
 * */
public class GetFirstNum {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s="abc24us43";
        System.out.println(getFirstNum(s));
        
    }

    public static int getFirstNum(String s)
    {
        if(s==null || s.length()==0) return -1;
        
        char c = s.charAt(0);
        if(c>='0' && c<='9') return c-'0';
        
        return getFirstNum(s.substring(1, s.length()));
    }
}
割圆:

/*  南北朝时,我国数学家祖冲之首先把圆周率值计算到小数点后六位,比欧洲早了1100年!他采用的是称为“割圆法”的算法,实际上已经蕴含着现代微积分的思想。

    如图【1.jpg】所示,圆的内接正六边形周长与圆的周长近似。多边形的边越多,接近的越好!我们从正六边形开始割圆吧。



    如图【2.jpg】所示,从圆心做弦的垂线,可把6边形分割为12边形。该12边形的边长a'的计算方法很容易利用勾股定理给出。之后,再分割为正24边形,....如此循环会越来越接近圆周。



    之所以从正六边开始,是因为此时边长与半径相等,便于计算。取半径值为1,开始割圆吧!

    以下代码描述了割圆过程。
    
    程序先输出了标准圆周率值,紧接着输出了不断分割过程中多边形边数和所对应的圆周率逼近值。
 * */
public class GeYuan {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        System.out.println("标准 " + Math.PI);
        
        double a = 1;
        int n = 6;
        
        for(int i=0; i<10; i++)
        {
            double b = Math.sqrt(1-(a/2)*(a/2));
            a = Math.sqrt((1-b)*(1-b) + (a/2)*(a/2));
            
            n = n*2;
            
            System.out.println(n + "  " + a*n/2);
        }
    }

}

package lilu.shuxue;

/*最大数
    [12,127,85,66,27,34,15,344,156,344,29,47,....]  

    这是某设备测量到的工程数据。

    因工程要求,需要找出最大的5个值。

    一般的想法是对它排序,输出前5个。但当数据较多时,这样做很浪费时间。因为对输出数据以外
    的数据进行排序并非工程要求,即便是要输出的5个数字,也并不要求按大小顺序,只要找到5个
    就可以。

    以下的代码采用了另外的思路。考虑如果手里已经抓着5个最大数,再来一个数据怎么办呢?
    让它和手里的数据比,如果比哪个大,就抢占它的座位,让那个被挤出来的再自己找位子,...
 * */

import java.awt.List;
import java.util.Arrays;
import java.util.Vector;
public class FiveBigNum {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<Integer> lst = new Vector<Integer>();
        lst.addAll(Arrays.asList(12,127,85,66,27,34,15,344,156,344,29,47));        
        System.out.println(max5(lst));
    }
    
    public static List<Integer> max5(List<Integer> lst)
    {
        if(lst.size()<=5) return lst;
        
        int a =lst.remove(lst.size()-1);  // 填空
        List<Integer> b = max5(lst);
        
        for(int i=0; i<b.size(); i++)
        {
            int t = b.get(i);
            if(a>t)
            {
                b.set(i,a);  // 填空
                a = t;  
            }
        }
        
        return b;
    }

}



/*矩形的交集和并集
 *
    在编写图形界面软件的时候,经常会遇到处理两个矩形的关系。

    如图【1.jpg】所示,矩形的交集指的是:两个矩形重叠区的矩形,当然也可能不存在


    (参看【2.jpg】)。两个矩形的并集指的是:能包含这两个矩形的最小矩形,它一定是存在的。



    本题目的要求就是:由用户输入两个矩形的坐标,程序输出它们的交集和并集矩形。

    矩形坐标的输入格式是输入两个对角点坐标,注意,不保证是哪个对角,也不保证顺序(你可以体会一下,在桌面上拖动鼠标拉矩形,4个方向都可以的)。

    输入数据格式:
x1,y1,x2,y2
x1,y1,x2,y2
    
    数据共两行,每行表示一个矩形。每行是两个点的坐标。x坐标在左,y坐标在右。坐标系统是:屏幕左上角为(0,0),x坐标水平向右增大;y坐标垂直向下增大。

    要求程序输出格式:
x1,y1,长度,高度
x1,y1,长度,高度

    也是两行数据,分别表示交集和并集。如果交集不存在,则输出“不存在”

    前边两项是左上角的坐标。后边是矩形的长度和高度。

    例如,用户输入:
100,220,300,100    
150,150,300,300

    则程序输出:
150,150,150,70
100,100,200,200    

    例如,用户输入:
10,10,20,20
30,30,40,40

    则程序输出:
不存在
10,10,30,30

 * */


import java.util.Scanner;


public class JuZhenJB {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner sc=new Scanner(System.in);
        //得到输入\
        int x1,y1,x2,y2,x3,y3,x4,y4;
        String s=sc.nextLine();
        s=s.trim()+",";
        String[] st=new String[4];
        int j=0,k=0;
        for(int i=0;i<s.length();i++)
        {
            char c=s.charAt(i);
            if(c==',')
            {
                st[k++]=s.substring(j,i);
                j=i+1;
            }
        }
        
        x1=Integer.parseInt(st[0]);
        y1=Integer.parseInt(st[1]);
        x2=Integer.parseInt(st[2]);
        y2=Integer.parseInt(st[3]);
       // System.out.println(x1+" "+y1+" "+x2+" "+y2);
        s=sc.nextLine();
        s=s.trim()+",";
        j=0;
        k=0;
        for(int i=0;i<s.length();i++)
        {
            char c=s.charAt(i);
            if(c==',')
            {
                st[k++]=s.substring(j,i);
                j=i+1;
            }
        }
        
        x3=Integer.parseInt(st[0]);
        y3=Integer.parseInt(st[1]);
        x4=Integer.parseInt(st[2]);
        y4=Integer.parseInt(st[3]);
        //System.out.println(x3+" "+y3+" "+x4+" "+y4);
        /*int x1=sc.nextInt();
        int y1=sc.nextInt();
        int x2=sc.nextInt();
        int y2=sc.nextInt();
        int x3=sc.nextInt();
        int y3=sc.nextInt();
        int x4=sc.nextInt();
        int y4=sc.nextInt();*/
        if(x1>x2)//一直保证x1 小于x2;
        {
            int temp=x1;
            x1=x2;
            x2=temp;
        }
        if(y1>y2)//保证y1小于y2
        {
            int temp=y1;
            y1=y2;
            y2=temp;
        }
        if(x3>x4)//一直保证x3 小于x4;
        {
            int temp=x3;
            x3=x4;
            x4=temp;
        }
        if(y3>y4)//保证y3小于4
        {
            int temp=y3;
            y3=y4;
            y4=temp;
        }
        //开始求解
        int jstartx=-1,jstarty=-1,jendx=-1,jendy=-1;//交集的起始点和结束点
        int bstartx=-1,bstarty=-1,bendx=-1,bendy=-1;//并集的起始点和结束点
        //求得交集的起始点和丙级的起始点的x坐标
        if(x3>=x1&&x3<=x2)
        {
            jstartx=x3;
            bstartx=x1;
            if(x4<=x2)
            {
                jendx=x4;
                bendx=x2;
            }
            else
            {
                jendx=x2;
                bendx=x4;
            }
        }
        else if(x3<x1)
        {
            if(x4<x1)
            {
                //System.out.println("不存在!");
                bstartx=x3;
                bendx=x2;
            }
            else if(x4>=x1&&x4<=x2)
            {
                jstartx=x1;
                jendx=x4;
                bstartx=x3;
                bendx=x2;
            }
            else if(x4>x2)
            {
                jstartx=x1;
                jendx=x2;
                bstartx=x3;
                bendx=x4;
            }
        }
        else if(x3>x2)
        {
            //System.out.println("不存在!");
            bstartx=x1;
            bendx=x4;
        }
        //求得交集的起始点和丙级的起始点的y坐标
        if(y3>=y1&&y3<=y2)
        {
            jstarty=x3;
            bstarty=x1;
            if(y4<=y2)
            {
                jendy=y4;
                bendy=y2;
            }
            else
            {
                jendy=y2;
                bendy=y4;
            }
            
        }
        else if(y3<y1)
        {
            if(y4<y1)
            {
                //System.out.println("不存在!");
                bstarty=y3;
                bendy=y2;
            }
            else if(y4>=y1&&y4<=y2)
            {
                jstarty=y1;
                jendy=y4;
                bstarty=y3;
                bendy=y2;
            }
            else if(y4>y2)
            {
                jstarty=y1;
                jendy=y2;
                bstarty=y3;
                bendy=y4;
            }
        }
        else if(y3>y2)
        {
            //System.out.println("不存在!");
            bstarty=y1;
            bendy=y4;
        }
        
        //输出
        int jc=jendx-jstartx;
        int jg=jendy-jstarty;
        int bc=bendx-bstarty;
        int bg=bendy-bstarty;
        if(jstartx==-1)
        {
            System.out.println("不存在");
        }
        else
        {
            System.out.println(jstartx+","+jstarty+","+jc+","+jg);
        }
        System.out.println(bstartx+","+bstarty+","+bc+","+bg);
    }

}


/*趣味算式

匪警请拨110,即使手机欠费也可拨通!

    为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性
    地进行体力训练和智力训练!

    某批警察叔叔正在进行智力训练:

    1 2 3 4 5 6 7 8 9 = 110;

    请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它
    符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填
    法;123+4+5+67-89 是另一个可能的答案。

    请你利用计算机的优势,帮助警察叔叔快速找到所有答案。

    每个答案占一行。形如:

12+34+56+7-8+9
123+4+5+67-89
......

    已知的两个答案可以输出,但不计分。
    
    各个答案的前后顺序不重要。

 * */


public class QuWeiSuanShi {

    private static int[] a=new int[10];//保存分割的位置
    private static char[] c=new char[10];//保存数字之间的运算符号
    private static int[] sum=new int [10];//保存分割后的数
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        for(int i=2;i<9;i++)
        {
            fenGe(i,0,1);
        }
    }
    //n数字之间放隔板的个数,cur当前放到第几个隔板,start该次隔板可以开始的位置
    public static void fenGe(int n,int cur,int start)
    {
        if(cur==n)
        {
            //数分割完毕
            a[cur]=9;
            /*for(int i=0;i<=n;i++)
            {
                System.out.print(a[i]+" ");
            }
            System.out.println();*/
            panDuan(n);
            return;
        }
        if(start>=9)//没有地方可以放隔板了
        {
            return;
        }
        for(int i=start;i<9;i++)
        {
            a[cur]=i;
            fenGe(n,cur+1,i+1);
        }
        
    }
    
    //得到分割后的数 n代表范放了几个隔板
    public static void panDuan(int n)
    {
        int j=1;
        for(int i=0;i<=n;i++)
        {
            int sum1=0;
            for(;j<=a[i];j++)
            {
                sum1=sum1*10+j;
            }
            sum[i]=sum1;
        }
        /*for(int i=0;i<=n;i++)
        {
            System.out.print(sum[i]+" ");
        }
        System.out.println();*/
        int sum2=sum[0];
        zuHe(n+1, sum2,1);
    }
    //n 几个数 sum 几个数通过加减的结果 cur当前进行到第几个数
    public static void zuHe(int n,int sum2,int cur)
    {
        if(cur==n)
        {
            if(sum2==110)
            {
                //成功。输出结果
                for(int i=0;i<n-1;i++)
                {
                    System.out.print(sum[i]+""+c[i+1]);
                }
                System.out.println(sum[n-1]);
            }
            return;
        }
        sum2+=sum[cur];
        c[cur]='+';
        zuHe(n,sum2,cur+1);
        sum2-=sum[cur];
        
        
        sum2-=sum[cur];
        c[cur]='-';
        zuHe(n,sum2,cur+1);
        sum2+=sum[cur];
    }

}




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 尚赫辟谷期间吃了东西怎么办 肾结石掉在输尿管里面好痛怎么办 寄的快递快递单号找不到了怎么办 手机停机但是快递是这个号码怎么办 百世通快递卡在一个地方没动怎么办 电信无限流量20g用完了怎么办 至尊宝qq密保手机被更换怎么办 至尊宝账户密保手机被改怎么办 照片放到私密相册找不到了怎么办 出口报关报错境内货源地怎么办? 微信提现未到账交易记录删了怎么办 支付宝忘记密码就可以登陆怎么办 电脑上登陆QQ忘记密码了怎么办? 电脑被管理员限制登录微信了怎么办 快手绑定的手机号丢了登不上怎么办 快手绑定的手机号丢了登不了怎么办 苹果id有手机号不知道密码怎么办 微信号不是手机号不知道密码怎么办 手机发短信说程序发生错误怎么办 派派游戏崇物等级低怎么办 轻微事故没有报警后面有问题怎么办 苹果6sp手机接电话声音小怎么办 用手机号办的移动宽带到期了怎么办 联通忘了宽带的用户名和密码怎么办 宽带联通移机附近没有端口怎么办 电信卡怎么改服务密码忘记了怎么办 路由器重置宽带账号密码忘了怎么办 重置路由器后不知道宽带密码怎么办 欠费后重新缴费宽带连接不了怎么办 华硕路由器忘记账号密码忘了怎么办 光纤猫光信号闪红灯不能上网怎么办 被传销洗了脑的人怎么办 辞职了评职称年度考核表怎么办 我是饭店饭店欠供货商的钱多怎么办 mac电脑ps卡住了点不了怎么办 高考自愿民族栏要改为民族怎么办 法院拆消裁定后再审有错怎么办 重定向语句前面有文件路劲怎么办 您上传的图片大小超过3M怎么办 两个人打架被拍视频上传了怎么办 小米手机打开后一直出现英文怎么办