这是我第6次给大家分享题,如果想看看以前的例题,请点开我的博客,查看作业分栏。谢谢收看。
问题1:计算1+2+3+4+5+…+98+99+100和斐波那契数列 求前20项
问题1:计算1+2+3+4+5+…+98+99+100:
我们设: f(n) 是求1~n的累加,那么 f(100)就是我们的问题
这题我用递归去做:在我们写递归时,一定要先写它的end!
↓ 递
f(n)=f(n-1)+n
f(100)=f(99)+100 return 1+2+3+…+99 +100
f(99)=f(98)+99 return 1+2+…+98 +99
…
f(4)=f(3)+4 return 1+2+3+4
f(3)=f(2)+3 return 1+2+3
f(2)=f(1)+2 return 1+2
f(1)=1 return 1
→ end ↑ 归
这就是第一题的思路
问题2:斐波那契数列 求前20项
1 1 2 3 5 8 13 21 34 55 …
如果 f(n)指的是斐波那契的第n项
f(n)=f(n-1)+f(n-2)这个题就要从20化到: f(1)=1 f(2)=1
跟上面的那个题思路一样,就是运算步骤多了几步。
不停变换值,达到运算效果
c=a+b;count++; if(count==n){ return; a=b; b=c;
class Test02{
public static void main(String[] args){
System.out.println(f(10));
for(int i=1;i<=100;i++){//O(n)
System.out.println(fibo(i));//O(2^n)
}
System.out.println("==============");
fiboIterator(20);//用迭代的思想求前20项
}
//问题2
public static void fiboIterator(int n){
int a=1;
int b=1;
System.out.println(a);
System.out.println(b);
int count=2;
int c;
while(true){
c=a+b;
System.out.println(c);
count++;
if(count==n){
return;
}
a=b;
b=c;
}
}
//问题1
public static int fibo(int n){
if(n==1||n==2){
return 1;
}
return fibo(n-1)+fibo(n-2);
}
public static int f(int n){
if(n==1){
return 1;
}
return f(n-1)+n;
}
}
Demo04_01
这个题以前写过类似的题,只不过没用过函数的方法这次我就不详细说了,详细在题集5和4
1.先输入一个数字
2.编写函数
3.调用函数将num拆分求和
下面是代码演示:
import java.util.Scanner;
class Demo04_01{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
long num=scanner.nextLong();
int sum=sumDigits(num);
System.out.println(sum);
}
public static int sumDigits(long n){
int sum=0;
while(true){
sum+=n%10;
n/=10;
if(n==0){
return sum;
}
}
}
}
Demo04_02
这个题在主函数中
1.提示用户输入一个数字
2.判断该数字是否是一个回文
在方法函数中:编写计算方法
1.先计算该数字的反序
2.对比反序的数字和数字本身
下面是代码演示:
import java.util.Scanner;
class Demo04_02{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
if(isPalindrome(num)){ // pause1
System.out.println("是回文");
}else{
System.out.println("不是回文");
}
}
public static boolean isPalindrome(int num){
return reverse(num)==num;
}
public static int reverse(int num){
int sum=0;
while(true){
sum=sum*10+num%10;
num/=10;
if(num==0){
return sum;
}
}
}
}
Demo04_03
这个在题集4中出现,同类型,详解请往前翻
在主函数中
这个题在主函数中
1.提示用户输入一个数字
2.调用函数
在方法函数中:编写计算方法
1.先打印空格
2.在打印数字
注意循环开始和结束。
下面是代码演示:
import java.util.Scanner;
class Demo04_03{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入行数:");
displayPattern(scanner.nextInt());
}
public static void displayPattern(int line){
for(int i=1;i<=line;i++){
for(int k=1;k<=line-i;k++){
if(line<10){
System.out.print(" ");
}else{
System.out.print(" ");
}
}
for(int j=i;j>=1;j--){
if(line<10){
System.out.printf("%-2d",j);
}else{
System.out.printf("%-3d",j);
}
}
System.out.println();
}
}
}
Demo04_05
这个题让你实现sqrt的函数,我们都知道这个函数是计算开方的,
根据题目的提示一步一步走就行
只不过这个题目中让你算lastGuess和nextGuess的差,记得这个差要带绝对值,你不能判断谁比较大。
所以这个题思路一样
1.在主函数中调用方法
2.在方法函数中运算
下面是代码演示
class Demo04_05{
public static void main(String[] args){
System.out.println(sqrt(9));
}
public static double sqrt(long n){
double lastGuess=1;
double nextGuess=(lastGuess+n/lastGuess)/2;
while(true){
if(Math.abs(nextGuess-lastGuess)<0.00001){
return nextGuess;
}
lastGuess=nextGuess;
nextGuess=(lastGuess+n/lastGuess)/2;
}
}
}
Demo04_06
这个题跟上面的Demo04_02一样,只不过多了一个是素数,并不难,加一个素数的方法就行,轻松解决
这个题在主函数中
1.调用函数
2.判断该数字是否是一个回文素数
3.输出,换行
在回文方法函数中:编写计算方法
1.先计算该数字的反序
2.对比反序的数字和数字本身
在素数方法函数中:
1.用for循环看,他的可能因数
2.计算是否素数
下面是代码演示:
class Demo04_06{
public static void main(String[] args){
int count=0; //表示回文素数的个数
int num=2; //表示可能的回文素数的数字 从2开始~?
while(true){
//如果num是 回文素数
if(isHuiWenAndSuShu(num)){
count++;
System.out.print(num+" ");
if(count%10==0){
System.out.println();
}
}
if(count==100){
break;
}
num++;
}
}
public static boolean isHuiWenAndSuShu(int num){
return isHuiWen(num)&&isSuShu(num);
}
public static boolean isHuiWen(int num){
return reverse(num)==num;
}
public static int reverse(int num){
int sum=0;
while(true){
sum=sum*10+num%10;
num/=10;
if(num==0){
return sum;
}
}
}
public static boolean isSuShu(int num){
for(int i=2;i<=num/2;i++){
if(num%i==0){
return false;
}
}
return true;
}
}
Demo04_07
这个题是上一个题的进阶版.要求本身是素数反转之后也是素数不能是回文
//素数() 反转() 回文功能()还是三个方法
这个题在主函数中
1.调用函数
2.判断该数字是否是一个回文素数
3.输出,换行
在回文方法函数中:编写计算方法
1.先计算该数字的反序
2.对比反序的数字和数字本身
在素数方法函数中:
1.用for循环看,他的可能因数
2.计算是否素数
只不过这个题要的不是回文,所以判断是回文时在,素数后面,先算出来,在比较不是回文
下面是代码演示:
class Demo04_07{
public static void main(String[] args){
int count=0;
int num=2;
while(true){
if(isFanZhuanSuShu(num)){
count++;
System.out.print(num+" ");
if(count%10==0){
System.out.println();
}
}
if(count==100){
return; //结束当前函数
}
num++;
}
}
public static boolean isFanZhuanSuShu(int num){
return isSuShu(num)&&isSuShu(reverse(num))&&!isHuiWen(num);
}
//回文功能
public static boolean isHuiWen(int num){
return reverse(num)==num;
}
//素数功能
public static boolean isSuShu(int num){
for(int i=2;i<=num/2;i++){
if(num%i==0){
return false;
}
}
return true;
}
//反转功能
public static int reverse(int num){
int sum=0;
while(true){
sum=sum*10+num%10;
num/=10;
if(num==0){
return sum;
}
}
}
}
感谢你的阅读,如果我的分享对你有帮助的话,点个赞再走行不行,谢谢。