luogu P1017 进制转换

Posted Draymonder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P1017 进制转换相关的知识,希望对你有一定的参考价值。

感觉这个题 是真的恶心

本来单纯就递归写,发现好难

后来用数组记录

然后考虑 指数为 奇和偶数 分别 <0 和 > 进制的情况

其实 用进制数为3 大概讨论四种情况就可以了

由于最近就是在划水,就随便写了写代码 也没好好修改,大概过了

#include<bits/stdc++.h>
using namespace std;
int s[100];

int f(int n,int k)
{
    int t =0;
    while (n)
    {
        s[t++] = n%k;
        n/=k;
    }
    return t;
}

int main ()
{
    memset(s,0,sizeof(s));
    int n,t;
    cin>> n >>t;
    cout<<n<<"=";
    int len = f(n,t);
    for(int i=0;i<len;i++)
    {
        if(i&1 && s[i] < 0)
        {
            if(i+1 >=len)
            {
                len = i+2;
            }
            s[i] -= t;
            s[i+1]+=1;
        }
        if(i&1 && s[i] >= -t )
        {
            if(i+2 >= len)
            {
                len = i+3;
            }
            s[i+1] += 1;
            s[i+2] += 1;
            s[i] += t;
        }
        if(i%2==0 && s[i] < 0)
        {
            if(i+1>=len)
                len = i+2;
            s[i+1] +=1;
            s[i] -= t;
        }
        if(i%2==0 && s[i] >= -t)
        {
            s[i] += t;
            if(i+2 >= len)
                len= i+3;
            s[i+1] -= 1;
        }
    }
    for(int i=len-1;i>=0;i--)
    {
        if(s[i] >= 10)
            printf("%c",s[i]-10 +A);
        else
            cout<<s[i];
    }

    printf("(base%d)\n",t);
    return 0;
}

后来看别人的题解  发现自己真的是弱智

 

百度一波负进制数:和正进制一样,每次取的余数保证在0~m-1之间。

(例如m=-16,则余数应该在0~15就可以直接输出)

所以用系统的“%”运算符的时候必须注意检查是不是在该范围(可能在m+1~0),否则就调整。

调整的方法是:如果余数<0,那么:余数-=m;商++;

就很简单的一种情况 被我讨论了... 四种情况  GG 我是sb

#include <bits/stdc++.h>
using namespace std;

int main()
{
    //freopen("input.txt","r",stdin);
    char js[]="0123456789ABCDEFGHIJ";//常量数组保存对应基数,常量大法吼啊
    int n,r;
    scanf("%d%d",&n,&r);
    printf("%d=",n);//提前输出n,因为后面n变化了,如果想在后面输出,就要多加一个变量保存n
    stack<int>s;//用栈来保存倒序的结果,便于输出
    while(n){
        int a=n%r;
        n/=r;
        if(a<0) {a-=r;n++;}//如果余数为负数,余数减去进制数,商加1
        s.push(a);//结果进栈
    }
    while(!s.empty()){//输出结果
        printf("%c",js[s.top()]);
        s.pop();
    }
    printf("(base%d)\n",r);
    return 0;
}

 

以上是关于luogu P1017 进制转换的主要内容,如果未能解决你的问题,请参考以下文章

P1017 进制转换

洛谷P1017 进制转换

洛谷 P1017 进制转换

[洛谷P1017] 进制转换

题解 P1017 进制转换

洛谷 P1017 进制转换