基本上我想做的就是运行一个循环,返回 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/