题目链接:Big Number
题目大意:每次输入两个数,第一个是高精度,第二个数小于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; }
有了这个方法,笔者又去做了一遍第六届山东省赛的Single Round Math
题目链接 Single Round Math
题目要求: 输入两个数,判断其是否相等 如果相等,再判定是否能够整除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的倍数是有规律的
就是如果一个数“奇数位” 的和,和 这个数“偶数位”的和的差 能够整除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; }
时间: 2024-10-15 01:31:22