一开始是的想法是用减法代替除法,一直减到被减数小于减数,所得的被减数就是余数。为了方便编程,还在减法中对齐了被减数和减数的位数。但过程还是比较麻烦,会超时。
1 #include "stdafx.h" 2 #include<string> 3 #include<iostream> 4 using namespace std; 5 int b; 6 string decrease(string p, string cut) 7 { 8 int diff=p.size()-cut.size(); 9 if(diff!=0) 10 { 11 cut=string(diff,‘0‘)+cut; 12 } 13 int len=p.size()-1; 14 int flag=0; 15 for(int i=len;i>=0;i--) 16 { 17 if(p[i]>=cut[i]) 18 p[i]=p[i]-cut[i]+‘0‘; 19 else if(p[i]<cut[i]) 20 { 21 if(p[i-1]>=‘1‘) 22 { 23 p[i-1]-=1; 24 p[i]=p[i]+b-cut[i]+‘0‘; 25 } 26 else if(p[i-1]==‘0‘) 27 { 28 int j=i-2; 29 while(p[j]==‘0‘) 30 p[j--]=‘0‘+b-1; 31 p[j]-=1; 32 p[i-1]=0+b-1; 33 p[i]=p[i]+b-cut[i]+‘0‘; 34 } 35 } 36 if(p[i]!=‘0‘) 37 flag=i; 38 } 39 return p.substr(flag,len+1-flag); 40 } 41 int _tmain(int argc, _TCHAR* argv[]) 42 { 43 string p,m; 44 while(1) 45 { 46 cin>>b; 47 if(b==0) 48 break; 49 cin>>p>>m; 50 while(p.size()>m.size()||(p.size()==m.size()&&p>=m)) 51 { 52 int diff=p.size()-m.size(); 53 string add1(diff,‘0‘); 54 string cut=m+add1; 55 if(p>=cut) 56 { 57 while(p.size()==cut.size()&&p>=cut) 58 p=decrease(p,cut); 59 } 60 else if(p<cut) 61 { 62 string add2(diff-1,‘0‘); 63 cut=m+add2; 64 while(p.size()>cut.size()) 65 p=decrease(p,cut); 66 } 67 } 68 cout<<p<<endl; 69 } 70 return 0; 71 }
后来参考了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; }
时间: 2024-10-20 11:04:04