2478 - 【数组】翻扑克牌

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

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

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

题目输入

    无输入。

题目输出

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

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

输入/输出样例

输入格式


                        

输出格式


                        

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;}

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;    
}

Java解答

public class Main {
	public static void main(String[] args) {
		int[] num=new int[52];
		for(int i=0;i<52;i++)num[i]=1;
		int b=2,count=0;
		String s="";
		while(b<=52){
			for(int i=b-1;i<=51;i++){
				if((i+1)%b==0)num[i]=-num[i];
			}
			b++;
		}
		for(int i=0;i<52;i++){
			if(num[i]==1){
				count++;
				s+=i+1+" ";
			}
		}
		System.out.println(count);
		System.out.println(s.trim());
	}
}