A - The Hardest Problem Ever
解题:密码转换题。不算麻烦,只是大写字母之间要进行后移五个的置换。
重点是实现END的单句结束和ENDOFINPUT的全部结束。
注意题目规定的字符串长度大小1-200个字符长度。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int trans(char c)
- {
- if(c>='A'&&c<='E')
- return c-'A'+'V';
- else if(c>='F'&&c<='Z')
- return c-5;
- else
- return c;
- }
- int main()
- {
- char s[210];
- char pd[20];
- int i;
- while(strcmp(pd,"ENDOFINPUT"))
- {
- gets(pd);
- if(!strcmp(pd,"START"))
- {
- gets(s);
- for(i=0;s[i];i++)
- s[i]=trans(s[i]);
- gets(pd);
- }
- if(!strcmp(pd,"END"))
- {
- puts(s);
- continue;
- }
- }
- return 0;
- }
B - IP Address解题:IP地址的转换。
输入32位的二进制数字之后,转换为相应IP地址。
考虑到这些数字要八个八个读取,而且二进制代码都连在了一起。所以应该采用字符型逐字读入。
本来想的是通过循环逐个字符读入,但是因为字符读取的特殊性,逐个字符读入很容易乱(是因为回车的关系),所以只能通过定义一个字符数组,一次把所有字符全存入,再进行处理了。。
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int addr[4];
- int i,j,n;
- char s[35];
- scanf("%d",&n);
- while(n--)
- {
- scanf("%s",s);
- for(i=0;i<4;i++)
- {
- addr[i]=0;
- for(j=0;j<8;j++)
- {
- addr[i]=addr[i]*2+s[8*i+j]-'0';
- }
- }
- printf("%d.%d.%d.%d\n",addr[0],addr[1],addr[2],addr[3]);
- }
- return 0;
- }
C - Basically Speaking
解题:进制的转换问题。有了字符串转数字函数和进制转换函数,此题也不算太难。但是应当注意右对齐的问题,和上界问题(不能超过七位否则报错)。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main()
- {
- char s[100];
- int a,b;
- while(scanf("%7s",&s)!=EOF)
- {
- scanf("%2d%2d",&a,&b);
- itoa(strtol(s,NULL,a),s,b);
- if(strlen(s)<=7)
- {
- for(a=0;s[a];a++)
- if(s[a]>='a'&&s[a]<='z')
- s[a]=s[a]-'a'+'A';
- printf("%7s\n",s);
- }
- else
- puts(" ERROR");
- }
- return 0;
- }
D - Perfect Pth Powers
折磨我最长时间的一道题。一个数如果可以分为x的y次方的话,就输出y,如果存在很多x和y的组合的话,那么输出最大的y。如果不存在xy组合,则输出1.
解题:因为pow函数的精度问题,只有在后面加上0.5,再强制取整就可以解决。之前以为是算法问题,思考了很长时间,但是最后才发现根本不是这种问题。。。
- #include <stdio.h>
- #include <math.h>
- typedef __int64 ll;
- int main()
- {
- int flag;
- ll x,p;
- while(scanf("%I64d",&x) && x)
- {
- if(x<0) flag=-1;
- else flag=1;
- x*=flag;
- for(p=31;p>=1;p--)
- {
- if(flag<0 && p%2==0) continue;
- ll s=(ll)(pow(1.0*x,1.0/p)+0.5);
- ll y=1;
- for(int i=0;i<p;i++) y*=s;
- if(x==y) break;
- }
- printf("%d\n",p);
- }
- return 0;
- }
E - 时间日期格式转换
基本的输出问题。
解题:对于不足两位数字之前补零的问题。可以采取 %02d 的转义符解决。
am/pm问题,可以判断将00点--11点判断为am 12点---23点判断为 pm
最后把00点转换为24点,再将13-24区间的小时数减去12转换为“12小时制”显示方式。
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int main()
- {
- int n,f=0;
- int date[3];
- int time[3];
- char ap[2][3]={"am","pm"};
- scanf("%d",&n);
- while(n--)
- {
- scanf("%d/%d/%d-%d:%d:%d",&date[0],&date[1],&date[2],&time[0],&time[1],&time[2]);
- if(time[0]<12) f=0;
- else f=1;
- if(time[0]==0) time[0]=24;
- if(time[0]>12) time[0]-=12;
- printf("%02d/%02d/%d-%02d:%02d:%02d%s\n",date[1],date[2],date[0],time[0],time[1],time[2],ap[f]);
- }
- return 0;
- }
F - Binomial Showdown
解题:别看题目很长,其实就是求排列数。
但是如果按照阶乘一步一步来就错了,因为先阶乘再除很容易超出数字的表达界限。
所以应当在结成的同时,能除尽量先除,这样就可以尽可能地不超出界限。
- #include <stdio.h>
- #include <math.h>
- __int64 jiecheng(int a,int b,int c)
- {
- int t,i=2;
- __int64 s=1;
- if(b<c)
- {t=c;c=b;b=t;}
- for(t=b+1;t<=a;t++)
- {
- s=s*t;
- while(s%i==0&&i<=c)
- {
- s=s/i;
- i++;
- }
- }
- while(s%i==0&&i<=c)
- {
- s=s/i;
- i++;
- }
- return s;
- }
- int main()
- {
- int a,b;
- __int64 s;
- while(scanf("%d%d",&a,&b),a||b)
- {
- s=jiecheng(a,b,a-b);
- printf("%I64d\n",s);
- }
- return 0;
- }
阅读(624) | 评论(0) | 转发(0) |