您的位置:首页 > 大数据 > 人工智能

UVa 11029 Leading and Trailing(log法求大数前3位)

2012-12-05 14:48 417 查看
题意:

给定n, k,求n^k的前3位和后三位。

思路:

1. 后三位司空见惯,利用快速幂取模,二分法快速求解。

2. 前三位要费点周折了,要用到库函数以及log (后面默认10为底),有了这些知识储备就可以巧妙的求解前3位了。

先分析对于n求其前3位,n很大:a = logn,于是有n = 10^a。分解a = i + d,i为a的整数部分,d为小数部分

n = 10^i * 10^d,由于10^i只会影响位数,所以真正影响n的前3位的是10^d,求出10^d就OK了

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

long long int foo(int n, int k)
{
if (k == 1)
return n % 1000;

long long int ans;

ans = foo(n, k >> 1);
ans = (ans * ans) % 1000;

if (k % 2)
ans = (ans * n) % 1000;

return ans;
}

void solve(int n, int k)
{
int t3 = foo(n, k);
int l3 = (int)pow(10, 2 + fmod(k*log10(n*1.0), 1));
printf("%d...%03d\n", l3, t3);
}

int main()
{
int cases;
scanf("%d", &cases);
while (cases--)
{
int n, k;
scanf("%d %d", &n, &k);
solve(n, k);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: