欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-18 23:04:04
...

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