撲克牌翻牌問題
題目描述:
有52張牌,使它們全部正面朝上,從第2張開始,凡是2的倍數位置上的牌翻成正面朝下;接着從第3張牌開始,凡是3的倍數位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着第三輪從第4張牌開始,凡是4的倍數位置上的牌按上面相同規則翻轉,以此類推,直到第1張要翻的牌是第52張為止。統計最后有幾張牌正面朝上,以及它們的位置號。
輸出:
1,4,9,16,25,36,49,
代碼如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool card[100];
void turn(int x)
{
if(x>52)return;
for(int i=x;i<=52;i+=x)
{
card[i]=!card[i];
}
turn(x+1);
}
int main()
{
memset(card,1,sizeof(card));
turn(2);
for(int i=1;i<=52;i++)
{
if(card[i])
cout<<i<<endl;
}
return 0;
}
/*運用了遞歸算法,從2的倍數一直翻到52的倍數,不斷地重復着類似的事情,采用遞歸去做;
一個知識漏洞 bool a[30]={1},這是剛開始賦值時,只是a[0]=1;因為全局賦值只能全部賦值0,即a[30]={0}
接下來進行一下擴展:
完全平方數的約數的個數是奇數。普通合數和質數的約數個數為偶數。
因為一個數的約數一定是兩兩出現的,但是完全平方數其中一對約數是一樣的,所以其約數是奇數個;
分析:因為一開始時正面,最后也是正面,那么一定最后是正面的被翻了偶數次,最后是反面的一定被翻了奇數次;
所以 最后是正面的數 都是完全平均數。
以上 是我在網上學到的*/