1. 程式人生 > 其它 >牢房問題 C++(尋找總因子數為奇數的數)

牢房問題 C++(尋找總因子數為奇數的數)

技術標籤:演算法分析與設計演算法

某國王對囚犯進行大赦,讓一獄吏n次通過一排鎖著的n間牢房,每通過一次,按所定規則轉動n間牢房中的某些門鎖, 每轉動一次, 原來鎖著的被開啟, 原來開啟的被鎖上;通過n次後,門鎖開著的,牢房中的犯人放出,否則犯人不得獲釋。
轉動門鎖的規則是這樣的,第一次通過牢房,要轉動每一把門鎖,即把全部鎖開啟;第二次通過牢房時,從第二間開始轉動,每隔一間轉動一次;第k次通過牢房,從第k間開始轉動,每隔k-1 間轉動一次;問通過n次後,哪些牢房的鎖仍然是開啟的?

分析

轉動門鎖的規則可以有另一種理解,第一次轉動的是編號為1的倍數的牢房;第二次轉動的是編號為2的倍數的牢房;第三次轉動的是編號為3的倍數的牢房;……則獄吏問題是一個關於因子個數的問題。

令d(n)為自然數n的因子個數,這裡不計重複的因子,如4的因子為1,2,4共三個因子,而非1,2,2,4。則d(n)或為奇數,或為偶數,見下表:在這裡插入圖片描述
數學模型1:d(n)有的為奇數,有的為偶數,由於牢房的門開始是關著的,這樣編號為i的牢房,所含1——i之間的不重複因子個數為奇數時,牢房最後是開啟的;反之,牢房最後是關閉的。

再此基礎上我們發現當且僅當n為完全平方數時,d(n)為奇數;這是因為n的因子是成對出現的,也即當n=a*b且a≠b時,必有兩個因子a,b; 只有n為完全平方數,也即當n=a2時,才會出現d(n)為奇數的情形

我們把數分為1 質數 不是質數 1只有一次 質數因為都為本身和1相乘所以必為偶數次 非質數則也可構成由兩個數相乘但只有當一個數為完全平方數時會有兩個因子相同則總因子數為奇數

只需找出小於n的平方數即可

answer:

#include<iostream>

using namespace std;

int main()
{
	int n;
	cin>>n;
	for(int i=1;i*i<=n;i++)
	{
		cout<<i*i<<" 釋放"<<endl;
	}
	return 0;
 }