关于左位右位的问题

n的n次方最右位

用快速幂做

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int fast_pow(ll a,ll b,ll c)
{
    int ans=1;
    a%=c;
    while(b)
    {
        if(b&1)
        {
            ans=a*ans%c;
        }
        a=a*a%c;
        b>>=1;
    }
    return ans%c;
}
int main()
{
    ll n,a,ans=0;
    scanf("%lld",&n);
    while(n--)
    {
        scanf("%lld",&a);
        ans=fast_pow(a,a,10);
        printf("%lld\n",ans);
    }
    return 0;
}

n的n次方最左位

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. 
         

解题思路:因为N^N可以写作a*10^k的形式,输出强制转化为整形的a就表示的最高位,然后比如说3*3*3=27,就可以写作2.7*10^1的形式。所以k就代表的是结果的位数-1,所以k=(int)log10(n^n)+1-1。因为n^n=a*10^k所以log10(n^n)=log10(a)+log10(10^k).可以知道n*log10(n)=log10(a)+k,所以a=10^(n*log10(n)-k)。 

#include <stdio.h>
#include <math.h>
int main()
{
    int i,k;
    double n,a;
    while(scanf("%lf",&n)!=EOF)
    {
        k=n*log10(n);
        a=pow(10,(n*log10(n))-k);
        printf("%d\n",(int) a);
    }
    return 0;
}

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
    int n,m;
    double x;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&n);
        x=n*log10((double)n);
        x-=(ll)x;
        x=(int)pow(10,x);
        printf("%.0lf\n",x);
    }
}

n的阶乘右面第一个不为0的数

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
    ll n,i,ans=1;
    scanf("%lld",&n);
    for(i=1;i<=n;i++)
    {
        ans*=i;
        while(1)
        {
            if(ans%10!=0)
                break;
            ans/=10;
        }
        ans%=10000;
    }
    printf("%lld\n",ans%10);
    return 0;
}

n的阶乘末尾0的个数

输入:

6
3
60
100
1024
23456
8735373

输出:

0
14
24
253
5861
2183837

一个数 n 的阶乘末尾有多少个 0 取决于从 1 到 n 的各个数的因子中 2 和 5 的个数, 而 2 的个数是远远多余 5 的个数的, 因此求出 5 的个数即可. 题解中给出的求解因子 5 的个数的方法是用 n 不断除以 5, 直到结果为 0, 然后把中间得到的结果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0, 则 1 到 100 中因子 5 的个数为 (20 + 4 + 0) = 24 个, 即 100 的阶乘末尾有 24 个 0.

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
    ll n,i,sum=0,m;
    scanf("%lld",&n);
    while(n--)
    {
        sum=0;
        scanf("%lld",&m);//635有4个5
        while(m>=5)
        {
            sum+=m/5;
            m/=5;
        }
        printf("%lld\n",sum);
    }

    return 0;
}

 

posted @ 2018-08-30 11:34  ~~zcy  阅读(374)  评论(0编辑  收藏  举报