时时要有危机意识。别以为你命好运也好。
1.题目:打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。
题非常简单,只要用for循环,取出数的个位、十位、百位差不多就完成了
for (int i=100;i<1000;i++){
int a=i/100;
int b=i/10%10;
int c=i%10;
if (i==a*a*a+b*b*b+c*c*c){
System.out.println(i);
}
}
2.题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如6=1+2+3。编程找出1000以内的所有完数。
这道题呢,我们只需要在之前找素数的程序上稍加修改就好了
int sum;
for (int i=1;i<1000;i++){
sum=0;
for (int j=1;j<i;j++){
if (i%j==0){
sum+=j;
}
}
if (sum==i){
System.out.println(i);
}
}
我们还可以借用一下数学的帮助,凡是一个数开方后的数的素数都是原来那个数的素数,至于最后的加一是因为循环是从2开始的,1是任何数的因数
int sum;
for (int i=2;i<1000;i++){
sum=0;
int sqrt=(int)Math.sqrt(i+1);
for (int j=2;j<=sqrt;j++){
if (i%j==0){
sum+=j;
sum+=i/j;
}
}
if (sum+1==i){
System.out.println(i);
}
}
3.题目:求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。
例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制。
看到这道题的第一时间想到的思路便是拼接字符串,字符串转数字,求和
Scanner scanner=new Scanner(System.in);
String a=scanner.nextInt()+"";
int number=scanner.nextInt();
int result=0;
for (int i=1;i<=number;i++){
String s="";
for (int j=1;j<=i;j++){
s+=a;
}
result+=Integer.valueOf(s);
}
System.out.println("结果:"+result);
而后仔细琢磨一下,发现一个规律,每个数都等于前面一个数乘10再加上它本身
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int number=scanner.nextInt();
int result=a;
int t=a;
for (int i=1;i<number;i++){
t=t*10;
t+=a;
result+=t;
}
System.out.println("结果:"+result);
换一个思路,那这个数列都是原数字乘上1,11,111,1111这样的一个数列,我们可以构造一个这样的数列,然后想乘求和
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int number=scanner.nextInt();
int result=0;
int t=0;
for (int i=1;i<=number;i++){
t+=Math.pow(10,i-1);
System.out.println(t);
result+=a*t;
}
System.out.println("结果:"+result);
4.题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
这道题非常简单,主要是明确两个概念,什么是最大公约数,什么是最小公倍数。
最大公约数:两个数共有的最大因子
最小公倍数:两个数共有的最小的倍数
找最大公约数从大数找到小数,找最小公倍数从小数找到大数
两个数最大的公约数最大也就是两种中较小的那个数,最小就是1
两个数最小的公倍数最小就是两数中较大的那个数,最大就是两数想乘的结果
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int b=scanner.nextInt();
for(int i=(a<b?a:b);i>=1;i--){
if (a%i==0&&b%i==0){
System.out.println("最大公约数:"+i);
break;
}
}
for (int i=(a>b?a:b);i<=a*b;i++){
if (i%a==0&&i%b==0){
System.out.println("最小公倍数:"+i);
break;
}
}
借助一下数学思维,我们只需要求出两个数共有的因数和各自最大的因数,这些数的乘积就等于两数的最小公倍数
private static void Method2() {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int b=scanner.nextInt();
getPrimeFactor(a,b);
int min=1;
System.out.println(integerList);
for (int i:integerList){
min*=i;
}
System.out.println("最小公倍数:"+min);
}
private static void getPrimeFactor(int number1 , int number2 ) {
for (int i=2;i<=(number1>number2? number1:number2);i++){
if (number1%i==0&&number2%i==0){
integerList.add(i);
getPrimeFactor(number1/i,number2/i);
break;
}
if (i==number1||i==number2){
integerList.add(number1);
integerList.add(number2);
}
}
}
还可以不断对较小的那个数取余,直到取到余数为0,此时的数就是两个数的最大公约数,用两数想乘的结果除以这个结果便是最小公倍数了
private static void Method3() {
int a,b,m,n;
Scanner in=new Scanner(System.in);
System.out.println("请输入一个正整数:");
a=in.nextInt();
System.out.println("再输入一个正整数:");
b=in.nextInt();
m=commonDivisor((a>b? a:b),(a<b? a:b));
n=a*b/m;
System.out.println("最大公约数:"+m);
System.out.println("最小公倍数:"+n);
}
public static int commonDivisor(int x,int y){
while(y!=0){
int k=x%y;
x=y;
y=k;
}
return x;
}