/*
完数(5分)
题目内容:
一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。
现在,你要写一个程序,读入两个正整数n和m(1<=n<m<1000),输出[n,m]范围内所有的完数。
提示:可以写一个函数来判断某个数是否是完数。
输入格式:
两个正整数,以空格分隔。
输出格式:
其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一个空行。
输入样例:
1 10
输出样例:
6
*/
解题思路:
理解题意:
- 用户输入两个数 n 和 m ,需要输出 n - m 之间的所有完数;
- 完数: 把一个数 除它本身之外的所有因子加起来的总和 等于 该数
- 根据提示可以调用函数判断一个数是否是完数
- 题目的输出格式有要求:其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一个空行
需要注意一个问题:
当输出 n - m 之间最后一个完数时,末尾没有空格;但是如何判断输出的这个完数是否是输出的最后一个完数会有点点麻烦,所以这里可以运用到字符串函数 string.trim(),轻松解决题目输出格式的问题(PS:可先看代码中如何运用该函数,再回来看这个函数的用途,这样更有助于便于理解记忆)
trim函数是用来去除String字符串的前后空白符号或者预定义字符;
注:预定义字符就如 \n 换行、\t 相当于tab键的空格等等。
public class Test {
public static void main(String args[]) {
String Str = new String(" www.runoob.com ");
System.out.print("原始值 :" );
System.out.println( Str );
System.out.print("删除头尾空白 :" );
System.out.println( Str.trim() );
}
}
输出结果:
原始值 : www.runoob.com
删除头尾空白 :www.runoob.com
解题代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner inputScanner = new Scanner(System.in);
int n = inputScanner.nextInt();
int m = inputScanner.nextInt();
int num;
boolean sign = false;//标记是否有完数
String pretectNumberString = "";//要输出的完数式子
for (num = n; num <= m; num++) {
if (IsProteceNumber(num)) {
sign = true;
pretectNumberString += num + " "; //如果是完数,则添加到输出的式子中
}
}
//按要求输出
if(sign) { //有完数,输出式子
System.out.print(pretectNumberString.trim());//字符串的trim()函数可以清除掉开头结尾的空白符
}else { //无完数,输出空行
System.out.print('\n');
}
}
/*判断形参是否是完数的函数(方法),返回值为真或假*/
private static boolean IsProteceNumber(int num) {
boolean sign = false;//作为形参是否是完数的标记
int sum = 0;
//判断是否是因子,如果是,则累加因子
for (int i = 1; i < num; i++) {
if (num % i == 0) {
sum += i;
}
}
//如果因子和等于这个数,则是完数,否则不是完数
if (sum == num) {
sign = true;
}else {
sign = false;
}
return sign;
}
}
如果有问题可以留言交流,我一定及时回复;
如果采纳麻烦您记得点个赞,我在集赞哈哈哈;