原题在这里。是在[01]+串中找出所有(01)+的数目。
以下是常规版本,来自zeng24。该版本类似计数。
#include <stdio.h> #define N 120 main() { int n; scanf("%d", &n); while(n--) { int count = 0; char str[N]; scanf("%s", &str); int i, j; for(i = 0; str[i] =='0' || str[i] =='1'; ++i) //对于"010101",for循环执行三次,每一次循环执行到26行时t的值分别为3、2、1。 { //而3+2+1恰好是"010101"中包含的(01)+的个数。 int t = 0;j = i; while(j < N) //预设的N够大,因此可以不用考虑超过字符串 { if(str[j] - str[j+1] == -1) { ++t; j += 2; } else break; } count += t; } printf("%d\n", count); } return 0; }
优化版本:
#include <stdio.h> #define N 120 main() { int n; scanf("%d", &n); while(n--) { int count = 0; char str[N]; scanf("%s", &str); int i = 0; while (str[i] =='0' || str[i] =='1') //对于"010101",for循环执行三次,每一次循环执行26行时t的值分别为3、2、1。 { //而3+2+1恰好是"010101"中包含的(01)+的个数。 int t = 0; while(str[i] - str[i+1] == -1) //预设的N够大,条件必然有不成立的时候 { t++; i += 2; } if (t) i--; else i++; count += (t+1) * t / 2; } printf("%d\n", count); } return 0; }
#include<stdio.h> #define N 120 void cal(char *str, int *num) { if(*str == '0' && *(str+1) == '1') { (*num)++; cal(str+2, num); } else if(*str == '1' || *str == '0') { if (*num) ++num; cal(str+1, num); } } int main(void) { int n; scanf("%d ",&n); while (n--) { char str[N] = {0}; //字符 int num[N] = {0}; //计数,num[i]表示str中第i个连续(01)的个数。 //如010100111,num[0]等于2,num[1]等于2。其他num值均为0。 gets(str); cal(str, num); int i, sum = 0; for(i = 0; num[i]; i++) sum += (num[i]+1) * num[i] / 2; printf("%d\n", sum); } return 0; }