0
点赞
收藏
分享

微信扫一扫

蓝桥杯第八届个人决赛:平分十位数

烟中雯城 2022-10-28 阅读 157


package eighthCompetition;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;

public class SquareNumber
{
/*
* 标题:平方十位数
*
* 由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。 这其中也有很多恰好是平方数(是某个数的平方)。
*
* 比如:1026753849,就是其中最小的一个平方数。
*
* 请你找出其中最大的一个平方数是多少?
*
* 注意:你需要提交的是一个10位数字,不要填写任何多余内容。
*
* 我的答案是:9814072356
*/

/*
* 方法一:这个十位数最大的是9876543210,这个数已经超过了int的最大值
* 所以我打算将数值改成double类型的数值,其中9876543210的平方根是
* 99380,1026753849的平方根是32043,所以我就从99381开始从后面向前计算
* 每一个数的平方如果是刚好由十个数字组成,则这个数就是最大的平方十位数
*/
@Test
public void test1()
{
System.out.println(Math.pow(9876543210.0, 0.5));
for(int i=99381;i>32043;i--)
{
double temp=i*1.0*i;
//存放每一个位置的数的集合,当这个集合的大小长度是10的时候,证明这个数是由
//0-9这十个数组成的
Set<Integer> my=new HashSet<Integer>();
for(double test=temp;test!=0;test/=10)
{
int index=(int)(test%10);
my.add(index);
}
if(my.size()==10)
{
System.out.println(i);
System.out.println(temp);
break;
}
else
{
my.clear();
}
}

}
/*
* 方法二:先将0-9这十个数进行全排列,然后将组合出来的数进行平分根处理,
* 因为这组合出来的数是double类型的,平方根出来的数也是double类型的数
* 这时的重点就是怎么判断平分根出来的数是不是整数,这时候就看平方根出来
* 的数在小数点后面的是不是0(这个方法可以复习一下全排列的写法)
*/
@Test
public void test2()
{
int[] a= {9,8,7,6,5,4,3,2,1,0};
permutation(a, 0);
}
//写一个对这十个数进行全排列的方法
//这个全排列也是符合这个题目的,因为先是从最大的慢慢到小的
public static void permutation(int[] a,int index)
{
if(index==a.length)
{
judge(a);
return;
}
for(int i=index;i<a.length;i++)
{
if(i!=index)
{
a[i]=a[i]^a[index];
a[index]=a[i]^a[index];
a[i]=a[i]^a[index];
}
permutation(a, index+1);
if(i!=index)
{
a[i]=a[i]^a[index];
a[index]=a[i]^a[index];
a[i]=a[i]^a[index];

}
}
}
//这个方法是对全排列的数进行判断是不是符合要求的数字
public static void judge(int[] a)
{
String str="";
for (int i = 0; i < a.length; i++)
{
str=str+a[i];
}
double number=Double.valueOf(str);
double last=Math.pow(number, 0.5);
String[] laststr=String.valueOf(last).split("\\.");
for (int i = 0,j=0; i < laststr[1].length()&&j<8; i++,j++)
{
if(laststr[1].charAt(i)!='0')
{
return;
}
}
System.out.println(Arrays.toString(a));
}
}


举报

相关推荐

0 条评论