C 为什么这个程序会永远循环?

C 为什么这个程序会永远循环?,c,loops,infinite-loop,cs50,C,Loops,Infinite Loop,Cs50,该程序的目标是通过以下方式执行校验和:每隔一个数字乘以2,从数字的倒数第二位开始,然后将这些产品的数字相加。 将总和与未乘以2的数字之和相加。如果总模10为0,那么这个数字是有效的。我的代码的问题是它永远运行,因此我认为循环出了问题,有没有关于为什么会发生这种情况以及如何修复它的建议?注: #include <stdio.h> #include <cs50.h> #include <math.h> double input(void); int main(

该程序的目标是通过以下方式执行校验和:每隔一个数字乘以2,从数字的倒数第二位开始,然后将这些产品的数字相加。 将总和与未乘以2的数字之和相加。如果总模10为0,那么这个数字是有效的。我的代码的问题是它永远运行,因此我认为循环出了问题,有没有关于为什么会发生这种情况以及如何修复它的建议?注:

#include <stdio.h>
#include <cs50.h>
#include <math.h>

double input(void);

int main(void)
{
    double number = input();
    double sum = 0;
    double i = 1;
    double current_digit;
    do
    {
        current_digit = (fmod(number, pow(10,i)) - fmod(number, pow(10, i-1)))/pow(10, i-1); //formula to calculate the ith digit in a number
        if (fmod(i,2) != 0)
        {
            sum += current_digit;
        }
        else
        {
            double second_number = 2*current_digit;
            double j = 1;
            do
            {
                double second_current_digit = (fmod(second_number, pow(10,j)) -fmod(second_number,pow(10, j-1)))/pow(10, j-1);
                sum += second_current_digit;
                j++;
            }
            while (fmod(second_number, pow(10,j)) == number);
        i++;
        }
    }
    while (fmod(number,pow(10, i)) != number);
    if (fmod(sum,10) == 0)
    {
        printf("true");
    }
    else
    {
        printf("false");
    }
}

double input(void)
{
    double number = get_double("Number: ");
    return number;
}
#包括
#包括
#包括
双输入(无效);
内部主(空)
{
双倍数字=输入();
双和=0;
双i=1;
双位电流;
做
{
当前_位=(fmod(number,pow(10,i))-fmod(number,pow(10,i-1)))/pow(10,i-1);//计算数字中第i位的公式
如果(fmod(i,2)!=0)
{
总和+=当前数字;
}
其他的
{
双秒_数=2*当前_位数;
双j=1;
做
{
双秒电流数字=(fmod(秒数,功率(10,j))-fmod(秒数,功率(10,j-1))/pow(10,j-1);
总和+=第二个当前数字;
j++;
}
而(fmod(第二个_数,pow(10,j))==个数);
i++;
}
}
while(fmod(number,pow(10,i))!=number);
如果(fmod(总和,10)==0)
{
printf(“真实”);
}
其他的
{
printf(“假”);
}
}
双输入(无效)
{
双倍数字=获得双倍(“数字:”);
返回号码;
}
使用双。。。该程序将不得不接受16位甚至更多的数字,我不知道如何处理更大的整数,可能是长类型

现在大多数计算机本机支持64位整数。这些数字可以给你提供多达19位十进制数字的下限(log_10(2^64))。如果足够,请使用
中的
uint64\t
(这是C标准中定义的类型)

如果这是不够的,考虑使用一个数字数组,或者一个更相关的“大整数”数据类型,如

不管怎么说,我打赌精确的浮点比较会让你头疼,因为
pow(10,I)
的值可能不是10的精确幂,所以
fmod()
会稍微改变
number
。但是-不要相信我的猜测,只需使用调试器即可:

  • 在终端中:,或
  • 在图形IDE中:例如

您是否尝试使用调试器逐步执行并跟踪对编号的更改?如果不知何故,您是否添加了打印一些文本的说明,以便跟踪事后发生的情况?我们不是调试服务。。。此外,浮点值的精确比较总是令人怀疑的。也许有一个非常细微的差别,你的思念?最后,当你关心精确表示时,为什么要使用浮点值呢?
pow(10,i)
不能保证生成
1000…0000
,可能会生成类似
999…999.997653213
@einpoklum的内容,如果使用浮点意味着使用double,那么程序将不得不接受16位甚至更多的数字,我不知道该怎么处理更大的整数,也许是长型?无论如何,谢谢你的打印提示,我将尝试不使用数学库
pow()
。在程序中编写自己的
long unsigned integer_pow(unsigned base,unsigned exp){long unsigned v=1;while(exp--)v*=base;return v;}
是的。如果您不想处理浮点值的混乱,那么可以使用整数(
int
long unsigned
,…)(并去掉
包含项)。