C 程序返回意外值

标签 c

基本上我想做的就是运行一个循环,返回 X/Y Mod 10 的值,其中 X 是 1234567890123456,Y 是 10^i,这样我就可以将 1234567890123456 的每个数字分开。但在 i = 7 之后,它返回 11 而不是正确的值 (9)。所有涉及的数字都是长数据类型。我尝试使用 pow() 函数来完成此操作,并手动输入 10 的幂,仍然得到相同的结果。

#include <stdio.h>
#include <math.h>
long Cardno;
long Digits;
long Divider;
int main(void)
{
    Cardno = 1234567890123456;
    Digits = log10(Cardno) +1;

    if (Digits == 13 || Digits == 15 || Digits == 16)
    {
        for(int i = 0; i <= Digits; i++)
    {
       printf("%lo\n", Cardno/10000000 % 10);
    }
    }
    else
    {
        printf("INVALID\n");
    }
}

最佳答案

所以你必须使用long long而不是long,我不知道为什么编译器没有给出这个警告,但是我的编译器给了我这个警告:

Implicit conversion from 'long long' to 'long' changes value from 1234567890123456 to 1015724736

名为 Digits 的变量不需要太长,int 就可以正常工作。 另外,名为 log10() 的函数接受 double 并返回 double,因此您必须对其进行强制转换。

还在您的代码中打印 Cardno/10000000 % 10 这是错误的,它应该是 (Cardno/ (long long )pow(10, i)) % 10

这是完整的代码:

#include <stdio.h>
#include <math.h>
long long Cardno;
int Digits;
long long Divider;
int main(void)
{
    Cardno = 1234567890123456;
    Digits = (int)log10((double )Cardno) +1;

    if (Digits == 13 || Digits == 15 || Digits == 16)
    {
        for(int i = 0; i <= Digits; i++)
        {
            printf("%ld\n",(Cardno/ (long long )pow(10, i)) % 10);
        }
    }
    else
    {
        printf("INVALID\n");
    }
}

关于C 程序返回意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73538262/

相关文章:

c - 为什么我得到结果=0.00000

c++ - 如何从进程内部确定 CPU 和内存消耗

c - 为什么标准不要求最小化struct成员?

c - 使用 memset 和 memcpy 的问题

java - 试图实现一个简单的算法

c - 嵌套循环意外行为

c - 如何在 C 中对 .txt 文件内的数据进行排序

c - 为什么10的按位补码是-11

c - winapi 最小化窗口通知(橙色冲洗)

c - 矩阵每行的算术和仅针对除以 3 的数字