C语言提取数字每第k位时pow导致%运算符编译报错如何解决?
报错原因解释
- 直接原因:C标准库中
pow()函数的返回值为double浮点类型,而取余运算符%要求左右操作数均为整数类型,类型不匹配触发编译错误。 - 隐藏问题:就算你把
pow()的返回值强制转为整型,也会有精度隐患:pow()是基于浮点运算实现的,计算整数次幂时容易出现精度偏差,比如pow(10,2)可能返回99.9999999999,强制转int后会变成99,导致运算结果错误。计算整数次幂不要用pow(),应该用整数乘法实现。
修正后的实现代码
#include <stdio.h> #define MAX 100 void printDigit(int n, int k) { int arr[MAX]; int i = 0; int j, r; // 用整数乘法计算10^k,避免浮点运算问题 int divisor = 1; for(int t=0; t<k; t++) { divisor *= 10; } while (n != 0) { r = n % divisor; arr[i] = r; i++; n = n / divisor; } for (j = i - 1; j > -1; j--) { // 补足前导零,比如k=2时分到的3会输出03,符合位数要求,不需要可以改回%d printf("%0*d ", k, arr[j]); } } int main() { int n = 12345678; int k = 2; printDigit(n,k); return 0; }
运行说明
示例输入n=12345678, k=2的运行输出为:12 34 56 78,符合按每k位分组输出的需求。如果k的取值较大可能导致除数溢出,可以把divisor的类型改为long long适配更大的数值范围。
内容的提问来源于stack exchange,提问作者Sgg8
相关产品推荐
相关产品推荐

