分布式机器 linux创建文件 EasyCVR DHCP pointers jScrollPane vue架构 郑州网络 ajax里面可以嵌套ajax吗 git下载代码到本地命令 matlab中如何定义函数 手动安装fastboot驱动 python测试 python中的map函数 java接口 java语言基础教程 怎么配置java环境 java基础编程 java的方法 java获取ip地址 java中tostring方法 java生成文件 java安装与配置 java对象是什么 java网页 linux密码忘记 linux镜像安装 sql行转列 h370主板 dvwa安装教程 0x8002801c keytool下载 linux定时任务 VSPD tomcat修改端口 lol卡米尔 idea导出jar包 抖音代码 小度音箱app pr加速视频
当前位置: 首页 > 学习教程  > 编程语言

Java B组蓝桥杯第八届国赛:平方十位数

2020/11/4 15:01:06 文章标签:

标题:平方十位数 由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。 这其中也有很多恰好是平方数(是某个数的平方)。 比如:1026753849,就是其中最小的一个平方数。 请你找出其中最大的一个平方数是多少…

标题:平方十位数

由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。

比如:1026753849,就是其中最小的一个平方数。

请你找出其中最大的一个平方数是多少?

注意:你需要提交的是一个10位数字,不要填写任何多余内容。

简单的全排列,答案:9814072356

方法一:最容易想到,全排列一个个试,因为这个题目给的数量级相对较小,可以进行尝试。但敲这么多代码,比赛肯定浪费很长时间。

public class Main {
	String[] n={"0","1","2","3","4","5","6","7","8","9"};
	double max=Double.MIN_VALUE;
	String maxstr="";//保存结果最大字符串
	public Main() {
		Scanner sn = new Scanner(System.in);
		dfs(0);
		System.out.println(maxstr);
	}
    //全排列
	public void dfs(int x) {
		if(x==10) {
			String str=n[0]+n[1]+n[2]+n[3]+n[4]+n[5]+n[6]+n[7]+n[8]+n[9];
			double num=Double.parseDouble(str);//字符串转double
			if(istwo(num)&&num>max) {
				max=num;
				maxstr=str;
			}
		}
		for(int i=x;i<10;i++) {
			if(i!=x) exchange(x, i);
			dfs(x+1);
			if(i!=x) exchange(x, i);
		}
	}
	public void exchange(int a,int b) {
		String temp=n[a];
		n[a]=n[b];
		n[b]=temp;
	}
    //利用小数点后面是否大于0,来判断是否为整数平方根
	public boolean istwo(double num) {	
		return Math.sqrt(num)%1==0?true:false;	
	}

	public static void main(String[] args) {
		new Main();

	}
}

方法二:用平方根试,肯定会比方法一更好,先找出平方根的范围然后一个个试,于是有平方根范围为30000到100000,然后判断平方得到的数是不是0~9不重复组成,瞬间简单多了

public class Main {
	public static void main(String[] args) {
		new Main();
		String max="";
		for(int i=30000;i<100000;i++) {
			BigInteger b1=new BigInteger(i+"");
			b1=b1.multiply(b1);//得到i*i,普通long型会超出表示范围,转换的字符串不能用
			String str=b1.toString();
		    if(str.length()<10)continue;//只看长度为10的
            else if(str.length()>10)break;
		    boolean isresult=true;//该字符串结果是否能通过
		    for(int j=0;j<=9;j++) {
                //该字符串只要不包含0~9任意一个,就不能用
			    if(!str.contains(j+"")){
                    isresult=false;
                    break;
                }
		    }
		    if(isresult)max=str;//符合的话就暂存
		}
	    System.out.println(max);  //循环结束,最后这个就是我们想要的
	}
}

 


本文链接: http://www.dtmao.cc/news_show_350304.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?