ACM_求N^N的前5位数和后5位数(数论)

Posted 霜雪千年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM_求N^N的前5位数和后5位数(数论)相关的知识,希望对你有一定的参考价值。

NNNNN

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

对于整数N,求N^N的前5位和后5位(1057题加强版)

Input:

多组测试数据,每组测试数据输入为一个整数n(6 <= n <= 10^9),n为0时结束。

Output:

对每组测试输出为两个整数a和b,由空格隔开,保留前后0,格式见样例。

Sample Input:

6
10
110
1001
0

Sample Output:

46656 46656
10000 00000
35743 00000
27196 01001
解题思路:①怎么求N^N的前5位数呢?我们有对一个数N,用科学计数法表示为N=a*10^m,此时a的整数部分即为N的最高位数字。假设b是最高位数字(0<b<10,b取整数),则a=b*10^4就是N^N的前五位数,所以N^N=b*10^m=a*10^(m-4),两边取对数得N*lg(N)=lg(b)+m=lg(a)+m-4;因为0<b<10(b取整数),所以0<=lg(b)<1为小数部分。令x=lg(b)+m=lg(a)+m-4(m为x的整数部分m=floor(x)),x=N*lg(N);则a=10^(x+4-m)=10^(x+4-(floor)x);这里用floor比较好(而不是int,或者long long),即返回不大于x的最大整数。
pow(x,y)函数计算x的y次幂。②至于求后5位数就更简单了,快速幂取余即可。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 int mod_pow(LL base,LL n,int mod){
 5     LL res=1;
 6     while(n>0){
 7         if(n&1)res=res*base%mod;
 8         base=base*base%mod;
 9         n>>=1;
10     }
11     return res;
12 }
13 int main()
14 {
15     int n;
16     while(cin>>n && n){
17         printf("%0.0f %05d\n",pow(10,n*log10(n)-floor(n*log10(n))+4),mod_pow(n,n,100000));
18     }
19     return 0;
20 }

 

以上是关于ACM_求N^N的前5位数和后5位数(数论)的主要内容,如果未能解决你的问题,请参考以下文章

c语言 一个整数的前n位数之和sum

求n!的位数数论

acm编程题:hdu1018,hdu1019

求这样的两个数据:5位数=2*4位数,9个数字各不相同

求数组总和的中位数

LightOJ - 1282 Leading and Trailing (数论)