题意:
求$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;
}
小结:
三思而后交代码。勿得意忘形。
来源:https://www.cnblogs.com/Hansue/p/10952164.html