2014-11-24 60 views
0

当我运行这段代码时,我得到的输出没有任何意义。我很可能只是错过了一些东西,但是我一直在努力通过手工解决问题来试图找到问题,但是当我手工完成时,我会得到应有的价值。该计算的简化版本是(c%10^n-c%10 ^(n-1))/ 10 ^(n-1)。为什么我的模操作会给我虚假的值?

此计算的目标是将数字的数字指定给整数的数组。我并不是在寻找替代解决方案。

int cNumberV[nLength]; 
for(int n = nLength; n > 0; n--) { 
    cNumberV[nLength - n] = (cNumber % (long long) pow(10, n) - cNumber % (long long) pow(10, n - 1))/(long long) pow(10, n - 1); 
    printf("%i\n", cNumberV[n]); 
} 

这是我的输出时cNumber = 5105105105105100和nLength = 16:

-1981492631 
232830 
-1530494976 
1188624 
-397102900 
134514540 
-1081801416 
1188624 
0 
1 
5 
0 
1 
5 
0 
1 
+0

'pow'是一个浮点运算,并将其结果转换为整数类型将抛出小数部分。从本质上讲,你可能会在'%9.999999'的地方得到'%9'的操作。 – usr2564301 2014-11-24 23:34:10

+0

@quantdev抱怨使用'pow'(一个浮点函数)在这里是有效的,尽管我认为对于IEEE754来说,它总是可以正确表示的,所以它应该可以工作 – 2014-11-24 23:37:54

+0

为什么*不寻找替代解决方案?“这种解决方案是可怕的,甚至如果正在工作获得一个整数的数字只需要在循环内部划分一个整数(假设你的编译器足够聪明,可以将a和%优化为一个分区) – 2014-11-24 23:39:37

回答

3

的问题是,你的循环设置cNumberV[nLength - n],但随后打印出cNumberV[n]

因此,前半部分循环会打印未初始化的数组条目,并且循环的后半部分将按照相反的顺序打印前半部分计算的结果(但由于由罗恩指出的偏移错误.G,它从不打印第一个数字)。

+0

啊,谢谢!之后当我循环访问数组时,我会得到有意义的值。我的错误是逻辑上的 - 我不打算让自己超过它,但我只是将其用作学习体验。 – 2014-11-25 00:08:41

1

pow()是一个昂贵和不准确的浮动功能。你只需要 需要简单的整数除以十来得到数字。如果你真的想让 按照上面的方法从左到右,请使用 作为整数的10个19个幂的查找表。

#include <stdio.h> 

#define nLength 20 

long long cNumber = 5105105105105100; 
int cNumberV[nLength]; 
int negative = 0; 

int main(int argc, char *argv[]) { 
    if (cNumber < 0) { 
     negative = 1; 
     cNumber = -cNumber; 
    } 

    int n; 
    for (n = nLength - 1; n >= 0; n -= 1) { 
     cNumberV[n] = cNumber % 10; 
     cNumber /= 10; 

     if (0 == cNumber) break; 
    } 

    if (negative) printf("-"); 
    for (int i = n; i < nLength; i += 1) { 
     printf("%1d", cNumberV[i]); 
    } 
    printf("\n"); 
} 
+0

我同意这是一个更有效的解决方案,但我的目标是让模操作变得更加舒适。我还需要为将来的操作节省cNumber(尽管我可以制作一个cNumberTemp变量或类似的东西来存储操作)。我可以在for循环中加入“&& cNumber!= 0”来消除if语句的需要吗? – 2014-11-25 00:17:48

+1

当然。我只是展示它通常如何完成。 – 2014-11-25 00:19:36

+0

谢谢!我可能会使用这个解决方案,但我仍然在学习一些基本的C,所以我只是确保在我目前对它的理解中没有错误。再次感谢你! – 2014-11-25 00:21:20

相关问题