codeforces 869B The Eternal Immortality

题目链接:http://codeforces.com/contest/869/problem/B

题意:给你两个数a,b,求它们的阶乘相除得到的结果的最后一位的数字。

题目思路:题中给的数字很大,10的18次方,所以不能用int来做,我用了字符串string。

分情况:

1、当a为0的情况。我刚开始以为当a等于0的时候0的阶乘为0,但是后面发现我错了,0的阶乘是1。接着看b的位数。

(1)b的位数为1时,这样就直接开始用for循环进行阶乘,记住每次循环乘了以后要%10,这样可以保证数字不会很大。

(2)b的位数大于1时,肯定会有10出现,10的最后一位有0,所以最后乘出来的结果一定为0

2、当a不为0的情况。判断a和b的位数是否一样。

(1)a与b的位数一样且位数大于等于2时,判断它们是否除了最后一位其他都相同,如果都相同,则flag为1

(2)a与b的位数一样且位数等于1时,先算出a与b之间相差几个数,再用for循环做

(3)剩下的情况中肯定会有是10的倍数的数字,因此结果一定为0

3、当flag为1的时候,只需要计算最后一位就好了。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
const int maxn=1010;
const int INF=0x3f3f3f3f;
int main()
{
	string n,m;
	cin>>n>>m;
	int sum=1;
	int ans=0;
	int flag=0;
	int lenn=n.size(),lenm=m.size();
	if(n[0]=='0')
	{
		if(lenm==1)
		{
			for(int i=1;i<=m[0]-'0';i++)
			{
				sum*=i;
			    sum%=10;
			}
		}
		else
			sum=0;
	}
	else
	{
		if(lenn==lenm&&lenn>=2)
		{
			for(int i=lenn-2;i>=0;i--)
			{
				if(n[i]!=m[i])
				{
					flag=0;
					sum=0;
					break;
				}
				else
				{
					flag=1;
				}
			}
		}
		else if(lenn==lenm&&lenn==1)
		{
			for(int i=m[0]-'0';i>n[0]-'0';--i)
			{
				sum*=i;
				sum%=10;
			}
		}
		else
			sum=0;
	}
	int s=1;
	if(flag==1)
	{
		ans=m[lenn-1]-n[lenn-1];
		s=n[lenn-1]-'0'+1;
		for(int j=0;j<ans;j++)
		{
			sum*=s;
			sum%=10;
			s++;
		}
	}
	//cout<<m[lenn-1]<<" "<<n[lenn-1]<<endl;
	//cout<<s<<endl;
	//cout<<ans<<endl;
	cout<<sum<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/okimaru/article/details/81146849