EOF女神的相反数
Time Limit: 2000/1000MS (Java/Others)
Memory Limit: 128000/64000KB (Java/Others)
Problem Description
作为女神,EOF是很喜欢照镜子的~同样在数学中,EOF也是很喜欢相反数的。不过她既然是女神,她认知的相反数和我们凡人怎么能一样呢?
给定一个十进制数A,EOF女神定义的相反数就是把这个数转化为二进制之后,忽略高位的0,然后作轴对称,例如对于十进制的数123(1111011),它的相反数是111(1101111)。EOF女神就打算以此来考验前来觐见的勇士。
Input
首先是一个正整数T,表示测试数据的组数。
对于每组测试数据,只有一个正整数A(A<=10^18)
Output
对于每组测试数据,输出EOF女神眼中相反数。
Sample Input
2 123 5201314
Sample Output
111 2284921
Source
mathlover
Manager
初看这道题感觉好牛逼的样子...我还特意去找bitset的用法
结果用暴力做就可以
我的代码总是错,原因应该就是移位操作符的用法有问题
百度百科:运算符为双目运算符,结合方向为从左到右,作用是把一个整型数的所有位向左移动指定的位数,移动到左边界之外的多余二进制位会被丢弃,并从右边界移入0。
可能就是因为把不为0的二进制位丢掉了吧,但是对于64位最多不就移动63次么...实在想不通
#include <cstdio>
#include <cstring>
#include <iostream>
#define LL long long
using namespace std;
int main(void) {
LL T, n, ans, tmp;
int str[1000];
int num, cnt, cur;
cin >> T;
while(T--) {
cin >> n;
cnt = 0;
memset(str, 0, sizeof(str));
while(n) {
if(n & 1)
str[cnt++] = 1;
else str[cnt++] = 0;
n >>= 1;
}
// cout << str << endl;
tmp = 1;
ans = 0;
for(int i=cnt-1; i>=num; --i) {
ans += (str[i]*tmp);
tmp *= 2;
}
cout << ans << endl;
/*这里是我的做法,问题应该出在移位操作
ans = 0;
cur = 0;
for(int i=cnt-1; i>=num; --i) {
tmp = (str[i])<<cur;
ans += tmp;
cur++;
}
cout << ans << endl;
*/
}
return 0;
}
之前特意在网上查了下bitset用法
用bitset写了一个,结果因为最后处理数据和上面的方法一样,所以老是wa
现在改了下处理方法就A掉了
代码如下:
#include <cstdio>
#include <bitset>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
using namespace std;
int main(void) {
LL n;
int T;
scanf("%d", &T);
while(T--) {
cin >> n;
bitset<64> b (n);
string str = b.to_string();
// cout << str << endl;
int cnt = 0;
while(str[cnt] != '1')
++cnt;
string chs(str, cnt, str.size()-cnt+1);
// cout << chs << endl;
LL ans = 0;
LL tmp = 1;
for(int i=0; i<chs.size(); ++i) {
ans += (chs[i]-'0')*tmp;
tmp *= 2;
}
cout << ans << endl;
}
return 0;
}