• 今日算法题


    题目一: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);
        }
    }
    
  • 相关阅读:
    机器学习笔记之K近邻算法
    [C++基础]在子类中向父类的构造函数传递参数的小例子,包括类中常量的初始化
    POJ2709 染料贪心
    POJ2337 欧拉路径字典序输出
    POJ2337 欧拉路径字典序输出
    POJ1042 贪心钓鱼
    POJ3228二分最大流
    POJ3228二分最大流
    POJ3498最大流,枚举终点,企鹅,基础最大流
    POJ3498最大流,枚举终点,企鹅,基础最大流
  • 原文地址:https://www.cnblogs.com/syhyfh/p/12447745.html
Copyright © 2020-2023  润新知