C语言非e-ban数字筛选的判定算法与实现方法问询
e-ban数字判定算法
核心判定规则非常明确:将整数转换为标准英文拼写后,只要拼写内容包含字母"e",就属于需要被过滤的e-ban数字,否则保留。
不需要真的生成完整英文拼写再查找字符,直接基于英文数字的构词规律提前打表判断即可,效率更高也不容易出错:
- 所有负数的英文以
negative开头,单词本身含e,直接判定为e-ban数字 - 英文数字按三位为一组拆分(对应千、百万、十亿等单位),只要任意一组的拼写含e,整个数字就属于e-ban数字
- 三位组内部的构词规律固定:
- 0-19的拼写是不规则的,提前打表记录每个数的英文是否含e即可
- 20-99的拼写为「整十词 + 个位词」(个位为0时省略个位词),提前打表记录20/30/.../90每个整十词是否含e,再结合个位的表判断即可
- 100-999的拼写会用到
hundred这个词,单词本身含e,因此只要三位组的百位不为0,整个组直接判定为含e
- 千(thousand)、百万(million)、十亿(billion)等位的单位词本身不含e,不需要额外判定,只要对应三位组的内容不含e即可
C语言实现步骤
- 先编写独立的判定函数,输入一个整数,返回值为1表示该数是非e-ban数字(需要保留),返回0表示是e-ban数字(需要过滤)
- 提前定义两个静态常量数组存映射表,避免重复计算:
small_has_e[20]:索引对应0-19的整数,值为1表示该数英文含e,0表示不含tens_has_e[10]:索引对应十位上的数字(2-9对应20/30/.../90),值为1表示对应整十词含e,0表示不含
- 主函数循环读取用户输入的整数,直到输入结束,逐个调用判定函数,把符合要求的数字按空格分隔输出即可
完整可运行代码
#include <stdio.h> // 0-19的数字英文是否含e,索引对应数字,1=含e,0=不含 const int small_has_e[] = {1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1}; // 20/30/.../90的英文是否含e,索引对应十位数字,1=含e,0=不含 const int tens_has_e[] = {0,0,1,0,0,0,0,1,1,1}; int is_eban(long long num) { // 负数带negative前缀,含e直接过滤 if (num < 0) return 0; // 0对应zero,含e直接过滤 if (num == 0) return 0; // 按三位一组逐段判断 while (num > 0) { int group = num % 1000; int hundred = group / 100; int rem = group % 100; // 百位不为0必然用到hundred,单词本身含e if (hundred > 0) return 0; // 判断后两位是否含e if (rem < 20) { if (small_has_e[rem]) return 0; } else { int ten = rem / 10; int one = rem % 10; if (tens_has_e[ten]) return 0; if (one > 0 && small_has_e[one]) return 0; } num = num / 1000; } return 1; } int main() { long long n; int first_flag = 1; // 控制输出空格格式,避免行首多余空格 while (scanf("%lld", &n) != EOF) { if (is_eban(n)) { if (!first_flag) printf(" "); printf("%lld", n); first_flag = 0; } } printf("\n"); return 0; }
代码验证符合示例要求:输入序列4 44 1001 164 29时,输出结果为4 44,和参考结果完全一致。
内容的提问来源于stack exchange,提问作者Kaizer04
相关产品推荐
相关产品推荐

