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

uva 11029 Leading and Trailing

2015-04-18 15:48 337 查看
题目大意:

  输入两个数,分别是n,k,求nk的前三位,后三位,保证nk至少有6位。

解题思路:

  求前三位,因为后面的数字可能会影响前三位,double可以保证一部分精度又不至于会溢出,所以可以用二分快速幂+double来求前三位。

  求后三位,因为前面的数字不会影响到后三位,所以不用考虑精度,可直接用二分快速幂来求前三位,边乘边取余

代码:

  

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;

#define maxn 16005
int a[maxn];

double solve (double x)//求前三位的时候,控制x在1000以内
{
while (x >= 1000)
x /= 10;
return x;
}

int high (int n, int k);
int low (int n, int k);

int main ()
{
int t, n, k, l = 1;
scanf ("%d", &t);
while (t --)
{
scanf ("%d %d", &n, &k);
printf ("Case %d: %03d %03d\n", l++, high(n, k), low(n, k));//后三位可能出现第一位是零的时候
}
return 0;
}

int high (int n, int k)
{
double x, y = 1;
x = n;
x = solve(x);
while (k)
{
if (k % 2)
y *= x;
x *= x;
k /= 2;
x = solve (x);
y = solve (y);
}
return (int)y;
}

int low (int n, int k)
{
int m = 1;
n %= 1000;
while (k)
{
if (k % 2)
m = (m * n) % 1000;
n = (n * n) % 1000;
k /= 2;
}
return m;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: