您的位置:首页 > 其它

POJ 2305大数求余

2015-09-13 21:00 309 查看
一开始是的想法是用减法代替除法,一直减到被减数小于减数,所得的被减数就是余数。为了方便编程,还在减法中对齐了被减数和减数的位数。但过程还是比较麻烦,会超时。

#include "stdafx.h"
#include<string>
#include<iostream>
using namespace std;
int b;
string decrease(string p, string cut)
{
int diff=p.size()-cut.size();
if(diff!=0)
{
cut=string(diff,'0')+cut;
}
int len=p.size()-1;
int flag=0;
for(int i=len;i>=0;i--)
{
if(p[i]>=cut[i])
p[i]=p[i]-cut[i]+'0';
else if(p[i]<cut[i])
{
if(p[i-1]>='1')
{
p[i-1]-=1;
p[i]=p[i]+b-cut[i]+'0';
}
else if(p[i-1]=='0')
{
int j=i-2;
while(p[j]=='0')
p[j--]='0'+b-1;
p[j]-=1;
p[i-1]=0+b-1;
p[i]=p[i]+b-cut[i]+'0';
}
}
if(p[i]!='0')
flag=i;
}
return p.substr(flag,len+1-flag);
}
int _tmain(int argc, _TCHAR* argv[])
{
string p,m;
while(1)
{
cin>>b;
if(b==0)
break;
cin>>p>>m;
while(p.size()>m.size()||(p.size()==m.size()&&p>=m))
{
int diff=p.size()-m.size();
string add1(diff,'0');
string cut=m+add1;
if(p>=cut)
{
while(p.size()==cut.size()&&p>=cut)
p=decrease(p,cut);
}
else if(p<cut)
{
string add2(diff-1,'0');
cut=m+add2;
while(p.size()>cut.size())
p=decrease(p,cut);
}
}
cout<<p<<endl;
}
return 0;
}


后来参考了http://blog.sina.com.cn/s/blog_7865b08301010fzf.html中的做法,发现了“一次求余数和多次求余数的效果是一样的”这个结论,具体体现在以下一段循环代码:

for(int i=0;i<p.length();i++)
{
r=r*b+p[i]-'0';
r %= m;
}


觉得十分巧妙。然后,注意strtol()函数的调用方法。AC代码:

#include "stdafx.h"
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;

void print(int r,int b)
{
if(r)
{
print(r/b,b);
printf("%d",r%b);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int b,m,r;
string p,ms;
while(scanf("%d",&b),b)
{
cin>>p>>ms;
m=strtol(ms.c_str(),0,b);
r=0;
for(int i=0;i<p.length();i++) { r=r*b+p[i]-'0'; r %= m; }
if(r)
{
print(r,b);
cout<<endl;
}
else
cout<<'0'<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: