[关闭]
@okokme 2018-07-25T12:17:11.000000Z 字数 6935 阅读 696

XiyouLinuxGroup2018暑假训练——第1周练习题

c语言

---emmm做个记录,虽然是水题,也有一些要注意到的点,留个痕迹吧~

A - 字符排序

输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。

Input

输入数据有多组,每组占一行,有三个字符组成,之间无空格。

Output

对于每组输入数据,输出一行,字符中间用一个空格分开。

Sample Input

qwe
asd
zxc

Sample Output

e q w
a d s
c x z

代码展示

  1. #include<stdio.h> //关键是把输入后的回车过滤掉
  2. //三个字母直接定义成三个变量利于操作,不用使用数组了
  3. int main()
  4. {
  5. char a,b,c;
  6. char t;
  7. while((a= getchar())!=EOF) //注意这里要在EOF前加括号!!!
  8. {
  9. b=getchar();
  10. c=getchar();
  11. getchar(); //过滤回车
  12. if(a>b)
  13. {
  14. t=a;
  15. a=b;
  16. b=t;
  17. }
  18. if(a>c)
  19. {
  20. t=a;
  21. a=c;
  22. c=t;
  23. }
  24. if(b>c)
  25. {
  26. t=b;
  27. b=c;
  28. c=t;
  29. }
  30. printf("%c %c %c\n",a,b,c);
  31. }
  32. return 0;
  33. }

在此插入一个小问题
C语言printf("%d",15.0/2)结果为0

原来是因为printf不会执行类型转换。
printf调用时,将参数入栈,最后只能看到栈顶的参数,就是printf的第一个参数,然后解析这个字符串,再去栈里挨个找参数,比如printf("%d%d\n", a,b);解析字符串,看到%d时,那么先从栈顶向下偏移一个字符串指针的长度,就是整形数int的位置了,从栈里当前指针的位置到sizeof(int)里边保存的就是这个int a的值了,然后继续解析字符串,看到%f,再去栈中a的上边找一个sizeof(double)的长度,就是double f的值了。

这里计算出来其实已经是double类型了,将double类型入栈,根据计算机组成原理上double类型存储,7.5转换成16进制是0x401e000000000000
7.5转化为16尽职的存储方式

在内存中应该是所以printf输出%d是指针只是下移32位,所以结果为0 。%lf输出的才是double7.5.。如果输出%lld,则将这些16进制看成无符号整数,结果为4620130267728707584。和内存存储有关。


————————————————————————————————————————————————————————————

B-球体积

根据输入的半径值,计算球的体积。

Input

输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。

Output

输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。

Sample Input

1
1.5

Sample Output

4.189
14.137

Hint

#define PI 3.1415927

  1. #include<stdio.h>
  2. #include<math.h>
  3. #define PI 3.1415927
  4. int main()
  5. {
  6. double r;
  7. while((scanf("%lf",&r)!=EOF))
  8. {
  9. printf("%.3lf\n",PI*r*r*r*4.0/3.0); //做题时用到float,double数据型计算时,乘除用小数如4.0,3.4等
  10. }
  11. return 0;
  12. }

这道题比较简单,,不用float,float(33.3333总共6位)。
2.在对浮点型常量进行运算时,应该对整数数字也化为小数运算。


————————————————————————————————————————————————————————————

C-回文串

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。

Input

输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。

Output

如果一个字符串是回文串,则输出"yes",否则输出"no".

Sample Input

4
level
abcde
noon
haha

Sample Output

yes
no
yes
no

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. int n,large;
  6. int i,j;
  7. char a[100]; //第一次在这里出错,理由是我写的a[10]空间过于小,在其后进行后台其他字符串测试时,溢出出错
  8. int flag;
  9. scanf("%d",&n);
  10. for(i=0; i<n; i++)
  11. {
  12. flag=0; //一定要注意在有++的循环中最开始初始化
  13. scanf("%s",a);
  14. large=strlen(a);
  15. for(j=0;j<large/2; j++)
  16. {
  17. if(a[j]==a[large-1-j])
  18. flag++;
  19. }
  20. if(flag==large/2)
  21. printf("yes\n");
  22. else
  23. printf("no\n");
  24. }
  25. }

此题难度不大,但是要注意:
1.字符数组定义长度不能太短。
2.注意在有自加运算++的地方一定要在循环中开始的地方初始化。!!!

————————————————————————————————————————————————————————————

D-最小公倍数

给定两个正整数,计算这两个数的最小公倍数。

Input

输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.

Output

对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。

Sample Input

10 14

Sample Output

70

  1. #include<stdio.h>
  2. int fun(int a,int b)
  3. {
  4. int t;
  5. int d;
  6. if(b>a)
  7. {
  8. t=a;
  9. a=b;
  10. b=t;
  11. }
  12. while(b!=0)
  13. {
  14. d=b;
  15. b=a%b;
  16. a=d;
  17. }
  18. return a;
  19. }
  20. int main()
  21. {
  22. int a,b;
  23. int n;
  24. while((scanf("%d %d",&a,&b))!=EOF) //没事干别老给while 后乱加分号
  25. {
  26. // scanf("%d %d",&a,&b);
  27. n=a*b/fun(a,b);
  28. printf("%d\n",n);
  29. }
  30. return 0;
  31. }

此题为经典最小公倍数题,要注意的是:
1.最大公因数的算法。
2.没事别乱在while后加分号,很难找错...

————————————————————————————————————————————————————————————

E-计算器

Input

输入的数据中,第一行是一个整数 N , 接下来有 N 行,每行首先有一个字符
op,然后是两个用空格分隔的正整数 a 和 b。
数据范围:
(1) 0 < N < 1000, 0 < a, b < 10000;
(2) op ∈ { '+', '-', '*', '/' }

Output

对于每一行数据,输出 a op b 的值,若这个值不是一个整数,则保留两位
小数。 每组数据占一行。

Sample Input

4
+ 1 2
- 1 2
* 1 2
/ 1 2

Sample Output

3
-1
2
0.50

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n;
  5. float a,b;
  6. char op;
  7. float num;
  8. int i;
  9. scanf("%d",&n);
  10. getchar();
  11. if(n>0 && n<1000)
  12. {
  13. while(n--)
  14. {
  15. scanf("%c",&op);
  16. scanf("%f %f",&a,&b);
  17. if( (a>0 && a<10000) && (b>0 && b<10000))
  18. {
  19. getchar(); //在输入回车与%c 或者 c=getchar() 循环碰撞时要注意加getchar()过滤掉回车
  20. if(op == '+')
  21. printf("%.0f\n",a+b);
  22. if(op == '-')
  23. printf("%.0f\n",a-b);
  24. if(op == '*')
  25. printf("%.0f\n",a*b);
  26. if(op == '/')
  27. {
  28. if((int)(a/b) == a/b)
  29. {
  30. printf("%.0f\n",a/b);
  31. }
  32. else
  33. {
  34. num = a/b;
  35. printf("%.2f\n",num);
  36. }
  37. }
  38. }
  39. else
  40. {return 0;}
  41. }
  42. }
  43. return 0;
  44. }

此题为简单的计算器要注意的有:
1.如何判断一个数是否为整数
用int强制类型转换把要转换的那个数定义成整形,如果他们还相等,说明是整数。
例如:a=2.1
   判断 (int)a == a
   2 ?= 2.1

2.遇到scanf("%c",&ch); 或 ch=getchar();时要格外注意是否会让上面输入的回车占据这个字符。 记得输入后用getchar()消除回车。
3.注意范围
4.。。。待定找不出bug但就是。。。accept不了

————————————————————————————————————————————————————————————

G-数字序列插入

有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。

Input

输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。

Output

对于每个测试实例,输出插入新的元素后的数列。

Sample Input

3 3
1 2 4
0 0

Sample Output

1 2 3 4

代码

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int m,n;
  5. int i;
  6. int t;
  7. int flag=0;
  8. while(scanf("%d %d",&n,&m) && (n!=0 || m!=0))// ||
  9. {
  10. flag=0;
  11. if(n==0) //注意n为0的情况
  12. printf("%d\n",m);
  13. for(i=0; i<n; i++)
  14. {
  15. scanf("%d",&t);
  16. if(t<m || flag==1) // ||
  17. printf("%d",t);
  18. else
  19. {
  20. printf("%d %d",m,t);
  21. flag=1;
  22. }
  23. if(i!=n-1);
  24. printf(" ");
  25. }
  26. printf("\n");
  27. }
  28. }

此题没有用数组储存数再挨个比较数组后移,而是用的直接输入变量临时存储直接比较输出的方法。不需遍历直接比较输出,较为便捷。
注意:
1.代码中的 || 与 && 运算符使用时候的条件与区别。
2.要将所有结果都考虑进去

c语言标识符:

C语言
1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数字,但可以是字母或者下划线。例如,正确的标识符:abc,a1,prog_to。

2.不能把C语言关键字作为用户标识符,例如if ,for, while等.标识符长度是由机器上的编译系统决定的,一般的限制为8字符(注:8字符长度限制是C89标准,C99标准已经扩充长度,其实大部分工业标准都更长)。

2.标识符对大小写敏感,即严格区分大小写。一般对变量名用小写,符号常量命名用大写。
标识符命名应做到“见名知意”,例如,长度(外语:length),求和、总计(外语:sum),圆周率(外语:pi)……

4.C语言中把标识符分为三类:关键字,预定义标识符,用户自定义标识符。

在编程语言中,标识符就是程序员自己规定的具有特定含义的词,比如类名称,属性名称,变量名等。

H-合法标识符

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

Input

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

Output

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

Sample Input

3
12ajf
fi8x_a
ff ai_2

Sample Output

no
yes
no




I-三角形

给定三条边,请你判断一下能不能组成一个三角形。

Input

输入数据第一行包含一个数M,接下有M行,每行一个实例,包含三个正数A,B,C。其中A,B,C <1000;

Output

对于每个测试实例,如果三条边长A,B,C能组成三角形的话,输出YES,否则NO。

Sample Input

2
1 2 3
2 2 2

Sample Output

NO
YES

  1. #include<stdio.h>
  2. int add(float a,float b,float c)
  3. {
  4. if( (a+b)>c )
  5. return 1;
  6. else
  7. return 0;
  8. }
  9. int less(float a, float b, float c)
  10. {
  11. if( (a-b)<c)
  12. return 1;
  13. else
  14. return 0;
  15. }
  16. int main()
  17. {
  18. int n;
  19. float a,b,c;
  20. scanf("%d",&n);
  21. while(n--)
  22. {
  23. scanf("%f %f %f",&a,&b,&c);
  24. if(add(a,b,c) && add(a,c,b) && add(b,c,a) && less(a,b,c) && less(a,c,b) && less(b,c,a))
  25. {
  26. printf("YES\n");
  27. }
  28. else
  29. printf("NO\n");
  30. }
  31. }

此题没有难度,但是要注意三角形的边可以是小数,不要看见输入的数字全是整数就写成int型,应写成float型。这里很容易 Wrong Answer。

————————————————————————————————————————————————————————————

J-亲和数

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

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

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

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

Input

输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <= A,B <= 600000 ;
Output
对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
Sample Input
2
220 284
100 200
Sample Output
YES
NO

  1. #include<stdio.h>
  2. int fun(int m)
  3. {
  4. int sum=0;
  5. int i;
  6. if(m<=0)
  7. return 0;
  8. else if(m==1)
  9. return 1;
  10. else
  11. {
  12. for(i=1; i<m; i++)
  13. {
  14. if(m%i==0)
  15. sum+=i;
  16. }
  17. return sum;
  18. }
  19. }
  20. int main()
  21. {
  22. int n;
  23. int a,b;
  24. int p,q;
  25. scanf("%d",&n);
  26. while(n--)
  27. {
  28. scanf("%d %d",&a,&b);
  29. p=fun(a);
  30. q=fun(b);
  31. if(p==b && q==a)
  32. printf("YES\n");
  33. else
  34. {
  35. printf("NO\n");
  36. }
  37. }
  38. }

注意:
就是求出因子相加。注意求因数时数据的范围判断的全面性。

————————————————————————————————————————————————————————————

K-素数

对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<=50),判定该表达式的值是否都为素数。

Input

输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。

Output

对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。

Sample Input

0 1
0 0

Sample Output

OK

J题与K题的算法是互通的,相当于用的是一套模版...但是此题WrongAnswer还没找出来...
注意:
acm下函数返回值直接与数值比较好像不太行(如fun(temp)==-1)先赋给其他变量再比较吧。


L-首字母大写

输入一个英文句子,将每个单词的第一个字母改成大写字母。

Input

输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。

Output

请输出按照要求改写后的英文句子。

Sample Input

i like acm
i want to get an accepted

Sample Output

I Like Acm
I Want To Get An Accepted

  1. #include<stdio.h>
  2. int main()
  3. {
  4. char ch;
  5. int flag=0;
  6. int p=0;
  7. while((ch = getchar())!= EOF)
  8. {
  9. p++;
  10. if(p == 1)
  11. flag=1;
  12. if(flag == 1)
  13. printf("%c",ch-32);
  14. else if(flag == 0)
  15. printf("%c",ch);
  16. if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
  17. flag=0;
  18. else if(ch == '\n' || ch == ' ')
  19. flag=1;
  20. }
  21. }

与G-数字序列输出做法同理,不需要每个字符储存完成后再输出,可以输入一个字符判断完成后输出再判断下一个,因为是文件为文件看结果就可以啦

————————————————————————————————————————————————————————————

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注