ccf 201912-1 报数题(simple)

这个报数题较为简单,入门C++选手就能做!!!
第一次提交竟然只给我一半分,回头看了看原因因为我的数组区间写的太小了,不够测试数据用的!!!所以给我一半分???
解题思路:四个人报数是固定的,因为输入N为报的数字数,所以我们要确定算上不能说的与7有关的数字一共说到了几个数字,也就是说最大喊到几了。确定好实际数字之后按顺序为每个人应该说的数进行分配,此时注意分配到最后一轮的问题处理!
话不多说上代码:
(后来发现有个简单的做法!!!见第二份代码!)
(我的水平太菜,看到题目直接从最简单的方式思考,直接写,也没有优化,没有考虑算法复杂度。。。。继续加油哇!!!!路还长!)

#include<iostream>
using namespace std;
struct people{
	int num[10000]={0};
	int count=0;
};
bool panduan(int t)
{
	int a;
    if(t>10)
    {
       if(t%7==0)
	       return true;
       while(t)
	   {
	   	a=t%10;
	   	if(a==7)
	   	   return true;
	   	else
	   	   t/=10;
	   }
	   if(t==0)
	       return false;	
	}
	else{
		if(t==7)
		   return true;
		else
		   return false;
	}
	
}
int main()
{
	int n;
	cin>>n;
	people A,B,C,D;
	for(int i=1;i<=n;i++)
	{
		if(panduan(i))
		     n++;
	}
	int a=0,b=0,c=0,d=0;
	for(int i=1;i<=n;i+=4)
	{
		if(i+3<=n)
		{
		A.num[a++]=i;
		B.num[b++]=i+1;
		C.num[c++]=i+2;
		D.num[d++]=i+3;	
		}
		else{
			if(n-i==0)
			   A.num[a++]=i;
			else if(n-i==1)
			  {
			  	A.num[a++]=i;
	        	B.num[b++]=i+1;
			  }
			else if(n-i==2)
			{
			   A.num[a++]=i;
		       B.num[b++]=i+1;
		       C.num[c++]=i+2;
			}
		}	
	}
	for(int j=0;j<10000;j++)
	{
		if(panduan(A.num[j]))
		    A.count++;
		if(panduan(B.num[j]))
		    B.count++;
		if(panduan(C.num[j]))
		    C.count++;
		if(panduan(D.num[j]))
		    D.count++;
	}
	 
	cout<<A.count<<endl;
	cout<<B.count<<endl;
	cout<<C.count<<endl;
	cout<<D.count<<endl;
	return 0;
 } 

简单做法!!

#include<stdio.h>
#define NUMBER 7//可以为别的数 
int main()
{
  int n;//总的报了n个数 
  int i=0;//当前正在报的数 
  int jia=0, yi=0, bing=0, ding=0;//甲乙丙丁共跳过的次数
  cin>>n;
  while(i<(n+jia+yi+bing+ding))
  {
    i++;
    if(i%NUMBER==0 || i%10==NUMBER || i/10%10==NUMBER || i/100==NUMBER)//这里猜测它只有<=700个数据。。。。。
    {
      switch(i%4)
      {
         case 1:jia++;break;
         case 2:yi++;break;
         case 3:bing++;break;
         case 0:ding++;break;
         default:break; 
      }
    }
  }
  cout<<jia<<endl;
  cout<<yi<<endl;
  cout<<bing<<endl;
  cout<<ding<<endl;
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值