压死骆驼的最后一根稻草

 
  

每个人 都有自己独有的计数方式  比如以下  字符串111123455可以表示为4个1,1个2,1个3,1个4,2个5.为了方便记忆就表示为4--1,1--2,1--3,1--4,2--5当然顺序肯定不能变换  计数方式可以表示为“a--b”的形式  在计数方式中相连的b互不相等且a与b不为0   独有的计数方式 如果转化为字符串  字符串的长度小于10的9次方

给你下面的计数方式    例如5--4也就是字符串44444,10--4也就是字符串4444444444

给你这样的计数方式  判断这个字符串中有多少连续子串所构成的整数是4的倍数

例如5--4可表示为字符串44444里面共有(4,4,4,4,4,44,44,44,44,444,444,444,4444,4444,44444)15个是4的倍数;

输入

 
  

第一行是数字T(T<1000)<t<100)  表示下面有t组实例<="" h3="">

每一行一个独有的计数方式  长度小于100

<t<100)  表示下面有t组实例<="" h3="">

输出

 
  

输出字符串中有多少个是4的倍数  占一行

样例输入

复制
4
5--4
1--1,1--2
2--4,2--2,2--3
1--4,1--3,1--2,1--1

样例输出

复制
15
1
3
3

思路:

这是一道模拟题,首先要解决怎么判断一个字串是不是 4 的倍数,如果这个字串长度小于等于2,那么直接可以去去求它的值然后判断是不是4的倍数,如果长度大于2,那么找到这个字串最低的两位,也就是个位和十位,也就等同于把这个字串代表的数用100取余,如果这两位的值是4的倍数,那么这个字串就是4的倍数,反之不是,道理很简单,不做证明。

开始模拟,现在取一个字符串中的字符,它前面有 c 个字符, 求以这个字符结尾的 4的倍数的子串数方法如下:如果这个字符转化成数字是四的倍数那么结果加一,如果 c > 0, 这个字符与前一字符转化成数字是四的倍数,那么结果加 c ;

累加每个字符 结尾的 4的倍数的子串数就是最终结果。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
long long  a[110][2];

int main()
{
     int T;
     cin >> T;
     char ch[110];
     while(T--) {
        cin >> ch;
        int len = strlen(ch);
        int num = 1;
        int cnt = 0, temp;
        for(int i=0; i<len; i++) {
            if(isdigit(ch[i]) && num == 1) {
                temp = 0;
                while(isdigit(ch[i]) && i < len) {
                    temp = temp*10 + ch[i]-'0';
                    i++;
                }
                a[++cnt][0] = temp;
                i--;
                num = 0;
                continue;
            }
            if(isdigit(ch[i]) && num == 0) {
                temp = 0;
                while(isdigit(ch[i]) && i < len) {
                    temp = temp*10 + ch[i]-'0';
                    i++;
                }
                a[cnt][1] = temp;
                i--;
                num = 1;
            }
        }

        long long c = 0, ans = 0;
        a[0][0] = 0, a[0][1] = 0;

        for(int i=1; i<=cnt; i++) {
            if(a[i][1]%4 == 0) {
                ans ++;
            }
            if((a[i-1][1]*10+a[i][1])%4 == 0)
                  ans += c;
            if(a[i][0] > 1 && (a[i][1]*10+a[i][1])%4 == 0) {
                  ans += (c+2 + c+a[i][0])*(a[i][0]-1)/2;
            }
            c += a[i][0];
        }
        cout << ans << endl;
     }
     return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38737992/article/details/80295670