代码如下:
#include<stdio.h>
int main()
{
int i, j, k, flag=0
for (i = 1i <= 16i++) {
for (j = 1j <= 17-ij++) {
k = 18 - j - i
if ((i * 8 + j * 6 + k * 6 == 118) &&(j * 2 + k * 2 == 20)) {
flag = 1
break
}
}
if (flag == 1) {
printf("蜘蛛有%d只,蜻蜓有%d只,蝉有%d只。", i, j, k)
break
}
}
return 0
}
1-52都做过基数了,翻牌的时候不用把基数也翻了吧?要是把基数也翻了,肯定不会有正面向上的牌啊....以数组模拟卡片 TRUE向上 FALSE向下
循环模拟翻卡片 满足条件 card[i]=!card[i]
最后输出值为TRUE的数组元素
#include <stdio.h>
#include <string.h>
int main()
{
bool card[52]
memset(card,true,52)
for (int i=2,n=1i<=52i++,n++)
{
for(int j=nj<52j++)
{
if((j+1)%i==0) card[j]=!card[j]
}
}
for(int i=0i<52i++)
if(card[i]) printf("%d ",i+1)
return 0
}
改进 根据题意的翻牌规则 即求约数的过程 一个数的约数如果去掉1 包含自身的个数为奇数 即被翻了奇数次 向下,反之则向上。
#include <stdio.h>
int main()
{
printf("1 ")
for(int i=4i<=52i++)
{
int count=0
for(int j=2j<=i/2j++)
{
if(i%j==0) count++
}
if(count%2!=0) printf("%d ",i)
}
return 0
}
可见 在循环上节省了循环次数 而且去掉了申请CARD的空间 只需要一个count变量即可