首页 > 试题广场 >

数列的和

[编程题]数列的和
  • 热度指数:14921 时间限制: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
import java.util.*;

public class Main {
    private static final int MAX = 1005;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            double n = sc.nextDouble();
            int m = sc.nextInt();
            double ans = 0;
            for (int i = 0; i < m; i++) {
                ans += n;
                n = Math.sqrt(n);
            }
            System.out.printf("%.2f\n", ans);
        }
    }
}
发表于 2019-02-28 15:30:51 回复(2)
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        double sum=0;
        double a=n;
        for(int i=0;i<m;i++) {
            sum+=a;
            a=sqrt(a);
            if(a<0.0001)
                break; //因为精度要求保留2位小数,所以此时后面的位数可以不用了
        }
        printf("%.2f\n",sum);
    }
    return 0;
}

发表于 2021-05-04 16:46:26 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF){
        double s = 0, x = (double)n;
        for(int i=1;i<=m;i++){
            s += x;
            x = sqrt(x);
        }
        printf("%.2f\n", s);
    }
    return 0;
}

发表于 2020-12-19 23:48:12 回复(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)


输入2个数据,N:需要执行平方根的数据。M:需要计算的前多少项
前多少项,所以,用到for循环。
需要输入的数据有多组,因此需要判断控制台是否还有数据输入,in.hasnext()
平方根调用Math.sqrt(),
平方根之后再平方根,连续对N开平方,N=Math.sqrt(N)
import java.util.Scanner;
public class Main {
	public static void main(String args[]) {
		
		Scanner in=new Scanner(System.in);
		
		while(in.hasNext()) {
			
			double N=in.nextDouble();  //数据
			int M=in.nextInt();  //前m个
			double result=0;     //和
			
			for(int i=0;i<M;i++) {
				result+=N;   //第一个数是N本身
				N=Math.sqrt(N);
			}
			System.out.printf("%.2f\n",result);    
		}
			
	}
}


发表于 2020-06-10 16:34:16 回复(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)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int main()
{
    double n = 0.00;
    long long m = 0;
    while (scanf("%lf %lld", &n, &m) != -1)
    {
        double q = n;
        for (long long i = 1; i < m; i++)
        {
            q += sqrt(n);
            n = sqrt(n);
        }
        printf("%.2f\n", q);
    }
    return 0;
}
发表于 2024-01-11 17:12:25 回复(1)
import math

while True :
    try:
        n, m = map(int, input().split())
        result=0
        for i in range(m):
            result= result + n
            n=math.sqrt(n)
        print("{:.2f}".format(result))
    except:
        break

编辑于 2024-02-07 15:54:32 回复(0)
#include <stdio.h>
#include <math.h>
int main() {
    int m, n;
    while(scanf("%d%d", &n, &m)!= EOF)
    {
        double n1 = n;
        double sum = 0;
        for (int i = 1; i <= m; i++)
        {
            sum += n1;
            n1 = sqrt(n1);
        }
        printf("%.2lf\n", sum);
    }
    return 0;
}

发表于 2023-11-20 10:24:33 回复(0)
package main

import (
    "fmt"
    "math"
)

func main() {
    var n,m float64
    for{
        _,err:=fmt.Scan(&n,&m)
        if err!=nil{
            break
        }
        var sum float64
        for m>0{
            sum+=n
            n=math.Sqrt(n)
            m--
        }
        fmt.Printf("%.2f\n",sum)
    }
}

发表于 2023-03-04 19:35:28 回复(0)
不知道哪里出错了,答案明明是对的,就是一个例子都通不过。用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)
while(str = readline()){
     var lines = str.split(' ');
    var total =0;
    var x =Number(lines[0]);
    for(let i =0 ;i<lines[1];i++){
        total += x;
        x=Math.sqrt(x);
    }
    total = (total).toFixed(2);
    console.log(total)
    
}

发表于 2022-08-31 09:51:56 回复(0)
#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

int main() {
    int n, m;
    while (cin >> n >> m) {
        double sum = n;
        double sqrt_ = sqrt(n);
        for (int i = 0; i < m-1; i++) {
            sum += sqrt_;
            sqrt_ = sqrt(sqrt_);
        }
        
        cout << fixed << setprecision(2) << sum << endl;
    }
}

发表于 2022-08-30 23:40:46 回复(0)
#include<stdio.h>
#include<math.h>

double sum(int n,int m){
    double num=n,sum=0;
    for(int i=0;i<m;i++){
        sum+=num;
        num=sqrt(num);
    }
    return sum;
}

int main()
{
    int n=0,m=0;
    while(scanf("%d %d",&n,&m)!=EOF){
        printf("%.2f\n",sum(n,m));
    }
    return 0;
}

发表于 2022-07-28 18:00:24 回复(0)
#include<stdio.h>
#include<math.h>
int main()
{
    int n,m;
   while(scanf("%d%d",&n,&m)!=EOF)
   {
       double count=0;//double精确度更高
       double k=n;
       for(int i=0;i<m;i++)
       {
           count+=k;
           k=sqrt(k);//进行迭代运算
       }
       printf("%.2f\n",count);
   }
    return 0;
}

发表于 2022-02-21 17:58:52 回复(0)
#include<stdio.h>
#include<math.h>
int main()
{
    double n,m;
     while(scanf("%lf%lf",&n,&m)!=EOF)
     {
         double sum=0.0;
         for(int i=0;i<m;i++)
         {
             sum+=n;
             n=sqrt(n);
         }
         printf("%.2lf\n",sum);
     }
    return 0;
}

发表于 2022-02-02 00:59:51 回复(0)
var obj=new Map()
var str
var sum=0
while(str=readline()){
    var n=str.split(' ')[0]
    var m=str.split(' ')[1]
    obj.set(n,m)
}
obj.forEach((value,key)=>{
    var m=value
    var n=parseInt(key)
    sum=n
    
    for(var i=1;i<m;i++){
        n=Math.sqrt(n)
        sum+=n
       
    }
console.log(sum.toFixed(2))
})

发表于 2022-01-28 21:31:11 回复(0)
#include<stdio.h>
#include<math.h>
int main()
{
    int n=0;
    int m=0;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        double sum=0;//这里用float不行
        double t=n;
        int i=0;
        for(i=0;i<m;i++)
        {
            sum+=t;
            t=sqrt(t);
        }
        printf("%.2f\n",sum);
    }
    return 0;
}

发表于 2022-01-21 21:14:58 回复(0)
package main

import (
	"errors"
	"fmt"
	"io"
)

func main() {
	var n, m int
	var num int
	var err error
	num, err = fmt.Scanln(&n, &m)
	for  num != 0 && err != errors.New(io.EOF.Error()) {
		sum := 0.0
		var tmp float64 = float64(n)
		//求tmp平方根
		for i := 0; i < m; i++ {
			sum += tmp
			tmp = mySqrt(tmp)
			if tmp < 0.0001 {
				goto next //精度要求哦i
			}
		}
		fmt.Printf("%.2f\n", sum)
	next:
		num, err = fmt.Scanln(&n, &m)
	}
}

//牛顿迭代法  f(x)=x*x - C   求零点
func mySqrt(x float64) float64 {

	y, check := 1.0, 0.0
	fx := float64(x)
	y = (fx/y + y) / 2.0
	check = y*y - fx
	for check > 0.001 {
		y = (fx/y + y) / 2.0
		check = y*y - fx
	}
	return y
}

发表于 2022-01-07 09:59:05 回复(0)

问题信息

上传者:小小
难度:
34条回答 3625浏览

热门推荐

通过挑战的用户

查看代码