HDU 1061 RIGHTMOST DIGIT

饿。。。自己用的是一个求周期从而增加时间效率的算法。。。如下:

#include<stdio.h>
#include<math.h>
#include<string.h>

int main()
{
	char a[10];
	int t,n,i,len,p,N,j,T,pp;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		T=0;
		scanf("%s",a);
		sscanf(a,"%d",&N);
		len=strlen(a);

		if(a[0]=='0')
		{
			printf("0\n");
			continue;
		}
		else
		{
			p=a[len-1] - '0';
			pp=p;
			while(1)
			{
				p=p*pp;
				if(p>10)p%=10;
				T++;
				if(p==pp)
					break;
			}

			if(N>T && N%T !=0 ) t=N%T;
			else if(N>T && N%T ==0) t=T;
			else t = N ;

			p=pp;

			for (j=0;j<t-1 ;j++ )
			{
				p*=pp;
				if(p>10)p%=10;
			}
			printf("%d\n",p);
		}


		memset(a,'\0',len);
	}
	

}

另外一个找规律的代码(以诚兄写的。。简洁多了。。)

#include <iostream>

#include <math.h>

using namespace std;


int main()
{

	int T;

	cin>>T;

	while(T--)

	{

		int n;

		cin>>n;

		int ge=n%10,times=n%4;

		if (times==0)

			times=4;

		int ans=(int)pow((double)ge,times)%10;

		cout<<ans<<endl;

	}

	return 0;

}

其实这题的主流解法是快速幂:

#include<stdio.h>
#include<string.h>

int pow(int a,int k)
{
	int rec=1;
	while(k)
	{
		if (k&1)   //k%2
		{
			rec*=a;
		}
		a*=a;
		k>>=1;     //k/=2
	}
	return rec;
}

int main()
{
	int a,b,c;
	scanf("%d%d",&a,&b);
	c=pow(a,b);
	printf("%d\n",c);
}

根据HDU1061进行的改动:

#include<stdio.h>
#include<string.h>

int pow(int a,int k)
{
	int rec=1;
	while(k)
	{
		if(a>=10) a%=10;             //防止a过大而溢出
		if (k&1)   //可换为k%2
		{
			rec*=a;
			if(rec>=10) rec%=10;     //取尾数
		}
		a*=a;
		if(a>=10) a%=10;              //取尾数
		k>>=1;     //可换为k/=2
	}
	return rec;
}

int main()
{
	int n;
	int a;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&a);
		printf("%d\n",pow(a,a));
	}
}
posted @ 2011-02-14 21:04  谁也打不过  阅读(286)  评论(0编辑  收藏  举报