| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3959 人关注过本帖, 1 人收藏
标题:2014蓝桥杯java本科B组第十题
只看楼主 加入收藏
w823352417
Rank: 3Rank: 3
来 自:甘肃兰州
等 级:论坛游侠
威 望:1
帖 子:43
专家分:113
注 册:2012-10-4
结帖率:100%
收藏(1)
 问题点数:0 回复次数:2 
2014蓝桥杯java本科B组第十题
程序代码:
import java.math.BigInteger;
import java.util.Scanner;
/*

 * 矩阵翻硬币

    小明先把硬币摆成了一个 n 行 m 列的矩阵。

    随后,小明对每一个硬币分别进行一次 Q 操作。

    对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。

    其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。

    当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。

    小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。

    聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。


 * */

public class Ten {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        BigInteger m ,n,count = BigInteger.ONE;
//        m = input.nextBigInteger();
//        n = input.nextBigInteger();
        
        m = getNumber(1000);
        n = getNumber(1000);

        long start = System.currentTimeMillis();
        
        count = new BigInteger(sqrt(n.toString())).multiply(new BigInteger(sqrt(m.toString())));    
        long end = System.currentTimeMillis();
        System.out.println("验证10^1000:历时:"+(end-start)+"ms");
        System.out.println(count);
        

    }
    public static BigInteger getNumber(int len){
        StringBuffer num = new StringBuffer("1");
        for (int i = 0; i < len; i++) {
            num.append("0");
        }
        return new BigInteger(num.toString());
    }
    public static String sqrt(String num)
    {
        BigInteger b=new BigInteger(num);
        //不用多解释了吧
        if((BigInteger.ZERO)<0)
            return "不是正数";
        String sqrt="0"; //开方结果
        String pre="0"; //开方过程中需要计算的被减数
        BigInteger trynum; //试商,开放过程中需要计算的减数
        BigInteger flag;  //试商,得到满足要求减数的之后一个数
        BigInteger twenty=new BigInteger("20"); //就是20
        BigInteger dividend; ///开方过程中需要计算的被减数
        int len=num.length(); //数字的长度
        if(len%2==0) //长度为偶数
        {
            for(int i=0;i<len/2;++i) //得到的平方根一定是len/2位
            {
                dividend=new BigInteger(pre+num.substring(2*i,2*i+2));
                for(int j=0;j<=9;++j)
                {
                    trynum=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger(j+"")).add(new BigInteger(j+"").multiply(new BigInteger(j+"")));
                    flag=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger((j+1)+"")).add(new BigInteger((j+1)+"").multiply(new BigInteger((j+1)+"")));;
                    //满足要求的j使得试商与计算中的被减数之差为最小正数
                    if(trynum.subtract(dividend).compareTo(BigInteger.ZERO)<=0
                            &&flag.subtract(dividend).compareTo(BigInteger.ZERO)>0)
                    {
                        sqrt+=j;  //结果加上得到的j
                        pre=dividend.subtract(trynum).toString(); //更新开方过程中需要计算的被减数
                        break;
                    }
                }
            }
        }

        else //长度为奇数
        {
            for(int i=0;i<len/2+1;++i) //得到的平方根一定是len/2+1位
            {
                if(i==0) //奇数位被开方数首位特殊处理
                    dividend=new BigInteger(num.charAt(0)+"");
                else
                    dividend=new BigInteger(pre+num.substring(2*i-1,2*i+1));
                for(int j=0;j<=9;++j)
                {
                    trynum=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger(j+"")).add(new BigInteger(j+"").multiply(new BigInteger(j+"")));
                    flag=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger((j+1)+"")).add(new BigInteger((j+1)+"").multiply(new BigInteger((j+1)+"")));;
                    //满足要求的j使得试商与计算中的被减数之差为最小正数
                    if(trynum.subtract(dividend).compareTo(BigInteger.ZERO)<=0
                            &&flag.subtract(dividend).compareTo(BigInteger.ZERO)>0)
                    {
                        sqrt+=j; //结果加上得到的j
                        pre=dividend.subtract(trynum).toString(); //更新开方过程中需要计算的被减数
                        break;
                    }
                }
            }
        }
        return sqrt.substring(1);
    }
}
Ten.rar (1.85 KB)
搜索更多相关主题的帖子: 正整数 java 2014 本科 奇迹 
2014-03-26 16:19
王玉辉
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-4-22
收藏
得分:0 
能否讲解一下你的解题思路,这题我在比赛时没做出来,现在还是一头雾水,求指教
2014-04-22 14:56
鸥翔鱼游
Rank: 5Rank: 5
等 级:职业侠客
帖 子:182
专家分:323
注 册:2014-4-19
收藏
得分:0 
观摩技术性回复
2014-04-24 14:57
快速回复:2014蓝桥杯java本科B组第十题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036854 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved