本文主要是介绍POJ2109_ Power of Cryptography,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意:
给你两个数,n,p ,求一个数K 使行 K^n == p.
题目测试样例与数据范围:
2 16 3 27 7 4357186184021382204544
4 3 1234其中 4^2 == 16,3^3==27,1234*7==4357184021382204544
注意 1<=n<=200,1<=p<10^101.
题目保证有解且 1<=k <10^9.
题目分析:
这是一个大数问题,所以我会第一考虑用java 。而且这是一个给定幂和结果,求底的题目,想到了二分答案。
java二分?没错。
小乐一下:java里头,Mid.pow(int n) 幂必须是整数。A.compaleTo(B) 是两个大数的比较,与字符串相比较是一样的,返回的是一个整数
当返回-1是说明A<B,当返回0里,说明A==B,当返回1里,说明A>B.还有在二分答案的时候,最后的结果是L,R,Mid?这个要看你具体
题目是如何定义,我们要如何判定的。
题目链接: http://poj.org/problem?id=2109
代码仅限于参考,更好更简洁的代码由你去实现,不要直接复制。
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubScanner cin = new Scanner(System.in);BigInteger p;int n;while(cin.hasNext()){//n = cin.nextBigInteger();n = cin.nextInt();p = cin.nextBigInteger();BigInteger L = BigInteger.valueOf(1);BigInteger R = p;BigInteger Mid = BigInteger.ONE;while(R.compareTo(L)>=0){Mid = L.add(R).divide(BigInteger.valueOf(2));int flag = Mid.pow(n).compareTo(p);if(flag==0) break;else if(flag<0) L = Mid.add(BigInteger.valueOf(1));else R = Mid.subtract(BigInteger.valueOf(1));}System.out.println(Mid);}}}
伟大的梦想成就伟大的人,从细节做好,从点点滴滴做好,认真做好。
这篇关于POJ2109_ Power of Cryptography的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!