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;
    
}

 

小结:

三思而后交代码。勿得意忘形。

posted @ 2019-06-01 12:09  汉谡  阅读(181)  评论(0编辑  收藏  举报