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

纪中集训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
#include
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组总结——————小球

你可能感兴趣的:(纪中集训2020.01.14【NOIP普及组】模拟赛C组总结—————— 数制转换)