背景
太原成成中学第3次模拟赛 第2道
描述
对于十进制整数N,试求其-2进制表示。
例如,因为 1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13 ,所以(-13)_10 = (110111)_-2。
例如,因为 1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13 ,所以(-13)_10 = (110111)_-2。
输入格式
一个整数,代表要转换的十进制数。
输出格式
一个整数,代表N的-2进制表示。
测试样例1
输入
-13
输出
110111
备注
|N| <= 2000000000
Vivian Snow
广东汕头聿怀初级中学NOIp第一次训练用题
Vivian Snow
广东汕头聿怀初级中学NOIp第一次训练用题
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 long long n; 7 int p,ans[35]; 8 int main(){ 9 scanf("%lld",&n); 10 for(long long i=1;p<=32;i*=-2,p++){ 11 if((n/i)&1){ 12 ans[p]=1; 13 n-=i; 14 } 15 } 16 while(!ans[p]&&p!=0) p--; 17 for(int i=p;i>=0;i--){ 18 printf("%d",ans[i]); 19 } 20 puts(""); 21 return 0; 22 }思路:和平常进制转换一样。但是:
如果用普通的%或者mod结果不对,为什么?因为它不是往下取第一个能被-2整除的数,而是把此数对2取模,然后依前者符号决定。所以,要手工用“往下取第一个能被-2整除的数”作为求余数的方法。
从低位开始,用n除以该位的进制数,看结果是否为奇数,注意要开longlong