2 16 3 27 7 4357186184021382204544 0 0
4 3 1234
这个题目出题者想要我们用二分查找或者是用牛顿迭代,却没想到直接用公式就可以做出来啊,公式水过~
pow()这个函数用法好多啊,转换一下思维就可以求开方了,比如 16的4分之一次方就等于 2,注意这个函数要是double浮点数,后面用分数的形式~
这个题如果用公式做用java就没什么优势啦~公式题还是用c/c++吧~;
c代码(公式法)
 
#include<stdio.h>
#include<math.h>
int main()
{
double n,p,x;
while(scanf("%lf%lf",&n,&p)!=EOF)
{
if(n==0&&p==0) return 0;
printf("%.lf\n",pow(p,1.0/n));
}
return 0;
}        
看了别人用二分法写的代码,效率也感觉也差不多~
 
 
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
    //freopen("Input.txt","r",stdin);
    //freopen("Output1.txt","w",stdout);
    long mid,left,right;
    double p;
    int n;
    while(~scanf("%d%lf",&n,&p)){
        if(n==0 && p==0.0) break;
        left=0,right=1000000000;
        while(left<right)
        {
            mid=(left+right)/2;
            if(pow(mid,n)==p) break;
            if(pow(mid,n)<p)left=mid;
            if(pow(mid,n)>p)
                right=mid;
        }
        //printf("%lf\n",p);
        printf("%ld\n",mid);
    }
    return 0;
}
                
下面是java写的代码:用时和内存都比c写的要多的多
package com.nyist;
import java.util.Scanner;
public class nyist773 {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		while(cin.hasNext())
		{
			 int n=cin.nextInt();  
			 double p=cin.nextDouble();  
			 if(n==0&&p==0)
				     break;
			 System.out.println(String.format("%.0f", Math.pow(p, 1.0/n)));  
		}
	}
}
最近两天大数题水的够多了,对java的大数类积累了一点知识吧,还是没达到那种熟练的地步,还是要不断的练习!!!  nyist 773 开方数(大数问题),布布扣,bubuko.com
原文:http://blog.csdn.net/whjkm/article/details/25320225