首页 > 试题广场 >

数列的和

[编程题]数列的和
  • 热度指数:15280 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。


输入描述:
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。


输出描述:
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
示例1

输入

81 4
2 2

输出

94.73
3.41
不知道哪里出错了,答案明明是对的,就是一个例子都通不过。用Math.round保留小数是很常见的操作,为什么输出就不对呢???希望来日有大神解答。
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int n = sc.nextInt();
            int m = sc.nextInt();
            double tmp = n, sum = 0;
            while (m-- != 0) {
                sum += tmp;
                tmp = Math.sqrt(tmp);
            }
            // 用四舍五入保留整数的方式来保留小数
            sum = (Math.round(sum * 100)) / 100.0;
            System.out.println(sum);
        }
    }
}


发表于 2022-10-14 13:49:19 回复(0)
/*
二分法求根号x

求根号具备二分法的单调满足特性,所以可以用二分来求。
每二分一次相当于除以1个2,二分次数越多,精度越高。
二分10次=1/(2^10)=1/1000=0.001,即能精确到3位有效数字
二分50次=1/(2^50)=1/(10^15):能精确到15位左右有效数字(double精度极限)
*/
double sqrt(double x){
    //在区间[0,x]上找根号x
    double L=0,R=x+0.1,mid;
    //二分次数越多,区间[l,r]就越小,精度就越高,结果L就越逼近根号x
    for(int i=0;i<50;i++){//本题居然要二分50次左右才够,接近double精度(16位左右)极限!
        mid=(L+R)*0.5;
        if(mid*mid<=x) L=mid;//判断mid平方是否接近x,太小则去大区间上搜索
        else R=mid;//过大则缩小
    }
    return L;
}

编辑于 2021-03-17 20:19:11 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m;
        double n, result;
        // sc.hasNext() : 当控制台输入不是"-"时,就将其压入栈中,当输入为"-",栈不为空则弹出。
        while (sc.hasNext()){
            n = sc.nextInt();
            m = sc.nextInt();
            result = 0;
            for (int i = 0 ; i < m; i++){
                result += n;
                n = Math.sqrt(n);
            }
            System.out.println(String.format("%.2f", result));
        }
    }
}

发表于 2021-02-26 14:11:22 回复(0)
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {

    public static double sum(int m,int n){
        double total=0;
        double cur=m;
        int cnt=0;
        while(cnt<n){
            total+=cur;
            cur=Math.sqrt(cur);
            cnt++;
        }
        return total;
    }

    public static void main(String[] args) throws IOException {
        //因为不知道Scanner有hasNext()方法,所以参考了一下之前提交的用Buffered的方法
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str=null;
        while((str=br.readLine())!=null){
            String[] strs=str.split(" ");
            int num1=Integer.parseInt(strs[0]);
            int num2=Integer.parseInt(strs[1]);
            //这里用String的处理方法比较方便,当然也可以使用DecimalFormat之类的来完成,涨知识了
            System.out.println(String.format("%.2f", Main.sum(num1,num2)));
        }
    }
}

发表于 2020-06-05 20:21:47 回复(0)

问题信息

上传者:小小
难度:
5条回答 5604浏览

热门推荐

通过挑战的用户

查看代码
数列的和