2024春节编程竞赛

列出CRC32各环

CRC32函数 https://msdn.microsoft.com/en-us/library/dd905031.aspx 的结果是个32位非负整数。
CRC32函数的输入为一串字节,要求将输入改为一个32位非负整数,对应原函数输入参数的4个字节(低字节在前)。
这样,新的CRC32函数的输入与输出均为32位非负整数。

CRC32(X) = Y 表示为 X → Y

样例1:A → A
则A..A共1个32位非负整数构成一个环。

样例2:B → C → D → B
则B..D共3个32位非负整数构成一个环。

样例3:E → F → G → H → I → E
则E..I共5个32位非负整数构成一个环。

要求:列出新的CRC32函数的所有环的首尾节点及节点数。
输出样例:
From 0xAAAAAAAA to 0xAAAAAAAA, count=1
From 0xBBBBBBBB to 0xDDDDDDDD, count=3
From 0xEEEEEEEE to 0xIIIIIIII, count=5
......
Seconds=运行秒数

参赛人员:铝紫户外群、铝紫工作群所有成员。
截止时刻:2024-02-16 16:00:00
编程语言:C++, Go, Java, JavaScript, Julia, Python, Ruby, Rust, Zig 之一,只能使用语言自带标准库。
参考答案:链接 https://share.weiyun.com/VerZ6LFB 密码:giuje6 (文件解压口令评比后公开)
提交方式:用铝紫注册邮箱发送源程序及运行结果附件给 飞麦 fitmap@qq.com,邮件标题:2023春节编程竞赛
评比:综合考察正确性、可维护性、可读性、可扩展性、灵活性、简洁性、空间、性能等等,从结果正确的参赛者中选出冠军、亚军、季军。
奖金:200元、150元、100元群内定向红包。

形象解释

以下函数的输入与输出均处于同一范围。
% 表示求余数,x % y 表示 x 除以 y 的余数,如 2 % 3 = 2,9 % 4 = 1
** 表示乘方,x**y 表示 x 的 y 次方,如 2**3 = 8,3**2 = 9

样例一:设 x 为 0 到 8,函数
f(x) = (x**7 + x**4 + x**2 + x + 1) % 9

f(0) = (0**7 + 0**4 + 0**2 + 0 + 1) % 9 = 1
f(1) = (1**7 + 1**4 + 1**2 + 1 + 1) % 9 = 5
f(5) = (5**7 + 5**4 + 5**2 + 5 + 1) % 9 = 4
f(4) = (4**7 + 4**4 + 4**2 + 4 + 1) % 9 = 2
f(2) = (2**7 + 2**4 + 2**2 + 2 + 1) % 9 = 7
f(7) = (7**7 + 7**4 + 7**2 + 7 + 1) % 9 = 8
f(8) = (8**7 + 8**4 + 8**2 + 8 + 1) % 9 = 1
f(3) = (3**7 + 3**4 + 3**2 + 3 + 1) % 9 = 4
f(6) = (6**7 + 6**4 + 6**2 + 6 + 1) % 9 = 7

      ← ← ← ← ← ← ← ←
     ↓                      ↑
0 → 1 → 5 → 4 → 2 → 7 → 8
            ↗        ↗
          3         6

从 1 到 8,又回到 1,构成一个环,共 6 个结点;
注意 0、3、6 不在任何环上。
From 1 to 8, count=6

样例二:设 x 为 0 到 8,函数
f(x) = (x**7 + x**5 + x**2 + x + 1) % 9

f(0) = (0**7 + 0**5 + 0**2 + 0 + 1) % 9 = 1
f(1) = (1**7 + 1**5 + 1**2 + 1 + 1) % 9 = 5
f(5) = (5**7 + 5**5 + 5**2 + 5 + 1) % 9 = 2
f(2) = (2**7 + 2**5 + 2**2 + 2 + 1) % 9 = 5
f(3) = (3**7 + 3**5 + 3**2 + 3 + 1) % 9 = 4
f(4) = (4**7 + 4**5 + 4**2 + 4 + 1) % 9 = 5
f(6) = (6**7 + 6**5 + 6**2 + 6 + 1) % 9 = 7
f(7) = (7**7 + 7**5 + 7**2 + 7 + 1) % 9 = 5
f(8) = (8**7 + 8**5 + 8**2 + 8 + 1) % 9 = 8

          ← ←
         ↓   ↑
0 → 1 → 5 → 2
       ↗   ↖
3 → 4         7 ← 6

  ←
↓  ↑
8 → 8

从 5 到 2,又回到 5,构成一个环,共 2 个结点;
从 8 到 8,又回到 8,构成一个环,共 1 个结点;
注意 3、4、6、7 不在任何环上。
From 5 to 2, count=2
From 8 to 8, count=1

补充说明

以上仅用于形象展示环,并非准确的CRC函数;CRC函数本质上是有限域 GF(2) 上多项式的欧几里得除法。

2023春节编程竞赛中的函数等价于:

fn crc32(num: u32) -> u32 {
	let mut crc = !num;
	for _ in 0..32 {
		crc = if crc & 1 != 0 {
			(crc >> 1) ^ 0xEDB88320
		} else {
			crc >> 1
		}
	}
	!crc
}

该函数的输入范围与输出范围均为 0 到 4294967295 。

posted @ 2024-02-03 21:13  飞麦  阅读(165)  评论(4编辑  收藏  举报