题目链接:http://poj.org/problem?id=1088
解释下题意,给出进制b的两个数p,m问满足p=a*m+k的最小正k值,其实我们变换下就是k=p%m
我的开始的思路就是利用字符串模拟取余的过程,没参考什么算法,写得很笨拙,完全无法模拟高精度的取余
贴下我的超时代码,可能还有问题!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;
int main() { freopen("Input.txt", "r", stdin); int i,j,b,lenp,lenm; char p[1005],m[1005]; while (scanf("%d",&b;)&&b;) { scanf("%s %s",p,m); lenp=strlen(p); lenm=strlen(m); for(i=0;i<lenp/2;i++) { char temp; temp=p[i]; p[i]=p[lenp-i-1]; p[lenp-i-1]=temp; } for(i=0;i<lenm/2;i++) { char temp; temp=m[i]; m[i]=m[lenm-i-1]; m[lenm-i-1]=temp; } while (lenp>=lenm) { for(i=0;i<lenm;i++) { j=i; if(p[lenp-lenm+i]<m[i]) { p[lenp-lenm+i+1]--; while (p[lenp-lenm+j+1]<'0') { p[lenp-lenm+j+2]--; p[lenp-lenm+j+1]+=b; j++; } p[lenp-lenm+i]+=b; } p[lenp-lenm+i]-=m[i]-'0'; } while (p[lenp-1]=='0') { lenp--; } p[lenp]='\00'; } for(i=lenp-1;i>=0;i--) printf("%c",p[i]); printf("n"); } }
|
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;
int main() { int i,j,b,lenp,lenm; long int pa,mb; char p[1005],m[1005]; while (scanf("%d",&b;)&&b;) { scanf("%s %s",p,m); lenp=strlen(p); lenm=strlen(m); pa=0; mb=0; for(i=0;i<lenm;i++) { mb*=b; mb+=m[i]-'0'; } for(i=0;i<lenp;i++) { pa*=b; pa+=p[i]-'0'; if(pa>=mb) pa=pa%mb; } if(pa==0) { cout<<0<<endl; continue; } else { i=0; while(pa!=0) { p[i++]=pa%b+'0'; pa/=b; } p[i]='\00'; lenp=strlen(p); for(i=lenp-1;i>=0;i--) cout<<p[i]; cout<<endl; } } }
|