lightoj 1282 && uva 11029

Leading and Trailing

lightoj 链接:http://lightoj.com/volume_showproblem.php?problem=1282

uva 链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1970

题意:给定 n, k ,求 nk 的前3位和后三位的值。

思路1、前 3 位:把 nk 转化为 a.bc * 10,两边取 10 的对数得到 k * lg(n) = m + lg(a.bc)  ( lg(a.bc) < 1 ) 。 所以把 k * lg(n) 减掉整数部分(即 m )就可以得到

lg(a.bc) , 然后计算 10 lg(a.bc) * 100 就能得到答案。

  2、后3位:把 k 化成二进制的数,进行快速幂取模运算,没难度。

代码

lightoj 1282 代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 int n, k;
 8 
 9 int front(int n, int k)    //前3位
10 {
11     double s = k*log10(n) - (int) (k*log10(n));    //取对数
12     s = pow(10, s);
13     return s * 100;
14 }
15 
16 int rear(int n, int k) //后3位    
17 {
18     if(!k)    return 1;    //快速幂
19     LL s = rear(n, k/2);
20     if(k&1)    s = s*s % 1000 * n % 1000;
21     else    s = s*s % 1000;
22     return s % 1000;
23 }
24 
25 int main()
26 {
27     int t, i;
28     cin >> t;
29     for(i = 1; i <= t; ++i)
30     {
31         scanf("%d%d", &n, &k);
32         printf("Case %d: %d %03d\n", i, front(n, k), rear(n, k));
33     }
34     return 0;
35 }

 

uva 11029 代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 int n, k;
 8 
 9 int front(int n, int k)    //前3位
10 {
11     double s = k*log10(n) - (int) (k*log10(n));    //取对数
12     s = pow(10, s);
13     return s * 100;
14 }
15 
16 int rear(int n, int k) //后3位
17 {
18     if(!k)    return 1;    //快速幂
19     LL s = rear(n, k/2);
20     if(k&1)    s = s*s % 1000 * n % 1000;
21     else    s = s*s % 1000;
22     return s % 1000;
23 }
24 
25 int main()
26 {
27     int t;
28     cin >> t;
29     while(t--)
30     {
31         scanf("%d%d", &n, &k);
32         printf("%d...%03d\n", front(n, k), rear(n, k));
33     }
34     return 0;
35 }

 

转载于:https://www.cnblogs.com/Duahanlang/p/3223392.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值