这个报数题较为简单,入门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;
}