当前位置:文档之家› 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

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输出
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。
输入样例
3 99 98 97
4 100 99 98 97
输出样例
98.00
98.50

源代码

正确版本:

#include
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{
scanf("%f",&m);
sum=sum+m;
if (m>max)
{
max=m;
}
else if (m{
min=m;
}
}
ave=(sum-max-min)/(n-2);
printf("%1.2f\n",ave);
}
}

错误版本:

#include
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{
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
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
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
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
{
if (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
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是相等的
2) 35+80=15

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

输入

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

输出

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

输入样例

2
35 80
15 1152

输出样例

15
67

源代码

01.#include
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
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{
scanf("%f",&height);
if(height>max)
{
max=height;
}
}
printf("%.2f\n",max);
}
}
查看文章
C程序设计基础-单词数2009-11-02 20:24问题描述

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

输入

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

输出

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

输入样例

you are my friend
#

输出样例

4

源代码

#include
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
0

源代码
#include
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
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{
if (A%j==0)
{
sum1=sum1+j;
}
}
for (j=1;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
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{
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
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{
num[i]=num[n+i];
}
for(i=0;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;iscanf("%d",&num[i]);
Move(num,n,m);
}

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

编一程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1两个字符串用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
#include
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
void InputData(float (*p)[100],int n,int m)
{
int i,j;
for(i=0;ifor(j=0;jscanf("%f",*(p+i)+j);
}
void Normal(float (*p)[100],int n,int m)
{
int i,j;
float max[100];
for(i=0;i{
max[i]=*(*(p+i)+0);
for(j=0;j{
if(max[i]<*(*(p+i)+j))
max[i]=*(*(p+i)+j);
}
}
for(i=0;ifor(j=0;j*(*(p+i)+j)/=max[i];

}
void OutputData(float (*p)[100],int n,int m)
{
int i,j;
for(i=0;ifor(j=0;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);
InputData(num,n,m);
Normal(num,n,m);
OutputData(num,n,m);
}

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