本文是程序员算法趣题一书Q02 C语言实现,由于该书中所给的代码是Javascripts与Ruby,故在今后的阅读中会记录部分习题的C语言实现。
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
书中同样给出了如何运用数学规律来解决这个问题,这样就能验证我们的程序编写输出的结果是否正确。