hdu 1212 Big Number&第6回山東省試合Single Round Math(同余定理、大数型取り)
タイトルリンク:Big Number
毎回2つの数を入力して、1つ目は高精度で、2つ目の数は100000未満です;a mod bを求めます
同余の定理による:
(a+b)% c = (a%c+ b%c)%c
(a*b)%c = ( a%c* b%c)%c
したがって、大きな数については、例えば、123はこのように分解することができる.
123 = (1*10+2)*10 + 3;
123 % c = ( ( ( 1%c * 10%c)%c + 2%c) %c * 10%c) + 3 %c ) %c;
そこで,この数を文字列で処理し,最終的な残数をループにより解いた.
【コードは以下の通り】
この方法があって、筆者はまた第6回山東省試合のSingle Round Mathをやりました.
タイトルリンクSingle Round Math
题目要求:2つの数を入力して、それが等しいかどうかを判断して、更に11を取り除くことができるかどうかを判定して、もしYESを出力することができるならばNOを出力します;
すなわち、1つの数「奇数ビット」の和と、この数「偶数ビット」の和の差が11を割り切ることができれば、この数は11を割り切ることができる.
abs(num【奇数】-num【偶数】%11=0
毎回2つの数を入力して、1つ目は高精度で、2つ目の数は100000未満です;a mod bを求めます
同余の定理による:
(a+b)% c = (a%c+ b%c)%c
(a*b)%c = ( a%c* b%c)%c
したがって、大きな数については、例えば、123はこのように分解することができる.
123 = (1*10+2)*10 + 3;
123 % c = ( ( ( 1%c * 10%c)%c + 2%c) %c * 10%c) + 3 %c ) %c;
そこで,この数を文字列で処理し,最終的な残数をループにより解いた.
【コードは以下の通り】
#include <iostream>
using namespace std;
int main()
{
string a;
int b;
while(cin>>a>>b)
{
int len=a.length();
int ans=a[0]-48;
if(len>1)
{ for(int i=1;i<len;i++)
{
ans=((ans*10)+a[i]-48)%b;
}
cout<<ans<<endl;
}
else
{
int ans=(a[0]-48)%b;
cout<<ans<<endl;
}
}
return 0;
}
この方法があって、筆者はまた第6回山東省試合のSingle Round Mathをやりました.
タイトルリンクSingle Round Math
题目要求:2つの数を入力して、それが等しいかどうかを判断して、更に11を取り除くことができるかどうかを判定して、もしYESを出力することができるならばNOを出力します;
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
string a="",b="";
while(n--)
{
cin>>a>>b;
if(a==b)
{
int len=a.length();
int ans=a[0]-48;
for(int i=1;i<len;i++)
{
ans=(ans*10+a[i]-48)%11;
}
if(ans==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
else
cout<<"NO"<<endl;
}
return 0;
}
初めてこの問題をしたのは法則を見つけた--11の倍数は法則があるすなわち、1つの数「奇数ビット」の和と、この数「偶数ビット」の和の差が11を割り切ることができれば、この数は11を割り切ることができる.
abs(num【奇数】-num【偶数】%11=0
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
string a="",b="";
cin>>a>>b;
if(a==b)
{
int cnt1=0;
int cnt2=0;
int len=a.length();
for(int i=0;i<len;i++)
{
if(i%2)
cnt1+=(a[i]-48);
else
cnt2+=(a[i]-48);
}
if((int)(abs(cnt1-cnt2))%11==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
else
cout<<"NO"<<endl;
}
return 0;
}