扑克牌翻牌问题
题目描述:
有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}
接下来进行一下扩展:
完全平方数的约数的个数是奇数。普通合数和质数的约数个数为偶数。
因为一个数的约数一定是两两出现的,但是完全平方数其中一对约数是一样的,所以其约数是奇数个;
分析:因为一开始时正面,最后也是正面,那么一定最后是正面的被翻了偶数次,最后是反面的一定被翻了奇数次;
所以 最后是正面的数 都是完全平均数。
以上 是我在网上学到的*/