C语言禁用逻辑等运算符时,数字组合与提取的实现求助
问题修复方案
整数溢出问题
你组合id_num时,start_year * 100000000这类乘法会直接超出int类型的存储上限(int最大约21亿),导致数值溢出计算错误。必须改用long long类型存储大数值:
long long year_diff = grad_year - start_year; long long prog_years = year_diff % 100; long long uniq_id = student_id % 10000; long long id_num = (long long)start_year * 100000000 + (long long)program_num * 1000000 + prog_years * 10000 + uniq_id;
注意:给start_year和program_num做强制类型转换,避免乘法前先溢出
pow函数精度误差
pow是浮点函数,返回值可能存在精度偏差(比如pow(10,3)实际是999.9999999),强制转int后会得到错误的幂次值。改用预存整数幂次的数组替代浮点运算,同时符合禁止逻辑/关系运算符的要求:
// 预存10^0到10^12的整数值,覆盖12位数字的需求 static const long long powers_of_10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000LL, 100000000000LL, 1000000000000LL}; // 修改后的提取代码 int loc_diff = loc2 - loc1; long long div = powers_of_10[loc1 - 1]; long long desired_digits = (id_num / div) % powers_of_10[loc_diff + 1];
注意:id_num改为long long后,除法和取余运算也用long long类型,避免二次溢出
关键约束适配
由于禁止使用逻辑/关系运算符、布尔变量和选择结构,需确保输入参数在合法范围内:
start_year为4位数,program_num为2位数,保证组合后的id_num不超过long long范围loc1、loc2为1-12之间的正整数,且loc1 <= loc2(无需校验,依赖输入合法性)
内容的提问来源于stack exchange,提问作者cactusgrandma
相关产品推荐
相关产品推荐

