Java求水仙花数 / 模拟3次密码输入
1 模拟三次密码输入
在生活中,很多地方会用对密码的输入次数进行限制,例如:银行卡、微信以及支付宝密码等等,如果不加以限制,就会被黑客用暴力穷举法的方式才出来,盗取账号。
我们模拟三次密码输入,就是指,如果用户在三次之内输入的密码和系统预置的密码相匹配,则登陆成功;如果三次机会用完了都不匹配则登陆失败,强制退出。
1.1 密码设置
密码有纯数字的形式、也有既有数字又有字母符号的形式,加之,密码并不是用来进行算术运算的,所以其类型应设置为字符串。
(1) 将密码预先设置为 123456。
String password = "123456";
(2) 获取用户输入密码:
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的密码:");
String input = scanner.next();
(3) 比较用户输入密码是否与预先设置密码相同
if(input.equals(password)){
//input 和password的位置交换效果一样
System.out.println("登陆成功");
}else{
System.out.println("登陆失败");
}
注意:
在Java中,不能直接使用 == 比较字符串的内容是否相等,直接使用是相当于比较地址相等。
应该使用字符串类中的一个 equals 方法 来比较。
1.2 控制次数
循环次数确定时 使用for循环较多
小技巧:
在IDEA中,通过ctrl + alt + t 触发surround 功能,就可以把某一段代码包裹到某种代码块中。(先选中要包裹进去的代码,然后按ctrl + alt + t,会出现如下窗口,选择点击之后,就可以包裹进去了)
for (int i = 0; i <3 ; i++) {
if(input.equals(password)){
System.out.println("登陆成功");
break;
}else{
System.out.println("登陆失败");
}
}
上述for循环跳出的原因只有两种可能:
(1) for 的条件不满足(三次机会耗尽);
(2) 输入正确,从而break跳出。
我们可以再加一个判断来反映,它超过错误次数而结束。
if(i == 3){
System.out.println("您已3次输入错误,程序强制终止。");
}
1.3完整代码
public static void main(String[] args) {
Login();
}
public static void Login() {
String password = "123456";
Scanner scanner = new Scanner(System.in);
int i = 0;
for (i = 0; i <3 ; i++) {
System.out.println("请输入您的密码:");
String input = scanner.next();
if(input.equals(password)){
System.out.println("登陆成功");
break;
}else{
System.out.println("登陆失败");
}
}
if(i == 3){
System.out.println("您已3次输入错误,程序强制终止。");
}
}
2 求水仙花数
2.1 什么是水仙花数
所谓水仙花数,是指一个n位数,每一位数字的n次幂的和正好等于这个数本身。例如:数153=13+53+33。
2.2 代码块实现
我们可以分成两个步骤,第一步先是遍历所有的数,第二步细化,判断每个数是不是水仙花数,运用方法的知识,一个方法只做一件工作,提升我们的效率,较少我们出现bug的概率。
(1) 限制范围,即我们需要求多少到多少之间的水仙花数,因此我们可以写一个方法,限制并且遍历这个范围内的每一个数。
public static void printNarcissusNum(int begin, int end) {
for (int i = begin; i <=end ; i++) {
if(isNarcissusNum(i)){
System.out.println(i);
}
}
}
(2) 判断该数是不是水仙花数
有两种判断方式:
第一种:位数较少,我们可以逐步分解每一位的数字进行立方,然后求和。比如:是三位数,就可以用 “/” 将其每个位上的数字分解,分别求立方。
public static boolean isNarcissusNum(int number) {
int ge=number%10;
int tmp=number/10;
int shi=tmp%10;
tmp=number/100;
int bai=tmp%10;
if((cube(ge)+cube(shi)+cube(bai))==number){
return true;
}
return false;
}
public static int cube(int i) {
return i*i*i;
}
第二种:用循环的方法,位数多或少都可以使用,循环求出每一位的数,立方求和。
public static boolean isNarcissusNum(int i) {
if (cubeResult(i) == i){
return true;
}
return false;
}
public static int cubeResult(int number) {
int result = 0;
while (number>0){
int a =number%10;
result+=a*a*a;
number/=10;
}
return result;
}
2.3完整代码
public static void main(String[] args) {
//求出0~999之间的所有“水仙花数”并输出
printNarcissusNum(0,999);
}
public static void printNarcissusNum(int begin, int end) {
for (int i = begin; i <=end ; i++) {
if(isNarcissusNum(i)){
System.out.println(i);
}
}
}
public static boolean isNarcissusNum(int i) {
if (result(i) == i){
return true;
}
return false;
}
public static int result(int number) {
int result = 0;
while (number>0){
int a =number%10;
result+=a*a*a;
number/=10;
}
return result;
}