zoukankan      html  css  js  c++  java
  • 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)
    ",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)
    ",r);
        return 0;
    }
  • 相关阅读:
    【命令】yum命令
    【程序包管理】篇章3:CentOS平台下软件包安装方法总结
    【程序包管理】篇章2:rpm程序包来源合法和完整性验正
    【命令】gunzip命令
    【程序包管理】篇章1:程序包管理的基础知识(了解,了解了之后会让我们对程序包的安装很有帮助)
    【命令】man命令帮助文档详解
    【基础】系统关机、重启、注销详解
    kali源更新
    第二届强网杯wp
    Jarvis OJ [XMAN]level1 write up
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7452825.html
Copyright © 2011-2022 走看看