您的位置:首页 > 其它

纪中集训2020.01.14【NOIP普及组】模拟赛C组总结—————— 数制转换

2020-02-05 15:00 155 查看

纪中集训2020.01.14【NOIP普及组】模拟赛C组总结—————— 数制转换

1.数制转换
这题我居然拿了(10 0分), 高分党,我才发现我真会投资。 ~~~~直接花了1个小时还多!!!
但,还是一头雾水!【提高组】B组巨佬,只花了20分钟AC了!!!

膜拜巨佬

———————华丽的分割线———————

言归正传

1.数制转换

**题目大意:**有一种数制的基数是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
  • 收藏
  • 分享
  • 文章举报
Charles Gary 发布了22 篇原创文章 · 获赞 25 · 访问量 7377 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: