早教吧作业答案频道 -->其他-->
用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函数...的网友还看了以下:
下列说法中正确的是()A.如果a>b,则ac2>bc2(c≠0)B.如果ax>-a,则x>-1C. 2020-06-05 …
如图所示,一木块沿竖直放置的粗糙曲面从高处滑下.当它滑过A点的速度大小为5m/s时,滑到B点的速度 2020-06-15 …
如图,一物块以1m/s的初速度沿粗糙半圆面由A处下滑,到达较低的B点时速度恰好也是1m/s,如果此 2020-06-16 …
韩老师特制了4个同样的立方块,并将它们如图A放置,然后又如图B放置,则图B中四个底面正方形中的点数 2020-06-21 …
1、如果方程组x+y=4,x-(m-1)y=6中的解x、y相同,则m的值是多少?2、关于x、y的方 2020-06-27 …
用vb做题:1.如果a、b能被c整除,则(a+b)和(a-b)也能被c整除2.如果a能被b整除,c 2020-07-01 …
如果数A增加2,则它与数B的积比A、B的积大60;如果数A不变,数B减少3,则它们的积比A、B的积 2020-07-08 …
以下判断小球是否带电的说法中正确的()A.如果小球能吸引小纸屑,则小球一定带电B.用一个带电体靠近它 2020-11-01 …
有关区间的定义问题让我们回忆实数集合R中区间的精确定义:R的子集E称为一个区间,如果它至少包含两个点 2020-11-20 …
下列说法正确的是()A、若两个数互为相反数,则这两个数一定是一个正数,一个负数;B、如果两个数互为相 2020-12-01 …