- 代码设计(满分5分)
625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?
请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。
输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:625
枚举 暴力求解
public class Main {
public static void main(String[] args) {
int temp=0;
for(int i=100;i<=999;i++){
temp=i*i;
temp %=1000;
if(temp==i) System.out.println(i);
}
}
}
376
625
- 代码设计(满分11分)
考虑方程式:a^3 + b^3 = c^3 + d^3
其中:“^”表示乘方。a、b、c、d是互不相同的小于30的正整数.这个方程有很多解。比如:a = 1,b=12,c=9,d=10 就是一个解。因为:1的立方加12的立方等于1729,而9的立方加10的立方也等于1729.当然,a=12,b=1,c=9,d=10 显然也是解。
如果不计abcd交换次序的情况,这算同一个解。你的任务是:找到所有小于30的不同的正整数解。把a b c d按从小到大排列,用逗号分隔,每个解占用1行。比如,刚才的解输出为:1,9,10,12
不同解间的顺序可以不考虑。
暴力枚举
public class Main {
public static void main(String[] args) {
int[] arr=new int[31];//0-30
for(int i=1;i<=30;i++){
arr[i]=i*i*i;//先进行三次方运算,之后重复利用 int 四个字节,-2147483648~2147483647
}
for(int a=1;a<=27;a++){
for(int b=a+1;b<=28;b++){
for(int c=b+1;c<=29;c++){
for(int d=c+1;d<=30;d++){
if((arr[a]+arr[d])==(arr[c]+arr[b]))//观察大小次序
System.out.println(a+","+b+","+c+","+d);
}
}
}
}
//System.out.println(30*30*30);
}
}
1,9,10,12
2,9,15,16
2,18,20,24
10,19,24,27
- 代码设计(满分18分)
整数的分划问题。
如,对于正整数n=6,可以分划为:
6
5+1
4+2, 4+1+1
3+3, 3+2+1, 3+1+1+1
2+2+2, 2+2+1+1, 2+1+1+1+1
1+1+1+1+1+1+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。用户从键盘输入 n (范围1~10)程序输出该整数的所有划分。
import java.math.BigInteger;
import java.util.Arrays;
public class Main {
private static int num=21;
private static BigInteger[] table=new BigInteger[10];
private static BigInteger[] store=new BigInteger[1000];
private static int nTotal=0;
private static int[] nums;
public static void main(String[] args) {
for(int i=0;i<10;i++)
table[i]=BigInteger.valueOf(i).pow(num);
nums=new int[num];
for(int j=0;j<10;j++)
find(nums,0,j);
if(0==nTotal)
System.out.println("没有符合条件的数!");
else{
Arrays.sort(store,0,nTotal);
for(int i=0;i<nTotal;i++)
System.out.println(store[i]);
}
}
public static void find(int[] nums,int level,int num){
nums[level]=num;
if(level==nums.length-1){
//当level为20时,表示nums数组下标为20即21位数字满后求和
BigInteger big=sum(nums);
//将得到的21位数和转化为整形数组,并返回
int[] temp=getArray(big);
if(check(nums,temp));{
//测试是否是21位,并将数组复制给nums数组
store[nTotal]=big;
nTotal++;
}
return ;
}
for(int i=num;i<10;i++){
//递归查找21位数字符合条件的数
find(nums,level+1,i);
}
}
public static boolean check(int[] a1,int[] a2){
if(a1.length!=a2.length)
return false;
Arrays.sort(a2);
return Arrays.equals(a1,a2);
}
//得到nums数组的数作为table下标的数的和,并返回;
public static BigInteger sum(int[] nums){
BigInteger sum=BigInteger.ZERO;
for(int i=0;i<nums.length;i++)
sum=sum.add(table[nums[i]]);
return sum;
}
//将BingInteger转化为int[]类型数据
public static int[] getArray(BigInteger big){
String s=String.valueOf(big);
char[] ch=s.toCharArray();
int[] res=new int[ch.length];
for(int i=0;i<ch.length;i++)
res[i]=ch[i]-'0';
return res;
}
}