早教吧作业答案频道 -->其他-->
用C++编写Mobius函数Mobius函数定义为,输入一个正整数N,当N=1时,函数值为1,当N不为1时,首先在稿纸上将它分解质因数,若某质因数的个数大于1,则函数值为0,如N=45,45=3*3*5,3出现了两次,故函数值为0.
题目详情
用C++编写Mobius函数
Mobius函数定义为,输入一个正整数N,当N=1时,函数值为1,当N不为1时,首先在稿纸上将它分解质因数,若某质因数的个数大于1,则函数值为0,如N=45,45=3*3*5,3出现了两次,故函数值为0.若质因数全都不相同,设有p个,则函数值为(-1)的p次方,如78,78=2*3*13,质因数全都不相同,有3个,所以函数值为(-1)的3次方,为-1.
Mobius函数定义为,输入一个正整数N,当N=1时,函数值为1,当N不为1时,首先在稿纸上将它分解质因数,若某质因数的个数大于1,则函数值为0,如N=45,45=3*3*5,3出现了两次,故函数值为0.若质因数全都不相同,设有p个,则函数值为(-1)的p次方,如78,78=2*3*13,质因数全都不相同,有3个,所以函数值为(-1)的3次方,为-1.
▼优质解答
答案和解析
#include
// 一个数字可以有的最多不同质因数个数
#define MAX_PRIM_FACTOR_AMOUNT 1000
/*
Mobius 函数定义为:
输入一个正整数N,当N=1时,函数值为1,
当N不为1时,首先在稿纸上将它分解质因数.
若某质因数的个数大于1,则函数值为0,
如N=45,45=3*3*5,3出现了两次,故函数值为0.
若质因数全都不相同,设有p个,则函数值为(-1)的p次方,
如78,78=2*3*13,质因数全都不相同,有3个,所以函数值为(-1)的3次方,为-1.
*/
/*
功能:求 Mobius 函数的值
参数:
n 一个正整数
doPrint 是否输出正整数 n 的质因数分解形式.1:输出;0:不输出.
返回:
Mobius 函数的值
*/
int Mobius(unsigned int n, unsigned int doPrint)
{
// 用 m 来临时保存 m 的值.因此 n 的值在运算过程中会被改变.
int m = n;
// 用 i 来枚举 n 的质因数
int i;
// 数字 n 的不同质因数个数
int primeFactorAmount = 0;
// n 的某个质因数 i,出现在 n 中的次数
int countCurrentPrimeFactor = 0;
// Mobius 函数的值.初始值为 -3,表示还没有计算出函数值.
int result = -3;
// 记录所有质因数出现的次数.用于输出质因数分解形式.
int primFactors[MAX_PRIM_FACTOR_AMOUNT][2];
if(n == 0)
{// 【1】n==0 的情况,实际是非法的输入.这里返回 -2.
result = -2;
}
else if(n == 1)
{// 【2】n==1 的情况
result = 1;
}
else
{
for(i=2; i= 1)
{// 数字 i 是数字 n 的质因数
primFactors[primeFactorAmount][0] = i;
primFactors[primeFactorAmount][1] = countCurrentPrimeFactor;
primeFactorAmount ++;
if(countCurrentPrimeFactor > 1)
{// 【3】 n 的某质因数的个数大于 1 的情况
result = 0;
}
}
}
if(result == -3)
{// 【4】 n 有 p 个不同的质因数,返回 (-1)^p
result = (primeFactorAmount%2 ? -1 : 1);
}
}
if(doPrint)
{// 需要输出 n 的质因数分解形式
if(m
// 一个数字可以有的最多不同质因数个数
#define MAX_PRIM_FACTOR_AMOUNT 1000
/*
Mobius 函数定义为:
输入一个正整数N,当N=1时,函数值为1,
当N不为1时,首先在稿纸上将它分解质因数.
若某质因数的个数大于1,则函数值为0,
如N=45,45=3*3*5,3出现了两次,故函数值为0.
若质因数全都不相同,设有p个,则函数值为(-1)的p次方,
如78,78=2*3*13,质因数全都不相同,有3个,所以函数值为(-1)的3次方,为-1.
*/
/*
功能:求 Mobius 函数的值
参数:
n 一个正整数
doPrint 是否输出正整数 n 的质因数分解形式.1:输出;0:不输出.
返回:
Mobius 函数的值
*/
int Mobius(unsigned int n, unsigned int doPrint)
{
// 用 m 来临时保存 m 的值.因此 n 的值在运算过程中会被改变.
int m = n;
// 用 i 来枚举 n 的质因数
int i;
// 数字 n 的不同质因数个数
int primeFactorAmount = 0;
// n 的某个质因数 i,出现在 n 中的次数
int countCurrentPrimeFactor = 0;
// Mobius 函数的值.初始值为 -3,表示还没有计算出函数值.
int result = -3;
// 记录所有质因数出现的次数.用于输出质因数分解形式.
int primFactors[MAX_PRIM_FACTOR_AMOUNT][2];
if(n == 0)
{// 【1】n==0 的情况,实际是非法的输入.这里返回 -2.
result = -2;
}
else if(n == 1)
{// 【2】n==1 的情况
result = 1;
}
else
{
for(i=2; i= 1)
{// 数字 i 是数字 n 的质因数
primFactors[primeFactorAmount][0] = i;
primFactors[primeFactorAmount][1] = countCurrentPrimeFactor;
primeFactorAmount ++;
if(countCurrentPrimeFactor > 1)
{// 【3】 n 的某质因数的个数大于 1 的情况
result = 0;
}
}
}
if(result == -3)
{// 【4】 n 有 p 个不同的质因数,返回 (-1)^p
result = (primeFactorAmount%2 ? -1 : 1);
}
}
if(doPrint)
{// 需要输出 n 的质因数分解形式
if(m
看了 用C++编写Mobius函数...的网友还看了以下:
贴现计算问题,请回答某企业持有一张面值为10000元的票据到银行贴现,该票据尚须73天才能到期,在 2020-04-26 …
EXECL中,想要将计算出来的数求和,但最后求和出来的总值一直不对,想要将计算出来的数求和,但最后 2020-05-17 …
Snell定律外推外海波浪特征值怎样利用Snell定律把已知的水深40m处重现期为50年的波浪特征 2020-06-28 …
保险单里面的现金价值表国寿鸿富两全保险每1000标准保费为标准——现金价值表保险年度末现金价值2年 2020-06-29 …
现金流贴现与净现值?按5年计算:如果年贴现率为20%,每年保持不变,则未来现金流现值为:10/(1 2020-07-10 …
问一个内部收益率计算的问题,涉及折现率和净现值。某项目当折现率为10%时,净现值为20,当折现率为 2020-07-14 …
墨子说“为履以卖,不为履”,意思是做鞋子的人做鞋供人购买,其目的不在于鞋子本身。这里面包含的经济学 2020-07-16 …
下列表述不正确的是()A净现值是未来报酬的总现值与初始投资额的现值之差.B当净现值大于0时,净现值率 2020-11-29 …
不用于交换的劳动产品为什么没有价值?因为它不用于交换,所以没有实现价值?是不是交换了才实现了价值? 2020-12-31 …
富而思源,先富起来的人担负起更大的社会责任,用实际行动回报社会,这()①体现了个人优秀的品质②是个人 2021-01-14 …