zcmu 1755(大數問題)

題目鏈接:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1755

思路:大數相減,取餘,注意前導零和大小關係。

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
void sp(string &s1,string &s2)
{
	int l1=s1.length(),l2=s2.length();//cout<<s1.length()<<" "<<s2.length()<<endl;
	string tmp;
	if(l1>l2) tmp=s1,s1=s2,s2=tmp;
	else if(l1==l2)
	{
		int fg=0;
		for(int i=0;i<l1;i++)
			if(s1[i]>s2[i])
			{
				fg=1;break;
			}
		if(fg) tmp=s1,s1=s2,s2=tmp;
	}
}
string minu(string s1,string s2)
{
	int cnt,i,j,l1=s1.length(),l2=s2.length();
	string s3;
	for(i=l2-1,j=l1-1;i>=0;i--,j--)
	{
		cnt=s2[i]-(j>=0?s1[j]:'0');
		if(cnt<0)
		{
			cnt+=10;
			if(i>0) s2[i-1]--;
		}
		s3+=(cnt+'0');
	}
	i=l2-1;
	while(s3[i]=='0') i--;
	if(i<0) return "0";
	s2.clear();
	for(;i>=0;i--) s2+=s3[i];
	return s2;
}
int pd(string s)
{
	int l=s.length(),i,cnt=0;
	for(i=0;i<l;i++)
	{
		cnt=cnt*10+s[i]-'0';
		cnt=cnt%17;
	}
	if(cnt==0) return 1;
	else return 0;
}
int main(void)
{
	string s1,s2,tp;
	while(cin>>s1)
	{
		if(s1=="0") break;
		s2.clear();tp.clear();
		int i,l=s1.length();
		int cnt=(s1[l-1]-'0')*5;
		//cout<<cnt<<endl;
		//s1.pop_back();
		//cout<<s1<<endl;
		for(i=0;i<l-1;i++) tp+=s1[i];
		s1=tp;
		s2+=(cnt/10+'0');
		s2+=(cnt%10+'0');
		sp(s1,s2);
		//<<s1<<" "<<s2<<endl;
		s1=minu(s1,s2);
		if(s1=="0")
		{
			cout<<0<<endl;continue;
		}
		//cout<<s1<<endl; 
		if(pd(s1)==1) cout<<1<<endl;
		else cout<<0<<endl;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章