求n的n此方的最后一位:
#include#include #include 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#include #include #include 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#include #include #include 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#include 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);}