思维(数学)

求n的n此方的最后一位:

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

 

求n的n此方的最高位: 

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    long long int t,a,ans,b,c,ge;
    scanf("%lld",&t);
    while(t--)
    {
        ge=0;
        scanf("%lld",&a);
        double p=a*log10(a*1.0);
        p-=(long long int)p;
        int pp=pow(10.0,p);
        printf("%d\n",pp);
    }
    return 0;
}

 

求n的介乘的有多少个零:

思路:

0的来源是5×2,1--n中的数如果能被2整除或被5整除 ,就可以看作2或5,而2是每两个就会有一个2,5则是每5个才有一个5,所以2的个数比5的多,求零的个数只需求5的个数即可。

 所以看 1遍历到n ,每个数能分成的5的个数,因为每五个才有一个五,所以先用n/5,1--n中就知道是有多少能被5整除的,而n/25就是知道有多少能被25整除的,而在n/25中五的个数为n/25 ×2,在第一遍中 都除了5所以而且都加了一遍,所以第二边中只需要除5在加一遍,以此类推当,代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long int ll;
int main()
{
    ll n,a,ans=0;
    scanf("%lld",&n);
    while(n--)
    {
        scanf("%lld",&a);
        ans=0;
        while(a)
        {
            ans+=a/5;
            a/=5;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

 

 求n的介乘倒数第一位不为零的数是多少:

思路:

对于每一个能把五整除的都除5(即:把五都弄没,这样就不会有零了),记录有5的个数,对应的,去掉一样个数的二,这样最后%10,就是最终答案。

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    int n,a[5000],cnt=0,ans=1,i;
    scanf("%d",&n);
    for(i=n; i>=1; i--)
    {
        a[i]=i;
        while(a[i]%5==0)
        {
            a[i]/=5;
            cnt++;
        }
    }
    for(i=n; i>=1; i--)
    {
        if(cnt==0)
            break;
        while(a[i]%2==0&&cnt>0)
        {
            a[i]/=2;
            cnt--;
        }
    }
    for(i=1; i<=n; i++)
    {
        ans*=a[i];
        ans%=10;
    }
    printf("%d",ans);
}

 

posted @ 2018-09-04 19:49  我的秘密小屋  阅读(164)  评论(1编辑  收藏  举报