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

 

小结:

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

转载于:https://www.cnblogs.com/Hansue/p/10952164.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值