您的位置:首页 > 其它

ACdream 1095 EOF女神的相反数(数学:二进制处理)

2014-07-30 17:22 316 查看


EOF女神的相反数

Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others)

SubmitStatisticNext
Problem


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

mathlover

SubmitStatistic

初看这道题感觉好牛逼的样子...我还特意去找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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: