k次方的首末三位

来源:互联网 发布:淘宝直通车从哪里进入 编辑:程序博客网 时间:2024/05/08 19:42

K次方

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 10   Accepted Submission(s) : 3

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

3123456 1123456 22100000056 67333

Sample Output

123...456152...936982...016
以前做过类似的。
求前3位采用科学计数法两边取对数的方法。
求后3位采用二分幂取模的方法。
可是我却用了找循环节!而且还找了两个半小时!真是浪费时间啊!
#include<iostream>#include<cmath>using namespace std;__int64 getansb( __int64 n,__int64 k ){ __int64 b; if( k==1 ) return n%1000; if( k==0 ) return 1; b=getansb( n,k/2 )%1000; b=(b*b)%1000; if( k%2==1 ) b=(b*n%1000); return b%1000;}int main(){ __int64 n,k;int T; scanf( "%d",&T ); while( T-- ) {    scanf( "%I64d %I64d",&n,&k );    double lo=k*log10(double(n));    double a=lo-int(lo);    a=pow(10.0,a);    while( a<1 )      a*=10;    int aa,ab,ac;    aa=int(a);    ab=int(a*10-aa*10);    ac=int(a*100-aa*100-ab*10);    printf( "%d%d%d...",aa,ab,ac );        __int64 b=getansb(n,k);    if( b<100 ) printf( "0" );    if( b<10 ) printf( "0" );    if( b==0 ) printf( "0\n" );    else printf( "%I64d\n",b );  }  return 0;}


d

原创粉丝点击