2014年大学生程序设计竞赛试卷与参考解答

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2014年大学生程序设计竞赛试卷与参考解答

(注意:当某道试题设计完成并调试通过确认后,请举手当着监考人员的面运行程序,并把运行结果填入该题的数据测试后空白处。)

1.旅馆里有10000间房间,从1到10000编了号。第一位服务员把所有的房间门都打开了,第二位服务员把所有编号是2的倍数的房间进行“相反处理”,第三位服务员把所有编号是3的倍数的房间作“相反处理”,……,第n(1<=n<=10000)位服务员把所有编号是n的倍数的房间作“相反处理”。问第n个服务员来过后,问共有多少张门是打开的(C)。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)

给出以下参数的结果:

n=1179, C= 5261

n=9291, C= 801

n=5127, C= 4915

#include

using namespace std;

int main()

{

int i,j,n; //i为服务员编号,j为房间编号

int a[10001];

cin>>n;

for(int t=1;t<10001;t++)

a[t]=1;

for(i=2;i<=n;i++)

for(j=i;j<10001;j++)

if(j%i==0) a[j]*=-1;

cout<<"打开的房间数为:";

j=0;

for(i=1;i<10001;i++)

if(a[i]==1)

j++;

cout<

return 0;

}

2、有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有1<=n<1012) 个空汽水瓶,最多可以换多少瓶(max)汽水喝?

n=190, max = 95

n=7777, max = 3888

n=99995555, max = 49997777

n=9383736353, max= 4691868176

3、定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位

数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。

例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,

因为20-5=15不是17的倍数。输入一个正整数n (1<=n <=10100),你的任务是判

断它是否是17的倍数。如果n 是17的倍数则输出1,否则输出0。

n=201, out = 0

n=999888777888540, out = 1

n=12345678987654325, out = 0

n=171717171717171717171717171717171717171717171717171616, out = 0

(25个17,2个16)

#include

#include

int main() {

char s[200];

while(scanf("%s", &s) == 1)

{

if(!strcmp(s, "0")) break;

int m = 0;

for(int i = 0; i < strlen(s); i++)

m = (m*10+s[i]-'0')%17;

printf("%d\n", m==0?1:0);

}

return 0;

4、设n 为正整数,解不等式(分子改)

b n

n a <±+-+++++-+-+++++-+++-++

解:上下限一般为键盘输入的a,b 。

分两段求和:应用条件s

// 解分数不等式

#include

#include

void main()

{ long c,d,i;

double a,b,t,ts,s;

printf(" 请输入a,b: ");

scanf("%lf %lf",&a,&b);

i=0;t=ts=s=0;

while(s

{ i=i+1;

t=t+(double)1/i;

if(i%2==0) ts=ts-(double)1/i;

else ts=ts+(double)1/i;

s=s+t/ts;

}

c=i;

while(s

{i=i+1;

t=t+(double)1/i;

if(i%2==0) ts=ts-(double)1/i;

else ts=ts+(double)1/i;

s=s+t/ts;

}

d=i-1;

printf("%ld %ld\n",c,d);

}

5、一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:

15=1+2+3+4+5

15=4+5+6

15=7+8

请编写程序,根据输入的任何一个正整数n,找出符合这种要求的所有连续正整数序列的个数C。如:对于15,其输出结果是3:对于16,其输出结果是:0。n=56789, C = 3

n=189909, C = 5

n=999, C= 7

#include

int divice(int n){

int i,j,k,sum,middle,count = 0;

int flag=0;

if(n%2==0){

middle=n/2-1;

相关文档
最新文档