游客 Signup | Login
中文 | En

2478 - 【数组】翻扑克牌

    上机练习5.1.6    有52张扑克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律翻转;依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。

    (PS:其实本题还蕴含数学知识哦,当然这需要我们分析翻牌动作的内含,你的程序正确后观察结果数据你能发现吗?)

Input

    无输入。

Output

    第一行,正面朝上的牌数;

    第二行,从小到大输出正面朝上牌的位置,用空格分隔,行尾不能有空格;

Examples

Input


                

Output


                

Solution C

 /*有52张扑克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;
 接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;
 接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律翻转;
 依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[53];
int q[53];
int main()
{int m=0,i,j,c=0,k=0;
    
    memset(a,0,sizeof(a));//0 up
    for(i=2;i<=52;i++)
    {
     for(j=i;j<=52;j=j+i)
   {
     a[j]=!a[j];  }}
    
   for(m=1;m<=52;m++)
   {if (a[m]==0){q[c++]=m;}}
   printf("%d\n",c);
   for(i=0;i<c;i++)
   if(k==0){printf("%d",q[i]);k=1;}
   else printf(" %d",q[i]);return 0;}

Solution C++

#include<cmath>
#include<iostream>
using namespace std;
int main()
{
	int i;
	bool a[52+1];
	for (i=1;i<=52;i++)  a[i]=true;
	for (i=2;i<=52;++i)
	{
		int j=i;
		while (j<=52) {a[j]=!a[j]; j=j+i;}
	}
	int m=0;
	for (i=1;i<=52;i++) if (a[i]) m++;	
	cout<<m<<endl<<1;
	for (i=2;i<=52;++i)
		if (a[i]) cout<<" "<<i;
	cout<<endl;
	return 0;    
}

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题