挺水的一道题,就是给定一大小为n的数组,第一趟令所有监狱为0,表示所有的监狱都打开,接着第二趟令第2,4, 6……个监狱关闭,第三趟令第3,6,9……个监狱关闭,第四趟………一直到第n趟。若在遍历过程中,发觉监狱已经关闭,则令其打开;发觉监狱已经打开,则令关闭。
最后再遍历一次数组,求得有几个监狱找打开,以还有几个数组元素为0,输出即可。
代码:
#include <stdio.h> #define MAX_CELL_NUM 100 int main(int argc, char *argv[]) { int cells[MAX_CELL_NUM + 1]; int n; scanf("%d", &n); int cellNum, unlockCellNum; int i, j, k; for(i = 1; i <= n; ++i) { scanf("%d", &cellNum); for(j = 1; j <= cellNum; ++j) { cells[j] = 0; } for(j = 2; j <= cellNum; ++j) { for(k = j; k <= cellNum; k += j) { if(cells[k] == 0) cells[k] = 1; else cells[k] = 0; } } unlockCellNum = 0; for(j = 1; j <= cellNum; ++j) { if(cells[j] == 0) unlockCellNum++; } printf("%d/n", unlockCellNum); } return 0; }
本文介绍了一个有趣的算法问题:通过n次遍历操作改变监狱的开关状态,并最终统计处于打开状态的监狱数量。每次遍历会根据当前遍历次数改变特定监狱的状态。
1013

被折叠的 条评论
为什么被折叠?



