问题描述
小M面对一组数字字符串,每个字符串由 '0' 到 '9' 的数字字符组成。每个字符串代表一个数字组,组内的每个数字字符是一个独立的数字选项。小M需要从每个数字组中选择一个数字(即从每个字符串中选择一个字符对应的数字),然后将这些选出的数字按顺序组成一个新的数(实际上我们只关心这些数字的和的奇偶性,而不是组成的数本身)。
目标是使得所有选出的数字之和为偶数。请计算出有多少种不同的选择方法可以达到这一目标。
注意:
- 每个字符串中的数字字符都是独立的选项,例如字符串 "123" 表示该组有三个可选数字:1、2、3。
- 选择方法不同是指:至少在一个组中选择了不同的数字。
输入格式
- 输入为一个列表
numbers,包含多个字符串。 - 每个字符串仅由数字字符('0'-'9')组成,长度至少为 1。
- 列表长度至少为 1。
输出格式
- 输出一个整数,表示满足条件的选择方法总数。
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int countEvenSumChoices(char** numbers, int numbersSize) {
long long even = 1, odd = 0;
for (int i = 0; i < numbersSize; i++) {
int len = strlen(numbers[i]);
int evenCount = 0, oddCount = 0;
for (int j = 0; j < len; j++) {
int digit = numbers[i][j] - '0';
if (digit % 2 == 0) {
evenCount++;
} else {
oddCount++;
}
}
long long newEven = even * evenCount + odd * oddCount;
long long newOdd = even * oddCount + odd * evenCount;
even = newEven;
odd = newOdd;
}
return even;
}
int main() {
char* numbers[] = {"123", "456", "789"};
int numbersSize = 3;
printf("%d\n", countEvenSumChoices(numbers, numbersSize));
return 0;
}
#include <stdio.h> #include <stdlib.h> #include <string.h> int countEvenSumChoices(char** numbers, int numbersSize) { long long even = 1, odd = 0; for (int i = 0; i < numbersSize; i++) { int len = strlen(numbers[i]); int evenCount = 0, oddCount = 0; for (int j = 0; j < len; j++) { int digit = numbers[i][j] - '0'; if (digit % 2 == 0) { evenCount++; } else { oddCount++; } } long long newEven = even * evenCount + odd * oddCount; long long newOdd = even * oddCount + odd * evenCount; even = newEven; odd = newOdd; } return even; } int main() { char* numbers[] = {"123", "456", "789"}; int numbersSize = 3; printf("%d\n", countEvenSumChoices(numbers, numbersSize)); return 0; }