网站 建设初步,怎么从阿里巴巴做网站,网站维护报价表,天津网页制作培训第六届省赛#xff08;软件类#xff09;真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子
一、隔行变色
Excel表的格子很多#xff0c;为了避免把某行的数据和相邻行混淆#xff0c;可以采用隔行变色的…第六届省赛软件类真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子
一、隔行变色
Excel表的格子很多为了避免把某行的数据和相邻行混淆可以采用隔行变色的样式。小明设计的样式为第1行蓝色第2行白色第3行蓝色第4行白色....现在小明想知道从第21行到第50行一共包含了多少个蓝色的行。请你直接提交这个整数千万不要填写任何多余的内容。
答案15
public class Main {public static void main(String[] args) {int cnt 0;for (int i 21; i 50; i) {if (i%2 0) {cnt;}}System.out.println(cnt);}
}二、立方尾
有些数字的立方的末尾正好是该数字本身。比如1,4,5,6,9,24,25,....请你计算一下在10000以内的数字中指该数字并非它立方后的数值符合这个特征的正整数一共有多少个。请提交该整数不要填写任何多余的内容。
答案36解析特别注意存4000的三次方不能用int
public class Main {public static void main(String[] args) {int cnt 0;for (int i 1; i 10000; i) {String str1 (long) Math.pow(i,3) ;int l1 str1.length();int l2 String.valueOf(i).length();String str2 str1.substring(l1-l2);if (str2.equals(i)) {cnt;}}System.out.println(cnt);}
}三、无穷分数
无穷的分数有时会趋向于固定的数字。请计算【图1.jpg】所示的无穷分数要求四舍五入精确到小数点后5位小数位不足的补0。请填写该浮点数不能填写任何多余的内容。
答案0.58198
//无穷分数
public class Main {public static float f(int n) {if (n 100) {return n;}return n/(n f(n1));}public static void main(String[] args) {System.out.println(f(1));}
}四、循环节长度
两个整数做除法有时会产生循环小数其循环部分称为循环节。比如11/1360.846153846153..... 其循环节为[846153] 共有6位。下面的方法可以求出循环节的长度。请仔细阅读代码并填写划线部分缺少的代码。public static int f(int n, int m){n n % m; Vector v new Vector();for(;;){v.add(n);n * 10;n n % m;if(n0) return 0;if(v.indexOf(n)0) _________________________________ ; //填空}}注意只能填写缺少的部分不要重复抄写已有代码。不要填写任何多余的文字。
通过看每次计算的余数是否与之前相等来判断循环节长度的。因为余数一旦相等乘以十后除以除数也必然相等。答案v.size()-v.indexOf(n)五、格子中输出★
stringInGrid方法会在一个指定大小的格子中打印指定的字符串。要求字符串在水平、垂直两个方向上都居中。如果字符串太长就截断。如果不能恰好居中可以稍稍偏左或者偏上一点。下面的程序实现这个逻辑请填写划线部分缺少的代码。public static void stringInGrid(int width, int height, String s){if(s.length()width-2) s s.substring(0,width-2);System.out.print();for(int i0;iwidth-2;i) System.out.print(-);System.out.println();for(int k1; k(height-1)/2;k){System.out.print(|);for(int i0;iwidth-2;i) System.out.print( );System.out.println(|);}System.out.print(|);String ff _____; //填空System.out.print(String.format(ff,,s,));System.out.println(|);for(int k(height-1)/21; kheight-1; k){System.out.print(|);for(int i0;iwidth-2;i) System.out.print( );System.out.println(|);} System.out.print();for(int i0;iwidth-2;i) System.out.print(-);System.out.println(); }对于题目中数据应该输出如【图1.jpg】所示答案%(width-s.length()-2)/2s%s%((width-s.length()-2)/2)s
解析格式化输出问题六、奇妙的数字
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗请填写该数字不要填写任何多余的内容。答案69解析如何判断十个数都存在使用set判断长度
import java.util.HashSet;
import java.util.Set;public class Main {public static void main(String[] args) {int a;int b;Set set new HashSet();for (int i 20; i 100; i) {set.clear();a (int) Math.pow(i, 2);b (int) Math.pow(i, 3);while (a ! 0) {set.add(a%10);a / 10;}while (b ! 0) {set.add(b%10);b / 10;}if (set.size() 10) {System.out.println(i);}}}
}七、加法变乘法
我们都知道123 ... 49 1225现在要求你把其中两个不相邻的加号变成乘号使得结果为2015比如123...10*1112...27*2829...49 2015就是符合要求的答案。请你寻找另外一个可能的答案并把位置靠前的那个乘号左边的数字提交对于示例就是提交10。注意需要你提交的是一个整数不要填写任何多余的内容。答案16
public class Main {public static void main(String[] args) {for (int i 1; i 49; i) {for (int j 2; j 49; j) {if (i*(i1) j*(j1)-(2*i2*j2) 790) {System.out.println(i);}}}}
}八、移动距离
X星球居民小区的楼房全是一样的并且按矩阵样式排列。其楼房的编号为1,2,3...当排满一行时从下一行相邻的楼往反方向排号。比如当小区排号宽度为6时开始情形如下1 2 3 4 5 612 11 10 9 8 713 14 15 .....我们的问题是已知了两个楼号m和n需要求出它们之间的最短移动距离不能斜线方向移动输入为3个整数w m n空格分开都在1到10000范围内要求输出一个整数表示m n 两楼间最短移动距离。例如用户输入6 8 2则程序应该输出4再例如用户输入4 7 20则程序应该输出5资源约定峰值内存消耗含虚拟机 256MCPU消耗 1000ms请严格按要求输出不要画蛇添足地打印类似“请您输入...” 的多余内容。所有代码放在同一个源文件中调试通过后拷贝提交该源码。注意不要使用package语句。不要使用jdk1.7及以上版本的特性。注意主类的名字必须是Main否则按无效代码处理。解析代码上面注释部分是一开始用数组存储的代码其实根本不需要创建数组的只要找到两栋楼房的坐标即可这样可以轻松求出两栋楼房的距离。
import java.util.Scanner;public class Main {
// public static void main(String[] args) {
// Scanner input new Scanner(System.in);
// int n input.nextInt();
// int[][] arr new int[10002/n][n1];
// for (int i 1; i 10002/n; i) {
// for (int j 1; j n1; j) {
// if (i % 2 0) {
// arr[i][j] i * n - j 1;
// } else {
// arr[i][j] (i-1)*n j;
// }
// }
// }
// for (int i 1; i 10002/n; i) {
// for (int j 1; j n1; j) {
// System.out.print(arr[i][j] );
// }System.out.println();
// }
// }static int n;static int a,b;public static void main(String[] args) {Scanner in new Scanner(System.in);n in.nextInt();a in.nextInt();b in.nextInt();int x f1(a);int y f1(b);int e f2(x,a);int w f2(y,b);System.out.println(Math.abs(y-x) Math.abs(e-w));}/*** 求行* */private static int f1(int a) {if (a%n ! 0) {return a/n 1;} else {return a/n;}}/*** 求列* */private static int f2(int x, int a) {if (x %2 0) {return x*n-a1;} else {return a - (x-1)*n;}}
}九、打印大X★
小明希望用星号拼凑打印出一个大X他要求能够控制笔画的宽度和整个字的高度。为了便于比对空格所有的空白位置都以句点符来代替。要求输入两个整数m n表示笔的宽度X的高度。用空格分开(0mn, 3n1000, 保证n是奇数)要求输出一个大X
例如用户输入3 9程序应该输出再例如用户输入4 21程序应该输出资源约定峰值内存消耗含虚拟机 256MCPU消耗 1000ms请严格按要求输出不要画蛇添足地打印类似“请您输入...” 的多余内容。所有代码放在同一个源文件中调试通过后拷贝提交该源码。注意不要使用package语句。不要使用jdk1.7及以上版本的特性。注意主类的名字必须是Main否则按无效代码处理。
解析不得不说这是我迄今为止看到最为奇妙的代码了我本来的思路是分成上下两部分打印符号但是下面的代码直接控制每行的内容就巧妙的实现了同样的效果
我们对于每一行都能划分成这五部分也就是打印“.”和“*”交替进行那么只要我们确定好什么时候开始什么时候停止就可以了下面的就是四个临界条件。这里注意打印的宽度为nm-1后面两个条件的给出需要借助宽度。import java.util.Scanner;public class Main2 {public static void main(String[] args) {Scanner in new Scanner(System.in);int m in.nextInt();int n in.nextInt();for (int i 1; i n; i){for (int j 1; j n m - 1;j){/*** i-1 m(i-1)1 (nm-1)-(mi-111 (nm-1) - (i-1 1* */if ((ji - 1) (j m(i-1)1) || (j (nm-1)-(m(i-1)1)1) (j(nm-1) - (i-1) 1))System.out.print(*);elseSystem.out.print(.);}System.out.println();}}
}十、垒骰子★★
赌圣atm晚年迷恋上了垒骰子就是把骰子一个垒在另一个上边不能歪歪扭扭要垒成方柱体。经过长期观察atm 发现了稳定骰子的奥秘有些数字的面贴着会互相排斥我们先来规范一下骰子1 的对面是 42 的对面是 53 的对面是 6。假设有 m 组互斥现象每组中的那两个数字的面紧贴在一起骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相同当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。由于方案数可能过多请输出模 10^9 7 的结果。不要小看了 atm 的骰子数量哦「输入格式」第一行两个整数 n mn表示骰子数目接下来 m 行每行两个整数 a b 表示 a 和 b 不能紧贴在一起。「输出格式」一行一个数表示答案模 10^9 7 的结果。「样例输入」2 11 2「样例输出」544「数据范围」对于 30% 的数据n 5对于 60% 的数据n 100对于 100% 的数据0 n 10^9, m 36资源约定峰值内存消耗含虚拟机 256MCPU消耗 2000ms请严格按要求输出不要画蛇添足地打印类似“请您输入...” 的多余内容。所有代码放在同一个源文件中调试通过后拷贝提交该源码。注意不要使用package语句。不要使用jdk1.7及以上版本的特性。注意主类的名字必须是Main否则按无效代码处理。
解析题目难点在于想到使用矩阵存放数据想到这种方法之后还要懂得如何求矩阵快速幂不然肯定是会超时的。
关于矩阵快速幂可以参考下面的文章斐波那契数列二--矩阵优化算法import java.util.Scanner;public class Main {static final double MOD 10e9-7;static int[][] arr new int[6][6];public static void main(String[] args) {Scanner input new Scanner(System.in);int n input.nextInt();int m input.nextInt();/*** 初始化arr数组* */for (int i 0; i 6; i) {for (int j 0; j 6; j) {arr[i][j] 1;}}for (int i 0; i m; i) {int a input.nextInt();int b input.nextInt();arr[a-1][b-1] 0;arr[b-1][a-1] 0;}/**** */int[][] ans pow(arr, n-1);int sum 0;for (int i 0; i 6; i) {for (int j 0; j 6; j) {sum ans[i][j]%MOD;}}/*** 旋转情况 4^n* */sum * Math.pow(4, n)%MOD;System.out.println((int)(sum%MOD));}private static int[][] pow(int[][] arr, int k) {/*** 单位矩阵* */int[][] ans new int[6][6];for (int i 0; i 6; i) {ans[i][i] 1;}/*** 矩阵快速幂核心算法* */while (k ! 0) {if (k % 2 ! 0) {ans Multiply(arr, ans);}/*** 每次算多加一颗骰子这样算比单纯n次相乘要快* */arr Multiply(arr, arr);k 1;}return ans;}private static int[][] Multiply(int[][] m, int[][] n) {
// 标准计算矩阵乘法算法int rows m.length;int cols n[0].length;int[][] r new int[rows][cols];for (int i 0; i rows; i) {for (int j 0; j cols; j) {for (int k 0; k m[i].length; k) {r[i][j] (m[i][k] * n[k][j])%MOD;}}}return r;}
}