hdu 5980 · Find Small A【位运算】【手速题】

来源:互联网 发布:叉叉助手获取数据失败 编辑:程序博客网 时间:2024/06/16 21:21

这是一道水题,把它单独分出一篇文章是有些小心机的。

【题意】

将输入的n个数分别转换成n个32位二进制数,判断每8位二进制数组成的十进制数是不是97,并记录97出现的次数,最后输出记录的次数。

【提炼】

不用提炼。

【分析】

可以用模拟的方法存下二进制数,然后每八位进行判断。

Tips:数很大(2^32超过int范围2^31),请使用long long或者__int64(这个没试过,理论上也可以)。

这里介绍另一种方法:

我们使用%u(即十进制无符号)每次输入8位二进制数[直接就可以这样做,不用做特殊操作,循环4次即可],4次循环也就是32位,将输入的8位二进制数与 0xFF (即(11,111,111)2)进行逻辑与操作,看它的值是不是等于 ‘a’ ,然后计数,每个循环最后都要把输入值向右移动8位[因为之前没有做特殊操作,这里需要进行左移才能保证数据不是只有前8位进入选择]。

代码实现简单,考虑1A。

【代码】

/*    coder:  Tangent Chang    date:   2017/5/1    Your internal mediocrity  is the moment when you lost the faith of being excellent!*/#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<queue>#include<map>using namespace std;typedef long long ll;const int maxn = 100001;const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;const int EPS = -1e9;const int MOD = 1000000007;int main() {    int T, a;    scanf("%d", &T);    int cnt = 0;    while (T--) {        for (int i = scanf("%u", &a); i < 5; ++i) {            if ((a & 0xFF) == 'a') cnt ++;            a >>= 8;        }    }    printf("%d\n", cnt);    return 0;}
0 0
原创粉丝点击