字符串处理大数

图片说明

题目分析
很显然与的拿一窜字符/数字其实就是1,也就是&1,也就是说我们只需要最后判断牛牛当前位置是一个奇数还是一个偶数
刚开始我用的是大数java去做,不知道当时怎么想的,竟然没想到用字符串去做,,用字符串去做的话其实很简单,我们只需要对每次求出来的和进行模2处理,再把最后的答案模2就行,就知道它是一个奇数还是一个偶数

方法一:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e7 + 10;
int vis[maxn];
char s[maxn];
int main()
{
    int n, sum, ans;
    while (~scanf("%d", &n))
    {
        sum = 0;
        for (int i = 1; i <= n; ++i)
        {
            ans = 0;
            scanf("%s", s);
            int ls = strlen(s);
            for (int i = 0; i < ls; ++i)
            {
                ans = ans * 10 + s[i] - '0';
                ans %= 2;
            }
            sum = (sum + ans) % 2;
        }
        if (sum)
            puts("1");
        else
            puts("0");
    }
}

方法二:

分析:
我们只需要对末尾进行分析,判断一个数是否是奇数,只需要看它的最后一位数就行,然后再利用一个性质就是——一个数加上一个偶数奇偶性不变,如果加上一个奇数那么奇偶性就会变,所以我们只需要统计有多少个奇数就行。这里我们同时也需要用的c++的^(异或)操作,这个异或操作是异或到同类为0,异或到异类就是1,这样一来就可以知道出现奇数的个数是奇数还是偶数,如果是奇数那么结果也是奇数,如果是偶数个奇数那么结果就是偶数,偶数出现的情况我们不需要去管,因为,偶数的个数不影响最后的结果。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, ans = 0;
    char c[10005];
    scanf("%d", &n);
    while (n--)
    {
        scanf("%s", c);
        int lc = strlen(c);
        if ((c[lc - 1] - '0') & 1)
            ans ^= 1;
    }
    printf("%d\n", ans);
    return 0;
}