牢房问题 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;
 } 

猜你喜欢

转载自blog.csdn.net/weixin_44916213/article/details/112292418