k次方 求1个数的n次方的前三位数和后三位数

K次方

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 34   Accepted Submission(s) : 16
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

算法:

A、巧妙的思想,后三位用幂取模可以求出注意补0,总位数可利用t=k*log10((double)n)+1向上取整求出,前三位根据方程head=n^k/(10^(t-3))求出




#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int pow_mod(int a,int n,int m)
{
    if(n==0)
    return 1%m;
    long long x=pow_mod(a,n/2,m);
    x=(x*x)%m;
    if(n%2)
    x=(x*a)%m;
    return (int)x;
}
int main()
{
    int T,n,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);
        int t=k*log10((double)n)+1,head,tail;
        tail=pow_mod(n%1000,k,1000);
        for(head=100;log(head)<=k*log(n)-(t-3)*log(10);head++);
        head--;
        printf("%3d...%03d\n",head,tail);//不足3位补0
        
    }
    return 0;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值