简单题

  1. 代码设计(满分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


  1. 代码设计(满分11分)

考虑方程式:a^3 + b^3 = c^3 + d^3

其中:“^”表示乘方。abcd是互不相同的小于30的正整数.这个方程有很多解。比如:a = 1b=12c=9d=10 就是一个解。因为:1的立方加12的立方等于1729,而9的立方加10的立方也等于1729.当然,a=12b=1c=9d=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



  1. 代码设计(满分18分)

整数的分划问题。 

如,对于正整数n=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;

}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值