求0到7组成奇数的个数c语言,c语言经典算法—求0—7 所能组成的奇数个数

题目:求0—7 所能组成的奇数个数。

算法思想:

这个问题其实是一个排列组合的问题,设这个数为sun=a1a2a3a4a5a6a7a8,a1-a8表示这个数的某位的数值,

当一个数的最后一位为奇数时,那么这个数一定为奇数,不管前面几位是什么数字。如果最后一位数为偶数,

则这个数一定为偶数。

a1-a8可以取0-7这个八个数字,首位数字不为0。

从该数为一位数到该数为8位数开始统计奇数的个数:

1.当只有一位数时也就是该数的最后一位,奇数个数为4

2.当该数为两位数时,奇数个数为4*7=28

3.当该数为三位数时,奇数个数为:4*8*7=224

8.当该数为八位数时,奇数个数为:4*8*8*8*8*8*8*7(依次为最后一位到第一位)

c语言程序代码:

1 #include

2 int main(int agrc, char*agrv[])

3 {

4 long sum = 4, s = 4;//sum的初始值为4表示,只有一位数字组成的奇数个数为4个

5 int j;

6 for (j = 2; j <= 8; j++)

7 {

8 printf("%d位数为奇数的个数%ld\n", j-1, s);

9 if (j <= 2)

10 s *= 7;

11 else

12 s *= 8;

13 sum += s;

14 }

15 printf("%d位数为奇数的个数%ld\n", j-1, s);

16 printf("奇数的总个数为:%ld\n", sum);

17 system("pause");

18 return 0;

19 }

### 编写匹配奇数个 'a' 且奇数个 'b' 的正则表达式 为了构建一个可以匹配包含奇数个 `a` 和奇数个 `b` 的字符串的正则表达式,我们需要考虑以下几个方面: 1. **状态机模型**:可以通过有限自动机(DFA)来描述这种模式。对于奇数个 `a` 和奇数个 `b` 的情况,我们可以设计四个状态: - 状态 0:当前既无奇数个 `a` 也无奇数个 `b`。 - 状态 1:当前有奇数个 `a` 但无奇数个 `b`。 - 状态 2:当前无奇数个 `a` 但有奇数个 `b`。 - 状态 3:当前既有奇数个 `a` 又有奇数个 `b`。 初始状态为状态 0,目标接受状态为状态 3[^2]。 2. **转换规则**: - 当遇到字符 `a` 时,在状态之间切换如下: - 状态 0 → 状态 1 - 状态 1 → 状态 0 - 状态 2 → 状态 3 - 状态 3 → 状态 2 - 当遇到字符 `b` 时,在状态之间切换如下: - 状态 0 → 状态 2 - 状态 1 → 状态 3 - 状态 2 → 状态 0 - 状态 3 → 状态 1 3. **正则表达式的构造**: 根据上述 DFA 转换逻辑,最终得到的正则表达式形式较为复杂,通常通过逐步推导得出。以下是可能的一个解决方案: ```regex ((ab|ba)(aa|bb)*(ab|ba)|((a(bb)*a)|(b(aa)*b))(aa|bb)*((a(bb)*a)|(b(aa)*b)))* ``` 这里的核心思想在于交替处理 `a` 和 `b` 出现的情况,并确保它们的数量满足奇数条件。 4. **解释**: - `(ab|ba)` 表示两个连续的不同字母组合,用于初始化奇偶变化。 - `(aa|bb)*` 是用来跳过成对出现的相同字母序列,不影响奇偶性。 - `((a(bb)*a)|(b(aa)*b))` 处理单独的奇数个 `a` 或者 `b` 的情形。 5. **验证方法**: 使用编程语言中的正则表达式库测试此表达式是否能正确识别符合条件的字符串。例如 Python 中可采用以下代码片段进行验证: ```python import re pattern = r"((ab|ba)(aa|bb)*(ab|ba)|((a(bb)*a)|(b(aa)*b))(aa|bb)*((a(bb)*a)|(b(aa)*b)))*" test_strings = ["aba", "bab", "aabba", "abbab"] results = [(s, bool(re.fullmatch(pattern, s))) for s in test_strings] print(results) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值