问题:
1. 我们只学了用 int a,b; 来创建两个可键入的变量。如何像图片里一样一次性创建多个可键入变量(中途并换行)。
2. 判定a b区间内有几个水仙花数时,应该用什么方法判断有哪几个数字?(我觉得这块我要创建几个double变量 来对应这几个水仙花数,但应该如何写呢)
3. 如何从大到小列出这几个数字?
(暂且就这三个 问题,希望大佬尽快给予解答)如果可能最好po码上来。
(顺便说一下我的操作环境时eclipse win - 64bit,用的时java se 1.14环境)
先解答问题:
1、Scanner类获取键盘输入
2、可以建一个集合List存水仙花数,但只要输出的话没有必要,直接输出字符串即可
3、想要从大到小,调整for循环方向即可
从大到小:
for(int i = max; i >= min; i--){
// 代码
}
从小到大:
for(int i = min; i <= max; i++){
// 代码
}
整体思路:
1、输入:Scanner键盘输入,可输入多行,对数据进行格式校验(如果保证输入格式没问题,可以省略校验)
2、数据处理输出:符合条件的数据整理为集合,循环判断是否为水仙花数,判断完成,输出
3、输出完成进入下一次输入
先上控制台截图:
public static void narcissus(){
System.out.println("每行请输入两个数字,可输入多行,两次回车返回结果!");
// 存储输入的字符串,每次输出后清空
List<String> strList = new ArrayList<>();
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
String str = sc.nextLine().trim();
if(!"".equals(str)){
// 数字个数校验
if(str.split("\\s+").length == 2){
// 是否只有数字和空格校验
String pattern = "[\\d\\s]+";
Matcher meq = Pattern.compile(pattern).matcher(str);
if(meq.matches()){
strList.add(str);
}else{
System.out.println("包含数字和空格以外的字符: " + str);
}
}else{
System.out.println("请检查输入数字个数是否为两个: " + str);
}
}else{ // 输入为空,则进行水仙花数判断及输出
System.out.println("输出如下:");
for(String s : strList){
// 分割,判断两个数字的大小
String[] strArray = s.split("\\s+");
int first = Integer.valueOf(strArray[0]);
int second = Integer.valueOf(strArray[1]);
int min = first, max = second;
if(first > second){
min = second;
max = first;
}
// 水仙花数为三位数,超出此范围直接输出 no ,进行下一次循环
if(max < 100 || min > 999){
System.out.println("no");
continue;
}
// 判断 输出
String outStr = "";
for(int i = min;i<= max; i++){
int hun = i / 100;
int ten = i % 100 / 10;
int one = i % 10;
if(i == (hun*hun*hun + ten*ten*ten + one*one*one)){
outStr += i +" ";
}
}
if(!"".equals(outStr)){
System.out.println(outStr);
}else{
System.out.println("no");
}
}
// 集合清空,接收下一次输入
strList = new ArrayList<>();
System.out.println();
System.out.println("每行请输入两个数字,可输入多行,两次回车返回结果!");
}
}
}
1.读行,然后用空格分割出每一个数据(实际就是一行有两个数据,m和n)
2.循环从m开始 结束条件为m=n,自增1 然后在循环体内进行判断是否为水仙花,如果是就直接输出,
3.如果是从m开始到n结束,那么输出的顺序就是小到大,如果要大到校,那么就从n开始 递减1到m结束
提供下读一行的思路代码
Scanner sc = new Scanner(System.in);
// 读取一行数据
String s = sc.nextLine();
// 用空格分隔
String[] strings = s.split(" ");
int m = Integer.parseInt(strings[0]);
int n = Integer.parseInt(strings[1]);
int result = 0;//0为有水仙花,1为无
for(int i = m ; m<=n ; i++){
int a = i%10;//个位
int b = i/10%10;//十位
int c = i/100;//百位
if((a*a*a + b*b*b + c*c*c) ==i){
System.out.printf("%d "+i);
result=1;
}
}
if(result==0)System.out.printf("no");
System.out.println();
public class ShuiXianHuaShu {
public static void main(String[] args) {
int count = 0;
for (int i = 100; i < 1000; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai) {
System.out.println(i + "是水仙花数");
count++;
}
}
System.out.println("一共有" + count + "个水仙花数");
}
}
//输入m,n
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入整数m");
int m = sc1.nextInt();
System.out.println("请输入整数n");
int n = sc2.nextInt();
//输出水仙花数个数
int count = 0;
//逻辑
for (int i = 0; i <= 9; i++) {
int i1 = i * 100;
for (int j = 0; j <= 9; j++) {
int j1 = j * 10;
for (int k = 0; k <= 9; k++) {
int k1 = k;
if (i * i * i + j * j * j + k * k * k == i1 + j1 + k1 && i1 + j1 + k1 > m && i1 + j1 + k1 < n) {
count++;
//同一行输出,空格隔开
System.out.print(i1 + j1 + k1+" ");
}
}
}
}
//如果没有输出水仙花数,那就输出no
if (count == 0){
System.out.println("no");
}
1.用while(true)即可
2.依次循环遍历从m到n之间的数,把每个数的个位、十位、百位上的数字提取出来,分别求立方后再求和看看是否等于原来那个数字,若等于则输出;若不等于,则进行下一个数字的计算
3.若从小到大,第二问的答案已给出,即从小到大遍历判断;若从大到小,可以从大到小进行遍历判断
代码
import java.util.*;
public class flower {
public static void main(String[] args) {
int m,n;
Scanner sc=new Scanner(System.in);
while(true) {
m=sc.nextInt(); //输入的m
n=sc.nextInt(); //输入的n
int s=0; //水仙花个数统计
for(int i=m; i<=n; i++) {
int a=i/100; //提取百位上的数字
int b=(i%100)/10; //提取十位上的数字
int c=i%10; //提取个位上的数字
if(a*a*a+b*b*b+c*c*c==i) { //进行水仙花数判断
s++;
System.out.print(i);
System.out.print(' ');
}
}
if(s==0){ //如果没有水仙花数
System.out.println("no");
}
else{
System.out.println();
}
}
}
}
结果截图