系列文章目录
前言
本文介绍经过一周学习后,老师留的6道课后习题。题目在相应代码最上方注释。
第一题:求阶乘
代码:
/*
1、求15的阶乘。
*/
public static void main(String[] args) {
long sum = 1;
for (int i = 1; i <= 15; i++){
sum *= i;
System.out.println(sum);
}
//int存储不下15的阶乘,必须用比int大的long型
System.out.println("15的阶乘为:\t" + sum);
}
代码解释: 使用循环遍历1-15来求15的阶乘,最后输出。
代码结果:
第二题:鸡兔同笼
代码:
/*
2、有若干只鸡兔同在一个笼子里,有35个头,有94只脚。问笼中各有多少只鸡和兔?
*/
public static void main(String[] args) {
int x = 1;
for ( ; x <= 35; x++)
if ((x * 2 + (35 - x) * 4) == 94)
break;
//上面算式可以简化成35 * 4 - 2 * x == 94,但这么写更符合逻辑
System.out.println("鸡有" + x + "只," + "兔有" + (35 - x) + "只。");
System.out.println(x + " X 2 + " + (35 - x) + " X 4 = " + (x * 2 + (35 - x) * 4));
}
代码解释: 我们使用Java编写数学题,不需要像我们初中做的那样列方程,只需要让代码从头开始遍历,让他试出来即可。
我们使用for循环从1只鸡开始试,直到(x * 2 + (35 - x) * 4) == 94这一条件的达成,我们再使用break,最后输出。
代码结果:
第三题:多次删除数组元素
代码:
/*
3、已知数据:
String[] strs = {"1", "2", "3", "3", "2", "1"};
String s = "3";
移除strs数组中所有和s相同的元素。
完成的同学思考一下如何修改课上代码的getIndex方法和deleteArray1方法解决这个问题。
课上写的代码在最后(代码可能不完全一样,实现的功能肯定一样)
*/
public static void main(String[] args) {
String[] strs = {"1", "2", "3", "3", "2", "1"};
//测试数组2
//String[] strs = {"1", "2", "3", "3", "2", "2", "3", "3", "2", "2", "3", "1"};
String s = "3";
delateToday(strs, s);
System.out.println("以下为修改课上代码以达成此目的");
strs = new String[]{"1", "2", "3", "3", "2", "1"};
//较课上修改部分区别如下,循环删除而不是删除,简单暴力且有效,但浪费运算时间,如果数组大的话会表现明显
for (int i = 1; i <= strs.length; i++)
deleteArr1AfterChange(strs, s);
}
public static void delateToday(String[] strs, String s){
//基本逻辑,从头遍历,每次遇到相同字符串进行删除操作,下标减1,继续遍历,直到遍历到空值
for (int i = 1; (i < strs.length && strs[i] != null); i++){
//System.out.println(Arrays.toString(strs) + "dddddd");
if (strs[i].equals(s)){
for (int j = i; j < strs.length; j++){
if ((j + 1) < strs.length){
strs[j] = strs[j + 1];
continue;
}
strs[j] = null;
break;
}
System.out.println("第" + i-- + "位已被删除,改后数组为:" + Arrays.toString(strs));
//以防有并列的同一个数,变量i需要进行自减操作i--
}
}
System.out.println("最终结果:" + Arrays.toString(strs));
}
public static void deleteArr1AfterChange(String[] ages, String b){
//先判断数组中是否存在该元素:
int x = getIndexAfterChange(ages, b);
if (x != -1){
for (int i = x; (i < ages.length && ages[i] != null); i++){
if (i + 1 < ages.length){
ages[i] = ages[i + 1];
continue;
}
ages[i] = null;
}
}else{
System.out.println("the element does not exist");
}
if (x != -1)
System.out.println("改后数组:" + Arrays.toString(ages));
}
public static int getIndexAfterChange(String[] names, String str) {
int x = -1;
for (int i = 0; i < names.length; i++){
if (str.equals(names[i])){
x = i;
break;
}
}
return x;
}
/*
public static void deleteArr1(String[] ages, String b){
//先判断数组中是否存在该元素:
System.out.println(Arrays.toString(ages));
int x = getArr5(ages, b);
if (x != -1){
for (int i = x; (i < ages.length && ages[i] != null); i++){
if (i + 1 < ages.length){
ages[i] = ages[i + 1];
continue;
}
ages[i] = null;
}
}else
System.out.println("the element does not exist");
System.out.println(Arrays.toString(ages));
}
public static int getArr5(String[] names, String str) {
int x = -1;
for (int i = 0; i < names.length; i++){
if (str.equals(names[i])){
x = i;
break;
}
}
return x;
}
*/
代码解释: 此代码分为两个部分
…1、delateToday方法用一个方法实现题目功能,要注意的是每次进行删除操作后需要进行下标自减操作,以避免相邻元素都需要删除
…2、deleteArr1AfterChange方法、getIndexAfterChange方法是改后的上课时的代码(上课时的代码只能删除一次相匹配的元素),我们将其放至循环中,使其重复执行6次。
代码结果:
第四题:大数相加求精度
代码:
/*
4、已知数据:
float f1 =12345678;
float f2 = 87654321;
求f1+f2的结果。
*/
public static void main(String[] args) {
float f1 = 12345678;
float f2 = 87654321;
//失败案例3,无能为力了,每次都是99999998
long fsum = 0;
fsum = (((Float)f1).longValue() + ((Float)f2).longValue());
System.out.println(fsum);
/*
失败案例2
BigDecimal bd1 = new BigDecimal(Float.toString(f1));
BigDecimal bd2 = new BigDecimal(Float.toString(f2));
BigDecimal sum = bd1.add(bd2);
System.out.println(sum.toPlainString());
*/
/*
失败案例1
//如果fsum是float型,输出结果为1.0E8
Double fsum = 0.0;
fsum = (((Float)f1).doubleValue() + ((Float)f2).doubleValue());
System.out.println(fsum.longValue());
*/
}
代码解释: 如果简单使用float型来存储他俩的和,那么输出结果为10的8次方,正确结果应该是99 999 999。如果把float转为Float再转为Double最后输出long型,输出为99 999 998,如果使用BigDecimal来存储数据,结果依然是99 999 998,最后尝试转为Float型后直接转为long型,输出结果依然是99 999 998。
寻思半天最后问老师后才知道,这道题是陷阱题,根本不能输出99 999 999,计算机计算就是有这样的缺陷。
代码结果:
第五题:数组合并去重
代码:
/*
5、已知数据:
String[] strs1 = {"1", "2", "3", "4", "5", "1"};
String[] strs2 = {"a", "b", "c", "4", "e", "5"};
将两个数组合并成一个数组,并去掉重复的元素。
*/
public static void main(String[] args) {
String[] strs1 = {"1", "2", "3", "4", "5", "1"};
String[] strs2 = {"a", "b", "c", "4", "e", "5"};
String[] strsum = new String[strs1.length + strs2.length];
int sumfristnull = -1;
for (int i = 0; i < strs1.length; i++){
strsum[i] = strs1[i];
}
System.out.println(Arrays.toString(strsum));
a: for (int j = 0; j < strs2.length; j++){
b: for (int i = 0; i < strs1.length; i++){
if (strs2[j] == strs1[i])
continue a;
}
sumfristnull = theFirstNull(strsum);
strsum[sumfristnull] = strs2[j];
//System.out.println(Arrays.toString(strsum));
}
System.out.println(Arrays.toString(strsum));
}
public static int theFirstNull(String[] strsum){
for (int i = 0; i < strsum.length; i++){
//必须用==,不能用.eqlues()方法
if (strsum[i] == null){
//System.out.println(i);
return i;
}
}
return 0;
}
代码解释:
先将strs1先导入strsum,在导入strs2时,每个元素判断是否已经有了,如果没有,定义theFirstNull方法找到数组中第一个空值的下标,将新元素插入strsum数组;如果str1已经导入过这个元素,那么不进行插入,continue跳过本轮循环。
代码结果:
第六题:账号登录
代码:
/*
6、已知有三组账号和密码:
账号 密码
admin 123456
lisi abcdef
wangwu 123def
实现在控制台输入账号和密码,用程序判断是否登录成功。
*/
public static void main(String[] args) {
String[] userName = {"admin", "lisi", "wangwu"};
String[] Password = {"123456", "abcdef", "123def"};
boolean userNameFound = false;
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter your username: ");
String enterUserName = scanner.next();
System.out.println("Please enter your password: ");
String enterPassword = scanner.next();
for (int i = 0; i < userName.length; i++){
if (userName[i].equals(enterUserName)){
userNameFound = true;
if (Password[i].equals(enterPassword))
System.out.println("(∩_∩)login success!Your username is :" + userName[i] + ",Your password is :" + Password[i]);
else
System.out.println("(>﹏<)login fail...Your password is not correct.");
}
}
if (userNameFound == false)
System.out.println("(>﹏<)login fail...Your username wasn't been created.");
}
代码解释:
分析:三种情况:
…1、用户名存在,密码匹配:登陆成功
…2、用户名存在,密码不匹配:登陆失败,提示密码错误
…3、用户名不存在,不判断密码匹不匹配:登陆失败,提示用户名不存在
代码结果:
总结
本文介绍了关于循环、判断、数组的相关练习题,请理解其中逻辑并学会如何解决此类问题,能帮到你就很好了。