NOIP2000TG T1 进制转换
题意:
求$n$的$r$进制表示法$(r<0)$。
程序1(60pt):
若$r>0$,每次用$r$除$n$,记录余数,用商替换$n$,最后倒序输出余数。
然而这里$r<0$,直接整除可能会出现负的余数,然而没有负的数码,所以我们有
$n=\lfloor\frac{n}{d}\rfloor*d+r=(\lfloor\frac{n}{d}\rfloor+1)*d+(r-d)$
于是出现负余数时候,除数$++$,余数减除数就可以了。
然而$r<-10$时,十个基础数码不够用了,于是$60pt$。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N=16; int n,r,s[N+3]; int main(){ scanf("%d%d",&n,&r); int nn=n; int p=0,a,b; while(n!=0){ p++; a=n/r; b=n%r; if(b<0){ a++; b=n-a*r; } n=a; s[p]=b; } printf("%d=",nn); for(int i=p;i>=1;i--) printf("%d",s[i]); printf("(base%d)",r); return 0; }
程序2(100pt):
修改一下输出部分。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N=16; int n,r,s[N+3]; int main(){ scanf("%d%d",&n,&r); int nn=n; int p=0,a,b; while(n!=0){ p++; a=n/r; b=n%r; if(b<0){ a++; b=n-a*r; } n=a; s[p]=b; } printf("%d=",nn); for(int i=p;i>=1;i--) if(s[i]<10) printf("%d",s[i]); else putchar(s[i]-10+'A'); printf("(base%d)",r); return 0; }
小结:
三思而后交代码。勿得意忘形。