首页 | 通行证 | 论坛 | BLOG | 书评 | 开发文章 | 人才招聘 | 资讯 | 工具下载 | 源码下载 | 项目交易 | 兴趣小组 | 网友作品 | C语言试题测试 | 资源共享 | ACM题库

注册新会员

请登陆或者注册新用户   用户名    密  码   记住密码  注册新用户  忘记密码了

 您所在位置:论坛首页C/C++语言编程比赛 —第64次编程比赛
 本帖地址: http://bbs.pfan.cn/post-266850.html [复制地址] [搜索相关帖子]
  发 新 帖   回 帖   快速回帖
 主题:第64次编程比赛
作者:nobush
专家分:380
级别:2
 会员信息
 发短消息
 所属BLOG
发表时间:2008-2-2 11:01:00    本帖已结帖! [只看作者帖] [只看得分帖] [只看我的回帖]
楼主
豬年最後一次比賽,希望無論新人老鳥大家都能通過!
比賽一共兩題,呵呵,本來想出一道,考察基本功,但是或許高手們會認為太簡單,又編了一道題,博大家一笑^_^

截止時間:    2月4日19時11分 立春

引用

主题:
加拿大電信有一特殊的报文,把原始信息拆解后,混入一些杂乱信息流再发送。现在我们要写一个函数,目的是从收到的信息流中加工出有效的内容。

int decollator(const char SOH[ ],   char text[ ]) 
{
    ...
}

SOH 是以0值结尾的string。他保存待处理的信息流;
text 保存提炼出的有效信息,他已分配了足夠空间,函数中不必考虑溢出问题;
返回值 是text中字符个数。

处理规则如下:
1、  搜索信息流中的 ‘1’ 和‘0’,每找到8个一组 就按照“二进制数”特征转为ASCII字符,如果这个字符是可打印字符(meaningful character)即为有效字符,保存
例如 01100001    -> 97 ->  'a'     (‘a’将收录到text中)
2、  如果遇到信息流结尾,或规则3、4情况时,8个一组的‘1’或‘0’并没找齐,那么用‘0’补齐再处理
3、  信息流中出现关键字“RPT”并且紧跟一个自然数n(n不超过255),那么:将刚才得到的有效字符重复n次
例如: " 01100010 RTP9 "    -> "bbbbbbbbb" (九个‘b’将收录到text中)
4、  信息流中出现关键字“SKP”,那么:忽略信息流中接下来的8个‘1’或‘0’


副题:
  你去爷爷奶奶家接他们过年,恰好不在家。好不容易拨通了电话,匆忙中奶奶在电话中说“我们还在XX市场排队呢,一会儿就会来,要不你来接我们吧,出门往西四个路口,再往南走几个路口就到了,说不定在路上可以碰面呢……”
    你刚跨出门,就想到电话中并没讲清楚具体怎么走法。能不能碰面还真是个问题。
    你知道,这个城镇道路全是标准的十字路口,而且路口的间距都相同,奶奶家坐落在一个路口上,XX市场在另外某个路口上。
    如果我再告诉你,按照就近的原则,从奶奶家到XX市场可以有70条不同路线,而且每条路线距离都相等。
  那么,你能否知道奶奶口中所说“几个路口”到底是多少个?
    请用程序求得答案。


注:本次測試環境 OPEN WATCOM (16位)

  最后修改于2008-2-2 11:05:00

0
作者:plane
专家分:310
级别:2

发表时间:2008-2-2 11:26:00   
1 楼  

//主题
int pow2[8]={1,2,4,8,16,32,64,128};
int decollator(const char SOH[ ],   char text[ ]){
  int i=0,j=7,l=strlen(SOH),pt=0;
  int t=0,f=1;
  while(i<l){
    if(SOH[i]=='1'||SOH[i]=='0'){
      t+=pow2[j]*(SOH[i]-'0');
      j--;
      if(j<0||i+1>=l){
        if(t<128){
          text[pt++]=(char)t; 
          f=1;
        }
        else
          f=0;
        j=7;
        t=0;
      }
      i++;
    }
    else if(SOH[i]=='R'){
      i+=4;
      if(j==7&&f){
        t=text[--pt];
      }
      else if(t>=128||(j==7&&f==0)){
        j=7;
        t=0;
        continue;
      }
      for(int m=0;m<(SOH[i-1]);m++)
        text[pt++]=t;
    }
    else if(SOH[i]=='S')
      i+=11;
  }
  text[pt]=0;
  return pt;
}


//副题
#include <stdio.h>
int  opt[100][5];
int main()
{
    for(int a=1;a<1000;a++){
      for(int i=0;i<=a;i++){
        opt[i][0]=1;
      }
      for(int i=0;i<=4;i++)
        opt[0][i]=1;
      for(int i=1;i<=a;i++)
        for(int j=1;j<=4;j++)
          opt[i][j]=opt[i-1][j]+opt[i][j-1];
      if(opt[a][4]==70){
        printf("ans is %d\n",a);
        break;
      }
    }
    return 0;    
}

  最后修改于2008-2-2 12:51:00

签名档

http://www.mymbox.cn/Images/Album/200811614263043222.jpg
  此帖尚未评分
作者:ID43
专家分:0
级别:1

发表时间:2008-2-2 12:07:00   
2 楼  
第二题:

#include <stdio.h>

int main(){
  int i,j;
  for (i=0,j=24;;i++){
    i++;
    j/=i;
    j*=i+4;
    if (j==1680) break;
  }
  printf("%d\n",i);
  return 0;
}

算法如下:
由于总共走x+4段路程,并且其中有4段是往西走,因此总的走法是C(x+4,4)种。求的结果也就是C(x+4,4)=70
由于C(x+4,4)=(x+4)!/x!/4!=0=70
进而(x+1)(x+2)(x+3)(x+4)=70*24=1680
因而枚举x即可

 

  此帖尚未评分
作者:Twent
专家分:30
级别:1

发表时间:2008-2-2 16:49:00   
3 楼  
#include <iostream>
第2题- -
using namespace std;
int main()
{
    for (long n=1;;n++)
    {
        if ((n+1)*(n+2)*(n+3)*(n+4)==70*24)
        {
           cout<<n<<endl;
           break;
        }
    }
    return 0;
    
}

 

  此帖尚未评分
作者:yxs0001
专家分:9560
级别:48级别:48级别:48级别:48级别:48级别:48级别:48

发表时间:2008-2-4 11:20:00   
4 楼  
副题:
#include <iostream>
int result()
{
int left = 120;
int right = 70*24;
int i = 1;
do{
i++;
left*=i+4;
right *= i;
}while(left<right);
return i;
}
int main()
{
cout<<result()<<endl;
return 0;
}

 

  此帖尚未评分
[首页] [上页][下页] [尾页]     共有 4 回帖 当前第 1 页(共1页 20帖/页)     跳转至第
  发 新 帖   回 帖   快速回帖   刷新版面

版主管理:  删除此帖   删除回复帖   转贴   置顶   加入精华   强制结帖   >>>进入管理页面

此帖已结帖,禁止回复


关于本站 - 网站导航 - 广告服务 - 联系站长 - BUG报告 - 友情链接 - 赞助本站
Copyright© 1999-2008 Programfan.com. All Rights Reserved
论坛制作&维护:Hannibal    Email: webmaster@pfan.cn
最佳浏览效果:IE6.0+ 或 FireFox 1.5+ 分辨率:1024*768