NOJ 212题K尾相等数
        【摘要】  题目链接~~> 
       这题属于简单题,本来不想写进博客,但看了别人的优代码,真没想到那种方法,比较好。我用的快速幂然后开始遍历,时间可想而知。。。 
代码(本人): 
#include<stdio.h>int pow(int b,int m)//快速幂{ int ans=1; while(...
    
    
    
    这题属于简单题,本来不想写进博客,但看了别人的优代码,真没想到那种方法,比较好。我用的快速幂然后开始遍历,时间可想而知。。。
代码(本人):
  
   - 
    
     
    
    
     
      #include<stdio.h>
     
    
- 
    
     
    
    
     
      int pow(int b,int m)//快速幂
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
      int ans=1;
     
    
- 
    
     
    
    
      while(b)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
      if(b%2)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
     
       ans=(m*ans)%1000;
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
     
       b/=2;
     
    
- 
    
     
    
    
     
       m=(m*m)%1000;
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
      return ans;
     
    
- 
    
     
    
    
     
      }
     
    
- 
    
     
    
    
     
      int pss(int b,int n)
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
      int ans=1;
     
    
- 
    
     
    
    
      while(b)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
      if(b%2)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
     
       ans=n*ans;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
     
       b/=2;
     
    
- 
    
     
    
    
     
       n=n*n;
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
      return ans;
     
    
- 
    
     
    
    
     
      }
     
    
- 
    
     
    
    
     
      int main()
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
      int T;
     
    
- 
    
     
    
    
      long long m;
     
    
- 
    
     
    
    
      int i,j,k,x,y,q;
     
    
- 
    
     
    
    
      scanf("%d",&T);
     
    
- 
    
     
    
    
      while(T--)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
      scanf("%lld",&m);
     
    
- 
    
     
    
    
      if(m<1000)//让起点大于1000
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
     
       q=m;
     
    
- 
    
     
    
    
      for(i=1;i<=35;i++)
     
    
- 
    
     
    
    
      if(pss(i,q)>=1000)
     
    
- 
    
     
    
    
      break;
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
      else {
     
    
- 
    
     
    
    
     
       q=m%1000;
     
    
- 
    
     
    
    
     
       i=1;
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
      for(j=i;j<1000;j++)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
      int f=0;
     
    
- 
    
     
    
    
      for(k=i;k<j;k++)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
     
       x=pow(j,q);
     
    
- 
    
     
    
    
     
       y=pow(k,q);
     
    
- 
    
     
    
    
      if(x==y)
     
    
- 
    
     
    
    
     
       {
     
    
- 
    
     
    
    
     
       f=1;
     
    
- 
    
     
    
    
      break;
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
      if(f==1)
     
    
- 
    
     
    
    
      break;
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
      printf("%d\n",j+k);
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
      return 0;
     
    
- 
    
     
    
    
     
      }
     
    
 代码(优):
  
   - 
    
     
    
    
     
      #include<stdio.h>
     
    
- 
    
     
    
    
     
      int main()
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
      long int n,k,i;
     
    
- 
    
     
    
    
      scanf("%d",&n);
     
    
- 
    
     
    
    
     	while(n--)
     
    
- 
    
     
    
    
     
      	{
     
    
- 
    
     
    
    
     		scanf("%d",&k);
     
    
- 
    
     
    
    
      long int a[1000]={0},t,flag=0;
     
    
- 
    
     
    
    
      if(k>=1000)
     
    
- 
    
     
    
    
     
      		{
     
    
- 
    
     
    
    
     
      			k%=1000;
     
    
- 
    
     
    
    
     
       a[k]++;
     
    
- 
    
     
    
    
     
       flag=1;
     
    
- 
    
     
    
    
     
      		}
     
    
- 
    
     
    
    
      for(t=k,i=2;;i++)
     
    
- 
    
     
    
    
     
      		{
     
    
- 
    
     
    
    
     
       k=t*k;
     
    
- 
    
     
    
    
      if(flag==1||k>=1000)
     
    
- 
    
     
    
    
     
      			{
     
    
- 
    
     
    
    
     
       k%=1000;
     
    
- 
    
     
    
    
     
       a[k]+=i;
     
    
- 
    
     
    
    
      if(a[k]>i)//如果成立说明已经存过数
     
    
- 
    
     
    
    
      break;
     
    
- 
    
     
    
    
     
      			}
     
    
- 
    
     
    
    
     
      		}
     
    
- 
    
     
    
    
      printf("%d\n",a[k]);
     
    
- 
    
     
    
    
     
       }
     
    
- 
    
     
    
    
     
       }
     
    
 
  
  
文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nyist_zxp/article/details/9449365
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)