F、打印大X
如下的程序目的是在控制台打印输出大X。
可以控制两个参数:图形的高度,以及笔宽。
用程序中的测试数据输出效果:
(如果显示有问题,可以参看p1.png)
高度=15, 笔宽=3
高度=8, 笔宽=5
请仔细分析程序流程,填写缺失的代码。
public class A { static void f(int h, int w){ System.out.println(String.format(“高度=%d, 笔宽=%d”,h,w)); int a1 = 0; int a2 = h - 1; for(int k=0; k<h; k++){ int p = Math.min(a1,a2); int q = Math.max(a1+w,a2+w); for(int i=0; i<p; i++) System.out.print(" "); if(q-p<w2){ ____________________________________________ ; //填空 } else{ for(int i=0; i<w; i++) System.out.print(""); for(int i=0; i<q-p-w2; i++) System.out.print(" “); for(int i=0; i<w; i++) System.out.print(”"); } System.out.println(); a1++; a2–; } } public static void main(String[] args){ f(15,3); f(8,5); } }
注意:只填写缺失的代码,不要拷贝已经存在的代码。
题解:
package action; public class demo { static void f(int h, int w) { System.out.println(String.format("高度=%d, 笔宽=%d", h, w)); // 打印高度和宽度 int a1 = 0; // 每一行第一个*的位置(上半部分) int a2 = h - 1; // 图形的行数(上半部分) for (int k = 0; k < h; k++) { // 上下两部分是对称的,所以这里用最大值和最小值的方式可以起到对称的效果 int p = Math.min(a1, a2); // 每一行第一个*的位置 int q = Math.max(a1 + w, a2 + w); // 每一行的长度 // 左侧空格部分 for (int i = 0; i < p; i++) // 从0->p,即第一个*前都是空格 System.out.print(" "); // 这一部分填空的位置,再没有这个代码打印的话,会发现就是中间那几行*号的部分 // 范围就是它在if中的条件q-p if (q - p < w * 2) { for(int i=0; i<q-p; i++) System.out.print("*"); ; //填空 } else { // 左侧*号部分 for (int i = 0; i < w; i++) System.out.print("*"); // 上面和下面的空格部分 for (int i = 0; i < q - p - w * 2; i++) System.out.print(" "); // 右侧的*号部分 for (int i = 0; i < w; i++) System.out.print("*"); } System.out.println(); // 换行 a1++; a2--; } } public static void main(String[] args) { f(15, 3); f(8, 5); } }
G、缩位求和
在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。
比如:248 * 15 = 3720
把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得
2 + 4 + 8 = 14 ==> 1 + 4 = 5;
1 + 5 = 6
5 * 6
而结果逐位求和为 3
5 * 6 的结果逐位求和与3符合,说明正确的可能性很大!!(不能排除错误)
请你写一个计算机程序,对给定的字符串逐位求和:
输入为一个由数字组成的串,表示n位数(n<1000);
输出为一位数,表示反复逐位求和的结果。
例如:
输入:
35379
程序应该输出:
9
再例如:
输入:
7583676109608471656473500295825
程序应该输出:
1
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
题解:
package action; import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); // 输入字符串 char[] ch = str.toCharArray(); // 字符串转换为字符数组 while (true) { int num = 0; // 和 for (int i = 0; i < ch.length; i++) { num += (ch[i] - '0'); // 每个字符加和 } str = num + ""; // 将和变成字符串 if (str.length() == 1) { // 判断字符串长度 System.out.println(str); break; } ch = str.toCharArray(); // 如果没有跳出,则继续将字符串切割成字符数组,继续循环 } } }
H、等腰三角形
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
1. 先用1,2,3,...的自然数拼一个足够长的串
2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:
1
2 1
3 8
4 1
5 7
6 1
7 6
891011121314151
输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。
为了便于测评,我们要求空格一律用"."代替。
例如:
输入:
5
程序应该输出:
....1
...2.1
..3...2
.4.....1
567891011
再例如:
输入:
10
程序应该输出:
.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181
再例如:
输入:
15
程序应该输出:
..............1
.............2.3
............3...2
...........4.....3
..........5.......1
.........6.........3
........7...........0
.......8.............3
......9...............9
.....1.................2
....0...................8
...1.....................2
..1.......................7
.1.........................2
21314151617181920212223242526
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
题解:
package action; import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int h = sc.nextInt(); // 高度 int an = 1 + (h - 1 - 1) * 2; // 最下面一行需要的字符数 int n = h + an + (h - 1); // 一圈所需要的字符数 char[] ch = new char[n + 3]; // 长度加3个备用 String numStr = ""; // 获取所需字符 for (int i = 1; numStr.length() < n + 3; i++) { numStr += String.valueOf(i); } ch = numStr.toCharArray(); // 变成字符 // 打印 for (int i = 1; i <= h; i++) { // 左侧.号 for (int j = h - i; j > 0; j--) { System.out.print("."); } System.out.print(ch[i - 1]); // 左侧数字 // 中间.号,这个运用等差数列可以获得中间的空值,然后去打印 if (i >= 2 && i < h) { for (int a = 0; a < 1 + (i - 1 - 1) * 2; a++) { System.out.print("."); } } // 最后一行 if (i == h) { for (int j = 0; j < an; j++) { System.out.print(ch[h + j]); } } if (i != 1) { System.out.print(ch[n - i + 1]); // 右侧数字 } System.out.println(); } } }