今日算法题

题目一:Fibonacci数列

问题描述:

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

解决思路:

我们可以先写一小段Fibonacci数列来总结规律:1,1,2,3,5,8,13,21,34,55

[注意:在此处我们为了总结出规律,将除数缩小成5(也可以为数列中其他较小的值,此处仅是举例)]

通过计算我们可以得出相应的余数数列:1,1,2,3,0,3,3,1,4,0

通过上诉结果我们可以看出当Fn<5(即是除数)时,余数值就是Fn;而当Fn>=5时,存在一个规律即是:(8+13)%5=(8%5+13%5)%5。于是我们可以猜想不算出Fn的值,而是直接将余数值用数组存储起来。通过验证,这样做确实可行。

解决代码:

/**
注:由于方便问题中的n与fn对应,此代码中的余数数组从下标1开始使用
*/
import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int f[] = new int[n+2];
        f[1] = 1;
        f[2] = 1;

        if(n > 2) {
            for (int i = 3; i <= n; i++) {
                f[i] = (f[i - 1] + f[i - 2]) % 10007;
            }
        }

        System.out.println(f[n]);
    }
}     
/**
注:还可从下标0开始使用
*/
import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int f[] = new int[n+1];
        f[0] = 1;
        f[1] = 1;

        if(n > 1) {
            for (int i = 2; i <= n; i++) {
                f[i] = (f[i - 1] + f[i - 2]) % 10007;
            }
        }

        System.out.println(f[n-1]);
    }
}

题目二:圆的面积

问题描述:

给定圆的半径r,求圆的面积(四舍五入保留小数点后7位)。

需要注意:

  • 由于对结果的精度有要求,所以要注意PI的取值。

  • Java中保留特定小数位数的几种方式:

    • new DecimalFormat("#.0000000").format(Xxx);

    • Math.round(Xxx*10000000)/10000000);

    • String.format("%.7f", Xxx);

    • nf.setMaximumFractionDigits(7);
      nf.setRoundingMode(RoundingMode.UP);
      nf.format(Xxx); ```
      
      

解决代码:

/**
使用上面任意一种方法均可
*/
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int r = sc.nextInt();
		System.out.println(String.format("%.7f", Math.PI*r*r));
		
	}
}

题目三:序列求和

问题描述:

求1+2+3+...+n的值。(时间限制:1.0s,内存限制:256.0MB;1 <= n <= 1,000,000,000。)

需要注意:

  • 用来保存结果的数据类型是哪种。

解决代码:

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        System.out.println((long)(1+n)*n/2);
    }
}

题目三:A+B问题

问题描述:

输入A、B,输出A+B。(时间限制:1.0s,内存限制:256.0MB;-10000 <= A, B <= 10000。)

解决代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        Integer a = sc.nextInt();
        Integer b = sc.nextInt();
        System.out.println(a + b);
    }
}
原文地址:https://www.cnblogs.com/syhyfh/p/12447745.html