100张写着数字1-100的牌,并按顺序排列着,最开始所有卡牌都是背面朝上放置,然后从第二张开始翻牌,隔一张继续翻牌到最后一张,然后从第三张开始翻牌,隔两张开始翻牌(如果本来正面朝上,则翻成背面朝上,如果本来背面朝上,则翻成正面朝上),依次类推直到没有可翻动的牌。

/*
    Name: 程序员算法趣题Q03
    Copyright: 52coder.net
    Author: 52coder
    Date: 04/09/17 22:44
    Description: Q03
*/

#include <stdio.h>
#include <stdlib.h>
int main()
{
    /*定义100张纸牌,初始化为全零,0代表背面朝上,1代表正面朝上*/
    int card[100]={0};
    int i = 1;
    int j = 1;
    int step = 0;
    for(i = 1;i < 100;i++)
    {
        step = i + 1;
        for(j=i;j<100;j+=step)
        {
            if(card[j]==1)
            {
                card[j] = 0;
            }
            else
            {
                card[j] = 1;
            }
        }
    }
    
    for(i = 0;i < 100;i++)
    {
        if(0 == card[i])
        {
            /*数组从零开始,加一表示第几张牌*/
            printf("%d ",i+1);
        }
    }
    return 0;
}

结果:1 4 9 16 25 36 49 64 81 100
书中同样给出了如何运用数学规律来解决这个问题,这样就能验证我们的程序编写输出的结果是否正确。