为什么我的模运算给了我伪造的值?

时间:2014-11-24 23:30:50

标签: c modulus

当我运行此代码时,我得到的输出实际上没有任何意义。我很可能只是遗漏了一些东西,但我一直在努力通过手工解决问题来找到我的代码的问题,但是当我手工完成时,我得到了我应该得到的值。该计算的简化版本是(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

2 个答案:

答案 0 :(得分:3)

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

因此,循环的前半部分打印未初始化的数组条目,循环的后半部分以相反的顺序打印上半部分计算的结果(但是由于rowan指出的逐个错误)。 G,它从不打印第一个数字。)

答案 1 :(得分: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");
}