C++;用double检验整除性 为什么是t ((num/i)% 1=0)< /> >当num是一个加倍时,C++中工作?我该如何编写这段代码,通过检查是否留下余数来检查阶乘(etc0.3333) int-getFactorials(双数值) { int total=0;//如果(total/2)也等于'num',则是一个完美的数字。 for(int i=1;i

C++;用double检验整除性 为什么是t ((num/i)% 1=0)< /> >当num是一个加倍时,C++中工作?我该如何编写这段代码,通过检查是否留下余数来检查阶乘(etc0.3333) int-getFactorials(双数值) { int total=0;//如果(total/2)也等于'num',则是一个完美的数字。 for(int i=1;i,c++,double,factorial,arithmetic-expressions,C++,Double,Factorial,Arithmetic Expressions,进入 您应该知道这很容易出错,因为您正在使用double作为num的类型。您应该使用int。仅允许对整数类型(和用户定义的)使用%运算符 对于浮点,您需要函数 fmod此代码返回一个双重对象 (num / i) 仅允许对int类型进行模运算。您可以将其转换为int类型 ( ((int) (num / i) ) % i) %运算符由C++11§5.6/4定义: 如果商a/b可以表示为结果的类型,(a/b)*b+a%b等于a 这对于浮点类型没有意义。模的定义取决于除法舍入到整数 正如James

进入


您应该知道这很容易出错,因为您正在使用
double
作为
num
的类型。您应该使用
int

仅允许对整数类型(和用户定义的)使用
%
运算符 对于浮点,您需要函数
fmod

此代码返回一个双重对象

(num / i)
仅允许对int类型进行模运算。您可以将其转换为int类型

( ((int) (num / i) ) % i)

%
运算符由C++11§5.6/4定义:

如果商a/b可以表示为结果的类型,(a/b)*b+a%b等于a

这对于浮点类型没有意义。模的定义取决于除法舍入到整数


正如James Kanze所说,改用。

在进行模运算之前,向整数类型添加一个强制转换。你是指还是?我猜是因子。我混合了它们up@didierc:如果我将double(num)强制转换为整数,那么算法将不起作用。无论如何,这看起来是错误的。“执行%1”在除以1时返回余数。余数将始终为零。不应
(num/i)%1==0
也可以工作?(如果不存在舍入错误)如果(num%i==0)不起作用。例如,如果我把28除以4,答案是7不是零,但4是的除数28@TomLilletveit
%
运算符将
n
除以
i
的剩余部分提供给您,因此如果
i
除以
n
它将提供零。请注意,除非
double
实际上应该接近整数值。由于一旦指数部分变大,浮点数就不能准确地表示整数,因此不应该这样使用。对于大整数,请使用
long
(num / i)
( ((int) (num / i) ) % i)