Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21419
  • 博文数量: 12
  • 博客积分: 271
  • 博客等级: 二等列兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 11:17
文章分类

全部博文(12)

文章存档

2012年(12)

我的朋友
最近访客

分类: C/C++

2012-06-03 18:46:47

A - The Hardest Problem Ever
解题:密码转换题。不算麻烦,只是大写字母之间要进行后移五个的置换。
重点是实现END的单句结束和ENDOFINPUT的全部结束。
注意题目规定的字符串长度大小1-200个字符长度。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int trans(char c)
  5. {
  6.     if(c>='A'&&c<='E')
  7.         return c-'A'+'V';
  8.     else if(c>='F'&&c<='Z')
  9.         return c-5;
  10.     else
  11.         return c;
  12. }


  13. int main()
  14. {
  15.     char s[210];
  16.     char pd[20];
  17.     int i;
  18.     while(strcmp(pd,"ENDOFINPUT"))
  19.     {
  20.         gets(pd);
  21.         if(!strcmp(pd,"START"))
  22.         {
  23.             gets(s);
  24.             for(i=0;s[i];i++)
  25.                 s[i]=trans(s[i]);
  26.             gets(pd);
  27.         }
  28.         if(!strcmp(pd,"END"))
  29.         {
  30.             puts(s);
  31.             continue;
  32.         }
  33.     }
  34.     return 0;
  35. }
B - IP Address
解题:IP地址的转换。
输入32位的二进制数字之后,转换为相应IP地址。
考虑到这些数字要八个八个读取,而且二进制代码都连在了一起。所以应该采用字符型逐字读入。
本来想的是通过循环逐个字符读入,但是因为字符读取的特殊性,逐个字符读入很容易乱(是因为回车的关系),所以只能通过定义一个字符数组,一次把所有字符全存入,再进行处理了。。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int addr[4];
  6.     int i,j,n;
  7.     char s[35];
  8.     scanf("%d",&n);
  9.     while(n--)
  10.     {
  11.         scanf("%s",s);
  12.         for(i=0;i<4;i++)
  13.         {
  14.             addr[i]=0;
  15.             for(j=0;j<8;j++)
  16.             {
  17.                 addr[i]=addr[i]*2+s[8*i+j]-'0';
  18.             }
  19.         }
  20.         printf("%d.%d.%d.%d\n",addr[0],addr[1],addr[2],addr[3]);
  21.     }
  22.     return 0;
  23. }
C - Basically Speaking
解题:进制的转换问题。有了字符串转数字函数和进制转换函数,此题也不算太难。但是应当注意右对齐的问题,和上界问题(不能超过七位否则报错)。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>


  4. int main()
  5. {
  6.     char s[100];
  7.     int a,b;

  8.     while(scanf("%7s",&s)!=EOF)
  9.     {
  10.         scanf("%2d%2d",&a,&b);
  11.         itoa(strtol(s,NULL,a),s,b);
  12.         if(strlen(s)<=7)
  13.         {
  14.             for(a=0;s[a];a++)
  15.                 if(s[a]>='a'&&s[a]<='z')
  16.                     s[a]=s[a]-'a'+'A';
  17.             printf("%7s\n",s);
  18.         }
  19.         else
  20.             puts(" ERROR");
  21.     }
  22.     return 0;
  23. }
D - Perfect Pth Powers
折磨我最长时间的一道题。一个数如果可以分为x的y次方的话,就输出y,如果存在很多x和y的组合的话,那么输出最大的y。如果不存在xy组合,则输出1.
解题:因为pow函数的精度问题,只有在后面加上0.5,再强制取整就可以解决。之前以为是算法问题,思考了很长时间,但是最后才发现根本不是这种问题。。。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <math.h>
  3. typedef __int64 ll;
  4. int main()
  5. {
  6.     int flag;
  7.     ll x,p;
  8.     while(scanf("%I64d",&x) && x)
  9.     {
  10.         if(x<0) flag=-1;
  11.         else flag=1;
  12.         x*=flag;
  13.         for(p=31;p>=1;p--)
  14.         {
  15.             if(flag<0 && p%2==0) continue;
  16.             ll s=(ll)(pow(1.0*x,1.0/p)+0.5);
  17.             ll y=1;
  18.             for(int i=0;i<p;i++) y*=s;
  19.             if(x==y) break;
  20.         }
  21.         printf("%d\n",p);
  22.     }
  23.     return 0;
  24. }
E - 时间日期格式转换
基本的输出问题。
解题:对于不足两位数字之前补零的问题。可以采取 %02d 的转义符解决。
am/pm问题,可以判断将00点--11点判断为am  12点---23点判断为 pm  
最后把00点转换为24点,再将13-24区间的小时数减去12转换为“12小时制”显示方式。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. int main()
  5. {
  6.     int n,f=0;
  7.     int date[3];
  8.     int time[3];
  9.     char ap[2][3]={"am","pm"};
  10.     scanf("%d",&n);
  11.     while(n--)
  12.     {
  13.         scanf("%d/%d/%d-%d:%d:%d",&date[0],&date[1],&date[2],&time[0],&time[1],&time[2]);
  14.         if(time[0]<12) f=0;
  15.         else f=1;
  16.         if(time[0]==0) time[0]=24;
  17.         if(time[0]>12) time[0]-=12;
  18.         printf("%02d/%02d/%d-%02d:%02d:%02d%s\n",date[1],date[2],date[0],time[0],time[1],time[2],ap[f]);
  19.     }
  20.     return 0;
  21. }
F - Binomial Showdown
解题:别看题目很长,其实就是求排列数。
但是如果按照阶乘一步一步来就错了,因为先阶乘再除很容易超出数字的表达界限。
所以应当在结成的同时,能除尽量先除,这样就可以尽可能地不超出界限。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <math.h>



  3. __int64 jiecheng(int a,int b,int c)
  4. {
  5.     int t,i=2;
  6.     __int64 s=1;
  7.     if(b<c)
  8.     {t=c;c=b;b=t;}
  9.     for(t=b+1;t<=a;t++)
  10.     {
  11.         s=s*t;
  12.         while(s%i==0&&i<=c)
  13.         {
  14.             s=s/i;
  15.             i++;
  16.         }
  17.     }
  18.     while(s%i==0&&i<=c)
  19.     {
  20.         s=s/i;
  21.         i++;
  22.     }
  23.     return s;
  24. }

  25. int main()
  26. {
  27.     int a,b;
  28.     __int64 s;
  29.     while(scanf("%d%d",&a,&b),a||b)
  30.     {
  31.         s=jiecheng(a,b,a-b);
  32.         printf("%I64d\n",s);
  33.     }
  34.     return 0;
  35. }

阅读(605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~