您的位置:首页 > 编程语言 > PHP开发

暑期多校联合比赛 8-24 K次方

2012-08-24 21:08 253 查看
K次方
Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 14   Accepted Submission(s) : 7

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

所有在程式设计已经有点经验的人都知道,当k很大时你无法完整的表达出n k。例如: C语言的函数 pow(123456,455)能够用double资料型态来表达,但是你却无法得到所有正确的数字。然而,若是能知道一些最左边(leading)和最右边(trailing)数字的话,也可稍微得到一些满足。

Input

输入的第一行有一个整数T(T < 1001),代表有几组测试资料。接下来的T行,每行有2个正整数n和k。n可以用32位元的整数表达,而k<10000001。

Output

每组测试资料输出一行,输出LLL...TTT的样式。其中LLL代表n k的最左边3个数字,TTT代表n k的最右边3个数字。例如123456 2 = 15241383936,所以你应该输出152...936。

你可以假设n k至少有6位数。

Sample Input

3
123456 1
123456 2
2100000056 67333


Sample Output

123...456
152...936
982...016


Author

shenlizhong
 
 
 
 
题目大意:求n^k次方的左右各三位数   右三位想必大伙都会做,就是取右三位,再平方,再去右三位,再平方
至于最左边三位就是    假设n^k=b*10^x        b是小于1的小数
所以  klog10(n)=log10(b)+x                           x则是整数
所以    b=10^(klog10(n)-x);                         
所以    求出b的小数点后三位即可
 
program:(偷偷贴上杨烁的代码,偷懒啊)
 
 

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<math.h>

using namespace std;

#define max 1000000000

char a[100];__int64 num1;double num2;

__int64 fun1(__int64 a, int n)

    {

      __int64 t;

      if(n==1) return num1;

      else {

             t=fun1(a,n/2);

             if(n%2==0)return (t*t)%1000;//(t*t才有意义取模嘛)

             else return num1*((t*t)%1000)%1000;  //等待n等于1的返回

           }       

    }

double fun2(double n,double k)

    {

           double ans;

       //    printf("pow=%lf\n",k*log10(n)-floor(k*log10(n) ) );

           ans=pow(10,k*log10(n)-floor(k*log10(n) )  );

  //         printf("ans=%lf\n",ans);

          return ans;

    }

 

int  main()

{

    __int64 result,shu1;

    double shu3,ji=10;

    int shu2,n,k,i,len,;

   

    scanf("%d",&n);

    while(n--)

    {

         scanf("%s %d",a,&k);

         len=strlen(a);

         num1=(a[len-1]-'0')+(a[len-2]-'0')*10+(a[len-3]-'0')*100;

        

         ji=1 ;

         num2=0;       

         for(i=len-1;i>=0;i--)

         {

                 num2+=(double)(a[i]-'0')*ji;         //把字符串a化成整数存在变量num2中

                 ji*=10;

         }

         shu1=fun1(num1,k);

        

        // cout<<shu1<<endl;

        

        shu3=fun2(num2,(double)(k));

        shu2=(int)(shu3*100);

      

        if(shu1<10) printf("%d...00%I64d\n",shu2,shu1);

        else if(shu1<100) printf("%d...0%I64d\n",shu2,shu1);

             else     printf("%d...%I64d\n",shu2,shu1);   

    }

   

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fun output input 测试 语言 c