您的位置:首页 > 其它

(hdu 1060 ,1061)求N^N的最高位和最低位(取对数,快速幂)

2017-08-18 12:31 381 查看
hdu 1060 Leftmost Digit

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 18542 Accepted Submission(s): 7302

Problem Description

Given a positive integer N, you should output the leftmost digit of N^N.

Input

The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.

Each test case contains a single positive integer N(1<=N<=1,000,000,000).

Output

For each test case, you should output the leftmost digit of N^N.

Sample Input

2

3

4

Sample Output

2

2

Hint

In the first case, 3 * 3 * 3 = 27, so the leftmost digit is 2.

In the second case, 4 * 4 * 4 * 4 = 256, so the leftmost digit is 2.

Author

Ignatius.L

题意:求n^n(1<=n<=10^9)的最左边的数

分析:对于任意一个大于1的数可以用科学计数法表示,因此

设n^n=a.b*10^k,a为整数位的数,b为小数位的数,k为指数(整数), a就是题目所求

两边取对数, nlg(n)=lg(a.b*10^k)=lg(a.b)+k

即能求出a=(int)pow(10,nlg(n)-k)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int N=1e5+5;
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
double tmp=n*log10(n);
double ans=pow(10,tmp-(LL)tmp);///注意这里的tmp可能会溢出,要强制转化为long long
//      printf("tmp=%.2lf  ans=%.2lf\n",tmp,ans);
printf("%d\n",(int)ans);
}
return 0;
}


hdu 1061 Rightmost Digit

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 57677 Accepted Submission(s): 21848

Problem Description

Given a positive integer N, you should output the most right digit of N^N.

Input

The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.

Each test case contains a single positive integer N(1<=N<=1,000,000,000).

Output

For each test case, you should output the rightmost digit of N^N.

Sample Input

2

3

4

Sample Output

7

6

Hint

In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7.

In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.

Author

Ignatius.L

题意:求n^n的最右边的数

分析:容易知道最右边的数只与n的最低位有关,那么接下来要做的就是求n^n,快速幂就能得到

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int N=1e5+5;
int a
;
int pow_mod(int a,int b,int mod)
{
int ans=1;
a%=mod;
while(b)
{
if(b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main()
{
int n,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int ans=pow_mod(n,n,10)%10;
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速幂 取对数