E、书号验证
2004年起,国际ISBN中心出版了《13位国际标准书号指南》。
原有10位书号前加978作为商品分类标识;校验规则也改变。
校验位的加权算法与10位ISBN的算法不同,具体算法是:
用1分别乘ISBN的前12位中的奇数位(从左边开始数起),用3乘以偶数位,
乘积之和以10为模,10与模值的差值再 对10取模(即取个位的数字)即可得到校验位的值,
其值范围应该为0~9。
下面的程序实现了该算法,请仔细阅读源码,填写缺失的部分。
public class A
{
static boolean f(String s){
int k=1;
int sum = 0;
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
if(c==’-’ || c==’ ') continue;
sum += ______________________________; //填空
k++;
if(k>12) break;
}
return s.charAt(s.length()-1)-‘0’ == (10-sum % 10)%10;
}
public static void main(String[] args){
System.out.println(f(“978-7-301-04815-3”));
System.out.println(f(“978-7-115-38821-6”));
}
}
题解:
package action; public class demo { static boolean f(String s) { int k = 1; // 位数 int sum = 0; // 乘积之和 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 获取每个字符 if (c == '-' || c == ' ') continue; // 跳转杠和空格 // (k % 2 == 0?3:1) : 判断是否是奇数还是偶数,并且得到对应的乘值 sum += (c - '0') * (k % 2 == 0 ? 3 : 1); // 填空位置 k++; // 每次循环位数+1 if (k > 12) break; // 超出12位直接跳出 } // 乘积之和以10为模,10与模值的差值再对10取模(即取个位的数字)即可 return s.charAt(s.length() - 1) - '0' == (10 - sum % 10) % 10; } public static void main(String[] args) { System.out.println(f("978-7-301-04815-3")); System.out.println(f("978-7-115-38821-6")); } }
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(); // 如果没有跳出,则继续将字符串切割成字符数组,继续循环 } } }