【精選】JAVA入門演算法題(二)
阿新 • • 發佈:2018-12-15
時時要有危機意識。別以為你命好運也好。
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;
}