(本试题来源于网上,下载时没有答案,基本都是自己做的答案,部分答案来源网上,才初学浅,有不足的地方,还请及时告知!网名:叫我雷锋 QQ1345523590)
(试题难度比较大,在做的过程中不要忙于看答案的思想,衣服要自己琢磨透题目的是啥意思,如果你没看答案做出来了,要经过多次的验证,再去比较答案,看是否一样。)
注意:
本套模拟题主要模拟命题形式与考核范围。真实竞赛题的数量、难度可能与此套模拟题有差异。
说明:
本试卷包含两种题型:“代码填空”与“程序设计”。
填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不多于一条语句(即不能出现分号)。
编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。
在A B C D E F 六人中随机抽取3人中奖,要求中奖人不能重复。请完善以下代码:
public class MyTest
{
public static void main(String[] args)
{
Vector a = new Vector();
for(char i='A'; i<='F'; i++) a.add("" + i);
for(int k=0; k<3; k++)
{
intd = ____________________________;答案:(int) (Math.random()*(6-k))
System.out.println(a.remove(d));
}
}
}
不同进制的数值间的转换是软件开发中很可能会遇到的常规问题。下面的代码演示了如何把键盘输入的3进制数字转换为十进制。试完善之。
BufferedReader br = new BufferedReader(newInputStreamReader(System.in));
String s = br.readLine();
int n = 0;
for(int i=0; i<s.length(); i++)
{
char c = s.charAt(i);
if(c<'0' || c > '2') throw newRuntimeException("Format error");
n =____________________;
答案:n =(int)(n+((int)c-48)*(Math.pow(3, s.length()-i-1)));
}
System.out.println(n);
有如下程序,完成的功能为:找出数组中的最大元素。请填写程序的中空白,使程序运行正确。
public class test
{
public static void main(String[] args) {
int array[]={0,34,67,90,21,-9,98,1000,-78};
System.out.println(new test().findMax (array, 0));
}
public int findMax(int array[],int index)
{
if(array==null || array.length==0)
{
return 0;
}
int max=array[0];
if(index<array.length-1)
{
max=_________; 答案:findMax(array,index+1);
}
if(max<array[index]) max= array[index];
return max;
}
}
电视台开宝箱节目:打进电话的人可以开启一个宝箱。箱子中有一件礼品。礼品是iphone的机率为1/12;是mp3 的机率为1/5;是洗衣粉的机率为1/2;剩余是KFC优惠券。
每次打进电话,宝箱会重置。
以下程序模拟了该抽奖过程。请填写缺失的部分。
public static void main(String[] args)
{
int i = (int) Math.random() * _____________;
本空题目明显有问题:应该为:int i = (int) (Math.random()*60);
if (i < 5) {
System.out.println("恭喜中了:iphone手机");
}else if (i < 17) {
System.out.println("恭喜中了:mp3");
} else if (i < 47) {
System.out.println("恭喜中了:洗衣粉");
} else {
System.out.println("恭喜中了:KFC优惠券");
}
}
1.5. 代码填空(满分6分)
下列代码求出一个二进制串中连续的1或连续的0出现的最大次数。请填缺失代码。
例如:s = “101100111100011”
则返回:4
又例如:s=”0111100000”
则返回:5
publicstatic int getMaxContinuity(String s)
{
int max_1 = 0;
int max_0 = 0;
int n_1 = 0; // 当前1连续的次数
int n_0 = 0; // 当前0连续的次数
for(int i=0; i<s.length(); i++)
{
if(s.charAt(i)=='0')
{
n_0++;
_______;答案max_1=0;
}
else
{
n_1++;
_______;答案:max_0=0;
}
if(n_1 > max_1) max_1 = n_1;
if(n_0 > max_0) max_0 = n_0;
}
return max_1>max_0? max_1 : max_0);
}
下列代码把16进制表示的串转换为3进制表示的串。试完善之。
例如:x=“5”
则返回:“12”
又例如:x=”F”
则返回:“120”
private static int getRealValue(char x)
{
if(x>='0' && x<='9') return x-'0';
if(x>='a' && x<='f') return x-'a'+10;
if(x>='A' && x<='F') return x-'A'+10;
return 0;
}
public static String jin_zhi_16_3(String x)
{
int n = 0; // 累加真值
for(int i=0; i<x.length(); i++)
{
n = _________ +getRealValue(x.charAt(i)); // 填空答案:n*16
}
String t = "";
for(;;)
{
if(n==0) break;
t = (n % 3) + t;
_____________; // 填空答案:n=n/3
}
returnt;
}
625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?
请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。
输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:
625
public class Ti7 {
public static void main(String[] args) {
// TODOAuto-generated method stub
for(int i=100;i<1000;i++){
if(i==Math.pow(i, 2)%1000){
System.out.println(i);
}
}
}
}
考虑方程式: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 bc d按从小到大排列,用逗号分隔,每个解占用1行。比如,刚才的解输出为:
1,9,10,12
不同解间的顺序可以不考虑。
packagebenke;
public class Ti8 {
/**
* 考虑方程式: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
不同解间的顺序可以不考虑。
a < c && c < d && m< b
1 910 12
2 915 16
2 1820 24
1019 24 27
*/
public static boolean fa(int a,int b,int c,int d){
if(Math.pow(a, 3)+Math.pow(b,3)==Math.pow(c, 3)+Math.pow(d, 3)){
return true;
}
return false;
}
public static int[] paixu(int a,int b,int c,int d){
int array[]={a,b,c,d};
for(int i=0;i<array.length;i++){
for(int j=i;j<array.length;j++){
if(array[i]>array[j]){
int temp;
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
return array;
}
public static void main(String[] args) {
// TODOAuto-generated method stub
for(int a=1;a<31;a++){
for(int b=a+1;b<31;b++){
for(int c=1;c<31;c++){
for(int d=c+1;d<31;d++){
//a < c && c < d && d< b
//&&a!=b &&a!=c&&a!=d && b!=c && b!=d&& c!=d
if(a<c &&fa(a,b,c,d)){
int aaa[]=paixu(a,b,c,d);
for(intaa:aaa){System.out.print(aa+", ");}
System.out.println();
}
}
}
}
}
}
}
整数的分划问题。
如,对于正整数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)
程序输出该整数的所有划分。
packagebenke;
importjava.io.IOException;
importjava.util.Scanner;
public class Ti9 {
/**
*/
static Stringss = "";
public static void main(String[] args)throws IOException {
Scanner in = new Scanner(System.in);
System.out.println("输入1~10的数:");
int a = in.nextInt();
String str = "";
for (int i = a; i > 0; i--) {
ss = "";
Create(i + str, i, (a - i));
System.out.println(ss.substring(0,ss.length() - 1));
}
}
// a:保存原来的字符,orign:分解后还需要分解的数。other:分解后的数还需0ther数相加才能等于原来的数
public static void Create(String a, int orig, int other) {
if (other == 0) {
ss += a + ",";
}
for (int i = other; i > 0; i--) {
if (i <= orig)//确保减一的数大于还需要分解的数
{
Create(a + "+" + i, i, other - i);
}
}
}
}
一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。
实际上,对N的每个取值,可能有多个数字满足条件。
程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。
packagebenke;
importjava.math.BigInteger;
importjava.util.Arrays;
class Narcissistic {
private static BigInteger[] table =new BigInteger[10];
public static void main(String[] args) {
long time = System.nanoTime();
find(21);
time = System.nanoTime() - time;
System.out.println(time / 1000000000.0 +"s");
}
public static void find(int n) {
for (int i = 0; i < 10; i++) {
table[i] = BigInteger.valueOf(i).pow(n);
}
int[] nums =new int[n];
int index = 0;
int num = 0;
while (true) {
if (index < nums.length && num < 10) {
nums[index] = num;
index++;
continue;
} else if (index >= nums.length) {
BigInteger big = sum(nums);
int[] temp =getArray(big);
if (check(nums,true, temp, false)) {
System.out.println(big);
}
} else if (index <= 0) {
break;
}
index--;
num = nums[index] + 1;
}
}
public static boolean check(int[] a1,boolean copy1, int[] a2,boolean copy2) {
if (a1.length != a2.length) {
return false;
}
if (copy1) {
a1 = a1.clone();
}
if (copy2) {
a2 = a2.clone();
}
Arrays.sort(a1);
Arrays.sort(a2);
return Arrays.equals(a1, a2);
}
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;
}
public static int[] getArray(BigInteger big) {
String s = String.valueOf(big);
int length = s.length();
int[] res =new int[length];
for (int i = 0; i < length; i++) {
res[i] = s.charAt(i) - '0';
}
return res;
}
}