一、斐波那契数列(兔子问题)
Q:有一只兔子,从第3个月开始每月生1只兔子,小兔子长到第3个月开始每个月也会生1只兔子,假如兔子都不死,问每个月的兔子总数是多少?
A:本题是一道典型的斐波那契数列问题,斐波那契数列定义如下:
斐波那契数列,又称为黄金分割数列,在数学上,指如下被递推的数列定义:
F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
按照递推公式,解决代码如下:
public class Fibonacci {
public static void main(String[] args) {
int sum_rabbit=1;//兔子总数
int f1_rabbit=1;//两个月前的兔子总数
int f2_rabbit=1;//一个月前的兔子总数
for(int month=1;month<13;month++){
if(month<3){
sum_rabbit=1;
}else {
sum_rabbit=f1_rabbit+f2_rabbit;
f1_rabbit=f2_rabbit;
f2_rabbit=sum_rabbit;
}
System.out.println("第" + month + "个月" + sum_rabbit + "只兔子");
}
}
}
以上代码输出结果如下:
第1个月1只兔子
第2个月1只兔子
第3个月2只兔子
第4个月3只兔子
第5个月5只兔子
第6个月8只兔子
第7个月13只兔子
第8个月21只兔子
第9个月34只兔子
...
二、素数判断问题
Q:判断101~200之间有多少个素数,并将素数输出
A:素数的判断方式:一个数是否为素数的判断可将该数(m)被2~sqrt(m)除,均无法整除则可判定为素数。
代码如下:
public class PrimeNumber {
public static void main(String[] args) {
int count=0;
for(int i=101;i<=200;i++){
boolean isPrime=true;
for(int j=2;j<Math.sqrt(i);j++){
if(i%j==0)
isPrime=false;
}
if(isPrime){
count++;
System.out.println("第"+count+"个素数为"+i);
}
}
System.out.println("该范围内共有"+count+"个素数");
}
}
以上程序输出结果为:
第1个素数为101
第2个素数为103
第3个素数为107
第4个素数为109
第5个素数为113
...
该范围内共有23个素数
三、水仙花数问题
Q:判断并输出101~999范围内所有的水仙花数
A:所谓的水仙花数是指一个三位数,其每一位的数字立方和等于该数本身,如153是一个水仙花数,因为153=1*1*1+5*5*5+3*3*3。因此,只需要将三位数进行数位数字的提取,分别取立方后求和即可判断该数是否为水仙花数。
代码如下:
public class NarcissusNumber {
public static void main(String[] args) {
for(int i=101;i<1000;i++){
int number1=i%10;//个位数
int number2=i/10%10;//十位数
int number3=i/100;//百位数
if((number1*number1*number1+number2*number2*number2+number3*number3*number3)==i)
System.out.println(i);
}
}
}
输出结果如下:
153
370
371
407
四、正整数分解问题
Q:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
A:对于一个正整数n,分解为质因数,应先找到一个最小质数k,然后按如下分解步骤分解:
- 如果这个质数恰等于n,则说明分解质因数的过程已经结束,输出即可。
- 如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
- 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
代码如下:
import java.util.Scanner;
public class IntegerFactorization {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int k=2;
IntegerFactorization integerFactorization = new IntegerFactorization();
integerFactorization.factorize(n,k);
}
public void factorize(int n,int k){
while(k<=n){
if(n==k){
System.out.println(k);
break;
}else if(n%k==0){
System.out.println(k);
n=n/k;
}else {
k++;
}
}
}
}
输入输出结果如下:
10
2
5
五、最大公约数与最小公倍数问题
Q:输入两个正整数m和n,求其最大公约数和最小公倍数。
A:最大公约数解法:欧几里得算法(辗转相除法)
具体的步骤就是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。举个例子就是:比如两个数字,x=453,y=36;
453%36=21;
36%21=15;
21%15=6;
15%6=3;
6%3=0;
所以用这个算法可以求出453和36的最大公约数是3。
最小公倍数解法:用两个数的乘积除以最大公约数即可。
代码如下:
import java.util.Scanner;
public class CommonDivisor {
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
CommonDivisor commonDivisor=new CommonDivisor();
int i = commonDivisor.divisior(a, b);
System.out.println("最大公约数"+i);
System.out.println("最小公倍数"+a*b/i);
}
public int divisior(int a,int b) {
if(a<b) {
int t=b;
b=a;
a=t;
}
while(b!=0) {
if(a==b)
return a;
int x=b;
b=a%b;
a=x;
}
return a;
}
}
程序输入输出结果如下 :
9
6
最大公约数3
最小公倍数18