第三界蓝桥杯软件大赛预赛(答案一)

这是我做的答案,有不准确的地方一定留言哦!

第一题

 黄金分割数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

代码:

import java.io.FileWriter;
import java.io.IOException;

public class Num1 {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
          double a=1,b=3;
          double c;
          while(!(a/b<=0.6180344&&a/b>=0.6180335)){
        	      c=a+b;     	  
        	      a=b;
        	      b=c;
          }
        System.out.print(a+"/"+b);  
        FileWriter fw=new FileWriter("E:\\寒假学习\\软件大赛\\2012Java本科\\1\\解答.txt");
        fw.write(String.valueOf((int)a)+"/"+String.valueOf((int)b));
        fw.flush();
        fw.close();
	}

}

第二题

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。

    等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”

    请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。

    如果有多个可能的答案,请列出所有答案,每个答案占一行。

    格式是:人数,人数,...

    例如,有一种可能是:20,5,4,2,0

代码:

import java.io.FileWriter;
import java.io.IOException;

public class Num2 {
    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        FileWriter fw=new FileWriter("E:\\寒假学习\\软件大赛\\2012Java本科\\2\\解答.txt");
        double num;
         for(int i=4;i<=20;i++){//设一共有i个人
            
             for(int a=1;a<i;a++){//第一轮后剩下a个人,这a个人一定在1和i之间
                
                 for(int b=1;b<a;b++){//第二轮后下b个人,这b个人一定在1和a之间
                    
                     for(int c=1;c<b;c++){//第三轮后剩下c个人,这c个人一定在1和b之间
                         num=1.0/i+1.0/a+1.0/b+1.0/c;
                          if(num==1){
                            System.out.println(i+","+a+","+b+","+c+",0");
                            fw.write(String.valueOf(i)+","+String.valueOf(a)+","+String.valueOf(b)+","+String.valueOf(c)+",0"+"\r\n");
                          }
                     }        
                }
            
             }
         }
         fw.flush();
         fw.close();    
         
    }

}

第三题

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

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

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

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

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

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

    那么64个呢?

代码:

import java.io.FileWriter;
import java.io.IOException;

public class Num3 {

    /**
     * @param args
     */
    static int count;
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
         HannuoTower(64,1,2,3);
         System.out.print(count);
         FileWriter fw=new FileWriter("E:\\寒假学习\\软件大赛\\2012Java本科\\3\\解答.txt");
         fw.write(String.valueOf(count));
         fw.flush();
         fw.close();
    }
   public static void HannuoTower(int i,int a,int b,int c){
       if(i==1)
       {
           count++;//直接从初始位置移动到目的地
       }
       else{
           HannuoTower(i-1,a,c,b);//先把前i-1个从初始位置移到缓冲位置
           count++;//再把第i个从初始位置移动到目的地
           HannuoTower(i-1,b,a,c);//最后把前i-1个从缓冲位置移动到目的地
       }   
   }
   }


第四题:

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

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

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

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

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

    你的任务是算出所有可能情况。每个答案占一行。

import java.io.FileWriter;
import java.io.IOException;

public class Num4 {

    /**
     * @param args
     * @throws IOException
     */
    
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        FileWriter fw=new FileWriter("E:\\寒假学习\\软件大赛\\2012Java本科\\4\\解答.txt");
        for(int x1=0;x1<2;x1++)
            for(int x2=0;x2<2;x2++)
                for(int x3=0;x3<2;x3++)
                    for(int x4=0;x4<2;x4++)
                        for(int x5=0;x5<2;x5++)
                            for(int x6=0;x6<2;x6++)
                                for(int x7=0;x7<2;x7++)
                                    for(int x8=0;x8<2;x8++)
                                        for(int x9=0;x9<2;x9++)
                                            for(int x10=0;x10<2;x10++){
                                                int num=1;int scores=10;
                                                int arr[]={x1,x2,x3,x4,x5,x6,x7,x8,x9,x10};
                            while(num<=10)    {
                                if(arr[num-1]==0)
                                        scores-=num;        
                                else
                                        scores=scores*2;
                                num++;                                            
                                    }
                             if(scores==100)
                                for(int i=0;i<10;i++)
                                {
                                    fw.write(String.valueOf(arr[i]));
                                    if(i==9)fw.write("\r\n");
                                }//end for
                        }//end for
        fw.flush();
        fw.close();
    }

}
 

感觉好多地方还有待优化,效率上低一点!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值