码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1212 Big Number &第六届山东省赛Single Round Math (同余定理,大数取模)

时间:2015-05-23 14:16:41      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:大数   acm   大数对int取模   

题目链接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;
}


hdu1212 Big Number &第六届山东省赛Single Round Math (同余定理,大数取模)

标签:大数   acm   大数对int取模   

原文地址:http://blog.csdn.net/chaiwenjun000/article/details/45933827

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!