首页 > 其他 > 详细

NOIP2000TG T1 进制转换

时间:2019-06-01 12:54:21      阅读:110      评论:0      收藏:0      [点我收藏+]

题目链接

 

题意:

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

 

小结:

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

NOIP2000TG T1 进制转换

原文:https://www.cnblogs.com/Hansue/p/10952164.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!