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