poj 2109

看到下面的数据,怎么看怎么不像是贪心,表示怀疑-> _ ->
题目大意:密码学的力量(是这个意思吧)
当前的密码学中包括(除了别的之外)large prime (大素数??)和 计算的数字在这些素数之间。在这一领域工作的结果在实际运用的结果从数论的结果和数学的其他分支曾被认为是唯一的理论兴趣。(好吧,还是不知道这句话是什么意思,略晕。)这个问题涉及到整数根的高效计算。
给你一个整数n, n >= 1, 并且一个整数p, p>=1,你需要写一个程序确定p的第n个整数根。这个问题中,给你一些整数n和p,p将永远是k到第n的形式(真心不理解啊!!!),对于一个整数k(这个整数是你的程序必须找到什么。)
输入包含两个整数n和p, 1<=n<=200, 1<=p<=10^101,并且存在一个整数k, 1 <= k <= 10^9 例如 k^n = p;
题目的形容很是晦涩难懂,不过实际上只要最后一句就OK了,就是求那个K,坑啊。可以很明显看出来应该是一个大数,没有明天为啥是贪心,要求原来的数是多少,貌似要不断求开方,怎么开啊????
好吧,暂时没有什么好的思路,先放着!!
2014/12/02 16:03
有点想法了,可以用二分逼近找K,用快速幂求结果对10^9取余,只匹配最后几位,嘎嘎,不知道会不会对呢???试试吧
仔细一想取余貌似不行,不过又发现n不是太大,所以直接求吧
2014/12/02 17:00
竟然1A,好激动啊,嘎嘎

 #include<stdio.h>

#include< string.h>
#include<stdlib.h>
#include<math.h>

#define INF 1000000000
#define maxn 1005
long  long a[maxn], b[maxn], bn;

int compaer( int A,  int B); // 返回0相等,返回负数这个数的B次方小于s,否则大于返回正数
void Pow( int A,  int B);

int main()
{
     char s[maxn];
     int B;

     while(scanf( " %d%s ", &B, s) != EOF)
    {
         int Start =  1, End = INF, Mid;

         for(bn= 0; s[bn]; bn++)
            b[bn] = s[bn] -  ' 0 ';

         while(Start <= End)
        {
            Mid = (Start + End) /  2;

             int k = compaer(Mid, B);

             if(k ==  0) break;

             if(k <  0)
                Start = Mid +  1;
             else
                End = Mid -  1;
        }

        printf( " %d\n ", Mid);
    }

     return  0;
}
int compaer( int A,  int B) // 返回0相等,返回负数这个数的B次方小于s,否则大于返回正数
{
     int k = B * log10(A) +  1;

     if(k != bn)
         return k - bn;
    Pow(A, B);

     for( int i= 0; i<bn; i++)
    {
         if(a[i] != b[i])
             return a[i] - b[i];
    }

     return  0;
}
void Pow( int A,  int B)
{
     int i, j, k= 0, c[maxn] = { 1};

     for(i= 0; i<B; i++)
    {
         for(j= 0; j<=k; j++)
            c[j] *= A;
         for(j= 0; j<=k; j++)
        {
            c[j+ 1] += c[j] /  10;
            c[j] %=  10;

             if(c[k+ 1])k++;
        }
    }

     for(i= 0; i<bn; i++)
        a[i] = c[k--];

} 

转载于:https://www.cnblogs.com/liuxin13/p/4137962.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值