有意思的C编程题目
程序员文章站
2024-03-12 20:01:38
...
有意思的C编程题目
@(有意思的编程)
1 翻扑克
有52张朴克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按次此规律翻转;依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[])
{
int a[53], i, j, k = 0;
for (i = 1; i <= 52; i++)e
{
a[i] = 1; //初始化,全部朝上
}
//从第二张开始翻可以和从第三张及以后开始一起处理是因为初始条件是牌全部向上,第二张要翻可以用a[j] = a[j] * (-1)处理
for (i = 2; i <= 52; i++) //从第二张开始。。。到52张
{
for (j = i; j <= 52; j++) //从第i张开始 查询到最后一张
{
if (j%i == 0) //如果是i的倍数,比如从第二张开始 j为i的倍数(此时i=2)的,牌的朝向翻转
a[j] = a[j] * (-1); //乘以负一,等价于牌翻转
}
}
for (i = 1; i <= 52; i++)
{
if (a[i] == 1)
{
k++;
printf("%d ", i);
}
}
printf("总共有%d张牌正面朝上\n", k);
}
2 猴子选猴王
N只猴子选大王,选举办法如下:从头到尾1、2、3报数,凡报3的退出,余下的从尾到头1、2、3报数,凡报3退出;余下的又从头到尾报数,还是报3的退出;依此类推,当剩下的两只猴子时,取这时报数报1的为王。若想当猴王,请问当初应占据什么位置?
方法1
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int num;
int pos;
int flag;
}Monkey_T;
int main(int argc, char* argv[])
{
Monkey_T monkey[150];
int n;
int e = 0;
int i, j, k;
printf("输入猴子的数量N (n<=100):\n");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
monkey[i].pos = i; //初始化位置 1 - N
monkey[i].num = 0; //初始化报数全为0
monkey[i].flag = 0; //标志是否已经被排除
}
i = 1;
j = 0;
k = 1;
do
{
if ( (i > n) || (i < 1) ) //报数到头或尾巴
{
j = 0;
if (i > n) //到头的情况
{
i = n; //设置下个报数方向
k = -1;
}
else //到尾的情况
{
i = 1;
k = 1;
}
}
if (monkey[i].num != 3)
{
monkey[i].num = (j % 3) + 1; //不为3的重新报数 取余3+1的结果 1,2,3
j++;
}
else
{
if(0 == monkey[i].flag) //未被标记排除的猴子
{
e++;
}
monkey[i].flag = 1;
}
i = i + k; // K可能等于+-1
} while (((n - e) > 2) || (j != 2)); //直到剩下两只猴子 并且进行了新的一轮报数(i=2,只有两只)
for (i = 1; i <= n; i++)
{
if(monkey[i].num == 1)
{
printf("报数为1的猴子的位置%d\n", monkey[i].pos);
}
}
}
方法2
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[])
{
int a[150],n,t,i,j=0,tot=0;
printf("输入n的值(n<=100):\n");
scanf("%d",&n);
for(i=1;i<=n;i++) //i代为位置
a[i]=1; //初始化 为1代表未被排除
t=1; //t代表报数方向
for(i=1;i>=0;i=i+t) //在这个for循环中,i肯定都大于等于0
{
if(i==n+1 || i==0) //报数到尾巴或头 此判断决定for循环是跳不出去
{
t=t*(-1); //排队方向变化
i=i+t; //使得i=n或i=1
j=0; //计数清0 0 - 2 (1,2,3)
}
if(a[i]==1) //未被排除
j++; //报数 1,2,3
if(j==3) //报数到3
{
a[i]=-1; //标记排除
tot++; //记录排除猴子的数量
j=0; //报数清0
}
if(tot==n-2 && j==1)break;//如果只剩两只猴子,并且报数为1 报数为1说明是新一轮的报数
}printf("应占据的位置编号为%d\n",i);
}
3 狐狸找兔子
围绕着山顶有10个洞,一只狐狸和一只兔子各住一个洞。狐狸总想吃掉兔子。一天兔子对狐狸说:“你想吃我有一个条件,先把洞从1~10编上号,你从10号洞出发,先到1号洞找我;第二次隔1个洞找我,第三次隔2个洞找我,以后依此类推,次数不限。若能找到我,你就可以饱餐一顿。不过在没有找到我以前不能停下来。”狐狸满口答应就开始找了,它从早到晚找了1000次洞,累得昏了过去也没有找到兔子。请问,免子躲在几号洞里?【答案】2,4,7,9
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[])
{
int a[11]={0},i,j; //a[11]全部初始化为0.为啥是11,因为只用a[1]-a[10]总共10个
a[1]=1; //首次先找1洞口
i=1; //狐狸当前位于1号洞
for(j=2;j<=1000;j++)//从第二次到1000次
{
i=i+j; //下一次寻找第位置(基于狐狸当前位置+需隔j个洞)
if(i>10) //因为只有10个洞,1-10
{
i=i%10; //当前位置 如果i=10,就是10号洞,i=11,1号洞 以此类推
if(i==0) //i=10的倍数的情况,就是10号洞
i=10;
}
a[i]=1; //当前狐狸已经寻找过的洞,标记为1
}
printf("安全位置为:");
for(i=1;i<=10;i++)
{
if(a[i]==0)
{
printf("%d", i);
}
}
printf("\n");
}
上一篇: 自制PHP框架之模型与数据库
下一篇: 有意思的小题目