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 进制转换的主要内容,如果未能解决你的问题,请参考以下文章