当前位置:文档之家› ACM简单例题

ACM简单例题

ACM简单例题
ACM简单例题

ACM简单例题

鸡兔同笼

查看文章

C程序设计基础-鸡兔同笼2009-10-26 18:12问题描述

一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物

输入

第 1 行是测试数据的组数n,后面跟着n 行输入。每组测试数据占 1 行,包括一个正整数 a (a < 32768)。

输出

n 行,每行输出对应一个输入。输出是两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用空格分开。如果没有满足要求的情况出现,则输出 2 个0。

输入样例

2

3

20

输出样例

0 0

5 10

源代码:

#include <stdio.h>

void main( )

{

int n, i, nFeet;

scanf("%d", &n);

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

{

scanf("%d", &nFeet);

if(nFeet %2 != 0)

printf("0 0\n");

else if (nFeet%4 != 0)

printf("%d %d\n", nFeet / 4 + 1, nFeet / 2);

else

printf("%d %d\n", nFeet / 4, nFeet / 2);

}

}

查看文章

C程序设计基础-评委会打分2009-10-30 19:18问题描述

青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。

输入

输入数据有多组,每组占一行,每行的第一个数是n(2<n<100),表示评委的人数,然后是n 个评委的打分。

输出

对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。

输入样例

3 99 98 97

4 100 99 98 97

输出样例

98.00

98.50

源代码

正确版本:

#include <stdio.h>

void main()

{

int n,i;

float sum,ave,m,max,min;

while((scanf("%d",&n))!=EOF)

{

scanf("%f",&m);

max=min=sum=m;

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

{

scanf("%f",&m);

sum=sum+m;

if (m>max)

{

max=m;

}

else if (m<min)

{

min=m;

}

}

ave=(sum-max-min)/(n-2);

printf("%1.2f\n",ave);

}

}

错误版本:

#include <stdio.h>

void main()

{

int n,i;

float sum,ave,m,max,min;

while((scanf("%d",&n))!=EOF) {

scanf("%f",&m);

max=min=sum=m;

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

{

scanf("%f",&m);

sum=sum+m;

if (m>max)

{

max=m;

}

else

{

min=m;

}

}

ave=(sum-max-min)/(n-2);

printf("%1.2f\n",ave);

}

}

这是我第一次做该题时犯下的错误。该段程序中的if,else语句块存在逻辑错误,没有想清楚m 值与最大值、最小值如何进行比较,就匆忙写代码。

查看文章

C程序设计基础-多项式求和2009-10-30 19:24问题描述

多项式的描述如下:

1 - 1/

2 + 1/

3 - 1/

4 + 1/

5 - 1/

6 + ...

现在请你求出该多项式的前n项的和。

输入

输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m 个正整数,对于每一个整数(不妨设为n,n<100

0),求该多项式的前n项的和。

输出

对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。

输入样例

2

1 2

输出样例

1.00

0.50

源代码

正确版本:

01.#include <stdio.h>

02.main()

03.{

04.int m,n,i,j,k;

05.double s;

06.scanf("%d",&m);

07.for (i=1;i<=m;i++)

08. {

09. scanf("%d",&n);

10. s=0;

11. for (j=1;j<=n;j++)

12. { k=1;

13. if (j%2==0)

14. {

15. k=(-1);

16. }

17.

18.

19. s=s+k*(1.00/j);

20.

21. }

22. printf("%.2lf\n",s);

23. }

24.}

错误版本:

01.#include <stdio.h>

02.main()

03.{

04.int m,n,i,j;

05.double s;

06.scanf("%d",&m);

07.for (i=1;i<=m;i++)

08. {

09. scanf("%d",&n);

10. s=0;

11. for (j=1;j<=n;j++)

12. {

13. if (j%2==0)

14. {

15. j=(-1)*j;

16. }

17.

18.

19. s=s+(1.00/j);

20.

21. }

22. printf("%.2lf\n",s);

23. }

24.}

该段代码中的if语句块存在逻辑错误。由于没有考虑到j被赋值后再递增会破坏整个循环,使得程序出错。此时,应当引入一个新的变量来解决该问题。

查看文章

C程序设计基础-合法标识符2009-10-30 21:22问题描述

输入一个字符串,判断其是否是C的合法标识符。

输入

输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。

输出

对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。

输入样例

3

12ajf

fi8x_a

ff ai_2

输出样例

no

yes

no

源代码

正确版本:

#include <stdio.h>

void main()

{

int n,i,j,flag1,flag2,flag3;

char c;

scanf("%d",&n);

getchar();

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

{

flag1=flag2=flag3=0;

j=0;

while ((c=getchar())!='\n')

{

j++;

if (j==1)

{

if (c>='a'&&c<='z'||c=='_')

flag1=1;

}

else

{

(c>='a'&&c<='z'||c>='A'&&c<=' Z'||c=='_'||c>='1'&&c<='9')

flag2=1;

else

flag3=1;

}

}

if (flag1==1&&flag2==1&&flag3==0)

printf("yes\n");

else

printf("no\n");

}

}

错误版本:

#include <stdio.h>

void main()

{

int n,i,j,var;

char c;

scanf("%d",&n);

getchar();

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

{

j=0;

c=getchar();

while((c=getchar())!='\n')

{

j++;

if (j==1)

{

if (c>='a'&&c<='z'||c=='_')

{

var=1;

}

else

{

var=0;

break;

}

}

else

if

(c>='a'&&c<='z'||c=='_'||c>='0'& &c<='9')

{

printf("果然执行了这一语句块!\n ");

var=1;

}

else

{

var=0;

break;

}

}

}

if (var==0)

{

printf("no\n");

}

else

{

printf("yes\n");

}

}

}

该段程序中错误地使用了break,导致break后面的else语句块也被执行。对于此类题目,还是应当使用条件变量。这题中,隐含的第三个条件变量flag3比较难想到,这是一个思维

缺陷。

查看文章

C程序设计基础-小明A+B2009-11-02 21:00问题描述

小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算.

对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于100, 那么小明也仅保留计算结果的最后两位.

例如, 对于小明来说:

1) 1234和34是相等的

给定非负整数A和B, 你的任务是代表小明计算出A+B的值.

输入

输入数据的第一行为一个正整数T, 表示测试数据的组数. 然后是T组测试数据. 每组测试数据包含两个非负整数A和B(A和B均在int型可表示的范围内).

输出

对于每组测试数据, 输出小明A+B的结果.

输入样例

2

35 80

15 1152

输出样例

15

67

源代码

01.#include <stdio.h>

02.void main()

03.{

04.int T,i,j,A,B,sum,temp;

05.scanf("%d",&T);

06.getchar();

07.for(i=1;i<=T;i++)

08.{

09.sum=0;

10.scanf("%d %d",&A,&B);

11.sum=A+B;

12.for(j=1;sum>=100;j++)

13.{

14.sum=sum-100;

15.}

16.printf("%d\n",sum);

17.}

18.}

C程序设计基础-MAX,NUM2009-11-02 20:37问题描述

There are some students in a class, Can you help teacher find the highest student .

输入

here are some cases. The first line contains an integer t, indicate the cases; Each case have an integer n ( 1 ≤n ≤100 ) , followed n students’height.

输出

For each case output the highest height, the height to two decimal plases;

输入样例

2

3 170.00 165.00 180.00

4 165.00 182.00 172.00 160.00

输出样例

180.00

182.00

源代码

#include <stdio.h>

void main()

{

int t,n,i,j;

float height,max;

scanf("%d",&n);

getchar();

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

{

scanf("%d",&t);

scanf("%f",&height);

max=height;

for(j=1;j<t;j++)

{

scanf("%f",&height);

if(height>max)

{

max=height;

}

}

printf("%.2f\n",max);

}

}

查看文章

C程序设计基础-单词数2009-11-02 20:24问题描述

小鱼最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里单词的总数。下面你的任务是帮助小鱼解决这个问题。

输入

有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由字母和空格组成,没有标点符号,遇到#时表示输入结束。每行的开头是字母或者是#,单词之间用若干个空格分开。

输出

每组只输出一个整数,其单独成行,该整数代表一篇文章里单词的总数。

输入样例

you are my friend

#

输出样例

4

源代码

#include <stdio.h>

void main()

{

char c;

int sum,word;

while ((c=getchar())!='#')

{

sum=word=0;

while ((c=getchar())!='\n')

{

if (c==' ') word=0;

else if (word==0)

{word=1;

sum++;

}

}

printf("%d\n",sum);

}

}

该题难点在于利用变量word来使得第一个单词自动加一。

C程

序设计基础-开关灯2009-11-02 19:13问题描述

有n只灯泡排成一条线,编号分别为1,2,...,n。初始状态灯泡都是不亮的。在这些灯泡上执行一系列的开关灯操作。这些操作的编号为1,2,3,.....,第i次操作把编号为i的倍数的灯泡的开关状态变换一下(亮的变成不亮,不亮的变成亮)。

输入

每个测试数据值为包含一个整数n ( 0< n<= 10^5)单独一行构成,由多个测试数据,输入有EOF结束。

输出

对每种情况,输出执行了无穷多次开光灯操作后第n只灯泡的状态。0表示灯不亮,1表示等亮。每个测试数据的输出单独一行。

输入样例

1

5

输出样例

1

源代码

#include <stdio.h>

void main()

{

int n,i,j,light[100000];

while((scanf("%d",&n))!=EOF)

{

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

{

light[i]=0;

}

for (j=1;j<=n;j++)

{

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

{

if (i%j==0)

{

if (light[i]==0)

light[i]=1;

else

light[i]=0;

}

}

}

printf("%d\n",light[n]);

}

查看文章

C程序设计基础-亲和数2009-10-31 21:10问题描述

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约数为1、2、4、71、142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。

你的任务就编写一个程序,判断给定的两个数是否是亲和数

输入

输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B;其中0 <= A,B <= 600000 ;

输出

对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。

输入样例

2

220 284

100 200

输出样例

YES

NO

源代码

#include <stdio.h>

void main()

{

int m,i,j,A,B,sum1,sum2;

scanf("%d",&m);

getchar();

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

{

scanf("%d %d",&A,&B);

sum1=sum2=0;

for (j=1;j<A;j++)

{

if (A%j==0)

{

sum1=sum1+j;

}

}

for (j=1;j<B;j++)

{

if (B%j==0)

{

sum2=sum2+j;

}

}

if (sum1==B&&sum2==A)

{

printf("YES\n");

}

else

{

printf("NO\n");

}

}

}

查看文章

C程序设计基础-统计字符数2009-10-31 20:19

问题描述

判断一个由a-z 这26 个字符组成的字符串中哪个字符出现的次数最多。输入

第 1 行是测试数据的组数n,每组测试数据占 1 行,是一个由a-z 这26 个字符组成的字符串,每组测试数据占一行,每行数据不超过1000 个字符且非空。

输出

输出总共n 行,每行输出对应一个输入。一行输出包括出现次数最多的字符和该字符出现的次数,中间是一个空格。如果有多个字符出现的次数相同且最

多,那么输出ascii 码最小的那一个字符。

输入样例

2

abbccc

adfadffasdf

输出样例

c 3

f 4

源代码

#include <stdio.h>

void main()

{

int n,i,j,num[26],max;

char c,x;

scanf("%d",&n);

getchar();

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

{

for (j=0;j<=25;j++) //初始化数组

{

num[j]=0;

}

while ((c=getchar())!='\n') //统计字符

{

j=c-'a';

num[j]++;

}

max=num[0];

x='a';

for (j=1;j<=25;j++) //比较

{

if (max<num[j])

{

max=num[j];

x='a'+j;

}

}

printf("%c %d\n",x,max);

}

}

该问题的难点在于利用数组进行统计并进行比较。

查看文章

C程序设计基础-循环移动2009-12-16 20:56问题描述

给定一组整数,要求利用数组把这组数保存起来,再利用指针实现对数组中的数循环移动。假定共有n个整数,则要使前面各数顺序向后移m个位置,并使最后m各数变为最前面的m各数。

图1:

输入

输入有两行:第一行包含一个正整数n和一个正整数m,第二行包含n个正整数。每两个正整数中间用一个空格分开。

输出

输出有一行:经过循环移动后数组中整数的顺序依次输出,每两个整数之间用空格分隔。

输入样例

11 4

15 3 76 67 84 87 13 67 45 34 45

输出样例

67 45 34 45 15 3 76 67 84 87 13

提示

不要用先输出后m个数,再输出前n-m个数的方法实现,也不要用两个数组的方式实现。

要求只用一个数组的方式实现,一定要保证在输出结果时,输出的顺序和数组中数的顺序是一致的。

源代码

#include <stdio.h>

void Move(int num[1000],int n,int m)

{

int i;

for(i=n-1;i>=0;i--)

{

num[i+m]=num[i];

}

for(i=0;i<m;i++)

{

num[i]=num[n+i];

}

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

{

if(i!=n-1)

printf("%d ",num[i]);

else

printf("%d\n",num[i]);

}

}

void main()

{

int n,m,i,num[1000];

scanf("%d%d",&n,&m);

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

scanf("%d",&num[i]);

Move(num,n,m);

}

查看文章

C程序设计基础-指针字符串比较2009-12-15 21:34问题描述

编一程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。

两个字符串用gets函数读入。两个字符串的长度不超过1000。

输出的正数或负数应是相比较的两个字符串相应字符的ASCII码的差值。如果两个字符串中有多个相应的字符不等,则取第一次相应不等的字符串的差值。

例如,“A”与“C”相比,由于“A”<“C”,应输出负数,同时由于‘A’与‘C’的ASCII码差值为2,因此应输出“-2”。

同理:“And”和“Aid”比较,根据第2个字符比较结果,“n”比“i”大5,因此应输出“5”。输入

输入数据第一行包含一个数n,表示有n组测试数据。

其中每组数据包括两行:

第一行是字符串s1,第二行是字符串s2。

输出

对于每组测

试数据,输出s1与s2比较的结果。输入样例

2

A

C

And

Aid

输出样例

-2

5

源代码

#include <stdio.h>

#include <string.h>

int strCMP(char *p1,char *p2)

{

int s;

while(*p1!='\0'||*p2!='\0')

{

if(*p1!=*p2)

{

s=*p1-*p2;

return s;

}

p1++;

p2++;

}

}

void main()

{

int n,i;

char s1[1100],s2[1100];

scanf("%d",&n);

getchar();

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

{

gets(s1);

gets(s2);

printf("%d\n",strCMP(s1,s2));

}

}

查看文章

C程序设计基础-指针矩阵规范化2009-12-15 21:14问题描述

有一种矩阵规范化是这样做的:先找出矩阵的每一行中的最大值,在每行的每个元素分别除该行的最大值。

要求写一个函数实现矩阵的规范化,在函数中使用指针。

输入

输入第一行是两个整数n(小于50)和m(小于50),分别表示矩阵的行数与列数。接下来n行,每行m个浮点数,之间用空格分开。

输出

输出规范化后的矩阵,所有元素保留2位小数。总共n行,每行m个浮点数。之间用空格分开,注意每行最后一个元素后面没有空格。

输入样例

3 3

1 2 3

4 5 6

7 8 9

输出样例

0.33 0.67 1.00

0.67 0.83 1.00

0.78 0.89 1.00

源代码

#include <stdio.h>

void InputData(float (*p)[100],int n,int m) {

int i,j;

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

for(j=0;j<m;j++)

scanf("%f",*(p+i)+j);

}

void Normal(float (*p)[100],int n,int m)

{

int i,j;

float max[100];

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

{

max[i]=*(*(p+i)+0);

for(j=0;j<m;j++)

{

if(max[i]<*(*(p+i)+j))

max[i]=*(*(p+i)+j);

}

}

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

for(j=0;j<m;j++)

*(*(p+i)+j)/=max[i];

}

void OutputData(float (*p)[100],int n,int m) {

int i,j;

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

for(j=0;j<m;j++)

{

if(j!=m-1)

printf("%.2f ",*(*(p+i)+j));

else

printf("%.2f\n",*(*(p+i)+j));

}

}

void main()

{

int n,m;

float num[100][100];

scanf("%d%d",&n,&m);

相关主题
文本预览
相关文档 最新文档