文章

4

粉丝

422

获赞

14

访问

45.4k

头像
简单的解题思路
P1097
发布于2020年3月31日 00:58
阅读数 13.3k

模拟10进制转化为-2进制的过程。就是一个数n/-2然后取其余数,因为是二进制,所以余数要为正的。所以我们要处理一下数据,把计算出来的余数取其绝对值。

对于负数我们直接除 -2 会得出错误的结果,例如-3/-2=1余数为-1,余数为负数。所以要先用被除数-3 减去余数 1 再除,此时就可被-2整除,即-3➗-2 = 2 余 1才对。

在解题时,我们先求出正的余数,然后用这个数减去余数,之后再除以-2的话就可以算出正确的结果了。

C/C++代码如下:

#include<bits/stdc++.h>
using namespace std;

int main (){
	int in, left;
	stack<int> out;
	
	while(scanf("%d", &in) != EOF){
		if(in == 0) printf("0\n");      //为零的情况 
		else{
			while(in != 0){
				left = abs(in % -2);    //算出当前数的余数,一定为正数(二进制) 
				out.push(left);         //余数进栈 
				in = (in - left) / -2;  //当前数减去余数后一定能被-2整除 
			}
	
			if(out.top() == 0) out.pop();  //去除栈顶的零 
			while(!out.empty()){          //依次出栈 
				printf("%d", out.top());
				out.pop();
			}
			printf("\n");
		}
	}
	return 0;
}

 

 

登录查看完整内容


登录后发布评论

4 条评论
admin SVIP
2020年4月14日 22:39

题解写的很好呀,赞一个laugh

赞(0)
chenziyi VIP
2020年4月14日 19:32

这个思路打死我也想不出来,敢问大佬是怎么想出来的?

赞(0)

做一个和尚 : 回复 chenziyi: 看CSDN上一个大佬写的思路

2020年4月16日 18:06

chenziyi : 回复 chenziyi: 真棒

2020年4月16日 23:01