【問題描述】
莫比烏斯函數,數論函數,由德國數學家和天文學家莫比烏斯(Mobius,1790-1868)提出。梅滕斯(Mertens)首先使用μ(n)作為莫比烏斯函數的記號。而據說,高斯(Gauss)比莫比烏斯早三十年就曾考慮過這個函數。莫比烏斯函數在數論中有著廣泛的應用。
莫比烏斯函數完整定義的通俗表達:
1)莫比烏斯函數μ(n)的定義域是N
2)μ(1)=1
3)當n存在平方因子時,μ(n)=0
4)當n是素數或奇數個不同素數之積時,μ(n)=-1
5)當n是偶數個不同素數之積時,μ(n)=1
例如:
μ(8),μ(12),μ(18)都為08的因數為1,2,4,8;其中4=2*2故μ(8)=0
μ(2),μ(3),μ(30)都為-1
μ(1),μ(6),μ(10)都為1
給出一個數n,計算μ(n)。
【輸入形式】
輸入一行一個整數n
【輸出形式】
輸出μ(n)
【樣例輸入】
12
【樣例輸出】
0
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int mobius(int n);
int main()
{int n;scanf("%d",&n);mobius(n);return 0;
}
int mobius(int n)
{if(n==1)//1就是1{return 1;}else{int res=-1;//開始為奇數for(int i=2; i<=sqrt(n); i++)//簡便數的運算,判斷素數常用,取一半數就行{//能進去if里面的肯定不是素數,若該數就是一個素數直接輸出-1就行了if(n%i==0 && n/i%i==0)//非素數,并且還有平方因子,既然/i%i為0,也就是i*i就是那個完全平方數{return 0;}else if(n%i==0)//非素數{res*=-1;//res負責判斷素數為奇數還是偶數,來一次變一次,偶數為1,奇數為-1n/=i;}}printf("%d",res);//當res一次都沒進入if里面,說明該數就是個素數,單個素數就是-1return 0;}
}