纪中集训2020.01.14【NOIP普及组】模拟赛C组总结—————— 数制转换
2020-02-05 15:00
155 查看
纪中集训2020.01.14【NOIP普及组】模拟赛C组总结—————— 数制转换
1.数制转换
这题我居然拿了(10 0分), 高分党,我才发现我真会投资。 ~~~~直接花了1个小时还多!!!
但,还是一头雾水!【提高组】B组巨佬,只花了20分钟AC了!!!
膜拜巨佬
———————华丽的分割线———————
言归正传
**题目大意:**有一种数制的基数是3,权值可以取-1,0,1,并分别用符号-,0,1表示,如这种数制的101表示十进制数的10,即1乘9+0乘3+1乘1=10,又如这种数制的-0表示十进制数的-3,即-1乘3+0乘1=-3。编程把给定的有符号整数转换为新数制的数,该数的前头不能有多余的0,如10的新数制表示是101,则不要输出成0101。
Input
有一行或多行,每行有一个整数N(-2147483647<=N<=2147483647),整数内不会有其他分隔符,整数前后可能有空格。
Output
对输入文件的每一行输出一行,该行是输入行的整数的新数制表示,结果不能有前导空格。
Sample Input
10
-3
Sample Output
101
-0
WHAT!!!WT!!! 蒟蒻(我)看不懂呀!巨佬大致的讲了一下然后,就过了!
这只是到送分的水题,不用花太多的功夫。不就转个三进制吗!
分析一下:(猜进制+转进制+判符号=此题AC)从101变到10,1乘9+0乘3+1*1=10,就是乘3^(n-1),就知道的转三进制。然后分正负数,所以就判断个正负号,即可!
附上Pascal AC 代码:
var n,i,j,x,y,p,t,bj,w,l:longint; s,ans:ansistring; a:array[0..1000005] of longint; begin readln(s); while (s<>'') do begin for i:=1 to 500 do a[i]:=0; i:=1; while s[i]=' ' do inc(i); delete(s,1,i-1); i:=length(s); while s[i]=' ' do dec(i); inc(i); delete(s,i,length(s)-i+1); x:=0; p:=1; if s[1]='-' then p:=2; for i:=p to length(s) do begin x:=x*10+ord(s[i])-48; end; if p=2 then x:=-x; w:=1; if x<>0 then begin w:=0; while (x<>0) do begin inc(w); a[w]:=x mod 3; x:=x div 3; end; end else a[w]:=0; ans:=''; for i:=1 to w do begin case a[i] of 1: begin ans:=ans+'1'; end; -1: begin ans:=ans+'-'; end; 0: begin ans:=ans+'0'; end; 2: begin a[i+1]:=a[i+1]+1; ans:=ans+'-'; end; -2: begin a[i+1]:=a[i+1]-1; ans:=ans+'1'; end; 3: begin ans:=ans+'0'; a[i+1]:=a[i+1]+1; end; -3: begin ans:=ans+'0'; a[i+1]:=a[i+1]-1; end; end; end; while a[w+1]<>0 do begin inc(w); case a[w] of 1: begin ans:=ans+'1'; end; -1: begin ans:=ans+'-'; end; 0: begin ans:=ans+'0'; end; 2: begin a[w+1]:=a[w+1]+1; ans:=ans+'-'; end; -2: begin a[w+1]:=a[w+1]-1; ans:=ans+'1'; end; 3: begin ans:=ans+'0'; a[w+1]:=a[w+1]+1; end; -3: begin ans:=ans+'0'; a[w+1]:=a[w+1]-1; end; end; end; l:=w; while (l>0) and (ans[l]='0') do dec(l); if l=0 then write('0'); for i:=l downto 1 do write(ans[i]); writeln; readln(s); end; end.
附上C++ AC 代码:
#include<iostream> #include<cstdio> using namespace std; int a[101],tot; int main(){ int n; while(scanf("%d",&n)==1){ if(n==0){ printf("0\n"); return 0; } tot=0; while(n){ if(n%3==2||n%3==-1){ a[++tot]=-1; n=n+1; } else if(n%3==1||n%3==-2){ a[++tot]=1; n--; } else{ a[++tot]=0; } n/=3; } for(int i=tot;i>=1; i--){ if(a[i]==-1) printf("-"); else printf("%d",a[i]); } printf("\n"); } return 0; }
END!
下一题:纪中集训2020.01.14【NOIP普及组】模拟赛C组总结——————小球
- 点赞 2
- 收藏
- 分享
- 文章举报
相关文章推荐
- 纪中集训2020.01.14【NOIP普及组】模拟赛C组总结——————【GDOI2003】求值
- 纪中集训2020.01.14【NOIP普及组】模拟赛C组总结——————小明的游戏
- 纪中集训2020.01.14【NOIP普及组】模拟赛C组总结——————小球
- 纪中集训2020.01.16【NOIP普及组】模拟赛C组——————【2. binary】解析
- 纪中集训2020.01.15【NOIP普及组】模拟赛C组————【3.交错匹配】分析
- 纪中集训2020.01.15【NOIP普及组】模拟赛C组————【2.打鼹鼠】分析
- 2017.03.18【NOIP 普及组】模拟赛C组 单元格 题解
- 2017.04.02【NOIP 普及组】模拟赛C组 T2:士兵
- JZOJsenior2434.2017.04.08【NOIP 普及组】模拟赛C组 T3开关灯泡
- [NOIp模拟赛]2018长沙集训题 T1 FHT
- 2016.10.05【初中部 NOIP普及组 】模拟赛总结
- 2017-07-08【NOIP-普及组】模拟赛C组-sort-题解
- 2017.08.15【NOIP 普及组】模拟赛C组总结
- 2017.08.16【NOIP 普及组】模拟赛C组总结
- 2018.01.26【NOIP普及组】模拟赛D组——家族(family.pas/cpp)
- JZOJ(中山纪中) 2018.01.26【NOIP普及组】模拟赛D组 第三题
- 纪中训练 day8 【NOIP普及组】模拟赛D组 解题报告
- 2017.03.18【NOIP 普及组】模拟赛C组 剪草 题解
- 2017-07-08【NOIP- 4000 普及组】模拟赛C组-sum-题解
- 2017.08.16【NOIP 普及组】模拟赛C组总结