【 2013华为杯编程大赛成都第三组前两题试题及答案】

2013-09-12 16:41:24

题目描述

某省会城市街道纵横交错,为了监控路灯的运行状况,每条街道使用一个数字字符串标识该街道上所有路灯的运行状况。
假设路灯只有如下3种状态(分别用数字0, 1, 2标识,一盏路灯只对应其中一种状态):
0 标识路灯熄灭;
1 标识路灯开启;
2 标识路灯故障;
请根据输入的字符串,找出该街道上连续的处于相同状态的路灯的最大个数。若两种状态的路灯数量相同,则返回最先出现的路灯状态。

输入

街道上连续的路灯组成的状态字符串。字符串中只包含数字,每个路灯的状态为0,1,2中的一种状态。如“1101”代表4盏路灯,第3盏路灯为熄灭状态,其它3盏为开启状态。

输出

连续为相同状态的路灯的最大数量;

上述路灯的状态;

要求:先输出数量,再输出状态,两个整数间采用一个空格间隔。如输出:

53 2

样例输入

112200111

样例输出

3 1

提示

OK

地区

成都研究所

题目描述

由实部和虚部组成,形如(a,bi)这样的数,称为复数。通信系统中,通常用32bit数来表示复数(高16bit表示实部,低16bit表示虚部),如整数524295(16进制为0x00080007)所代表的复数,实部为0x0008,虚部为0x0007。
有别于实数运算,复数加、减、乘、除运算定义如下:
复数加公式:(a,bi) + (c,di) = (a + c),(b + d)i
复数减公式:(a,bi) + (c,di) = (a - c),(b - d)i
复数乘公式:(a,bi) * (c,di) = (ac - bd),(ad + bc)i
复数除公式:(a,bi) / N = (a/N),(b/N)i
题目要求,输入N个复数,计算这个N个复数的平均值,复数Avg = (复数1*复数2 + 复数3*复数4 + … + 复数N-1*复数N) / N。
复数加、复数减、复数乘、复数除的结果仍然为复数,实部和虚部均为16bit有符号数,计算过程中,当结果大于32767(0x7fff)时,输出32767;当计算结果小于-32768(0x8000)时,输出-32768。

输入

输入共计两行

有别于实数运算,复数加减乘除运算定义如下第一行包含1个整数,表示输入复数个数N(N为偶数,N不大于1000)

第一行包含1个整数,表示输入复数个数N(N为偶数,N不大于1000)

输出

经计算得到的复数的平均值。

样例输入

4
262149,393223,524297,655371

262149 = 0x40005,393223 = 0x6007,524297 = 0x8009,655371 = 0xA00B

[(4+5i)*(6+7i) + (8+9i)*(10+11i)]/4 = (-28+236i)/4 = -7+59i

-7对应的16位有符号数为65529,59对应的16位有符号数为59,对应的32位有符号数为int((-7+65536)*65536 + 59 ) = -458693

 

4,

-196613,393223,-458761,655371

[(-4-5i)*(6+7i) + (-8-9i)*(10+11i)]/4 = (28-236i)/4 = 7-59i,对应的32位有符号数为:

int(7*65536 + (65536-59 ) = 524229

对应的4个数为:-196613,393223,-458761,655371

 

样例输出

-458693

提示

地区

成都研究所


 

注意几点:

  1. 对于复数平均值的题目,要注意数据类型,在代码中有详细的说明;
  2. 注意输入非法的检查;
  3. 注意边界条件的测试。

 


 

代码:

  1 #include <iostream>
  2 #include <cassert>
  3 using namespace std;
  4 
  5 const size_t SIZE = 1000;
  6 
  7 void CheckValidInput(const char *pStrState)
  8 {
  9     assert(pStrState != NULL);
 10     char *pCur = (char *)pStrState;
 11 
 12     while (*pCur)
 13     {
 14         assert(*pCur >= '0' && *pCur <= '2');
 15         ++pCur;
 16     }
 17 }
 18 
 19 void CountLamp(const char *pStrState,char &state,size_t &count)
 20 {
 21     CheckValidInput(pStrState);
 22 
 23     count = 0;
 24     state = '\0';
 25 
 26     char *pCur = (char *)pStrState;
 27     char curChar = '\0';
 28     size_t curTimes = 0;
 29     
 30     while (*pCur)   //对非法状态的处理???
 31     {
 32         curTimes = 0;
 33         curChar = *pCur;
 34 
 35         while (*pCur && *pCur == curChar)
 36         {
 37             ++curTimes;
 38             ++pCur;
 39         }
 40 
 41         if (curTimes > count)
 42         {
 43             state = curChar;
 44             count = curTimes;
 45         }
 46     }
 47 }
 48 
 49 const size_t BitWidth = 16;
 50 const int Max = 65535;
 51 const int MaxPositiveNum = 32767;  //2^15 - 1,是2与15异或的结果减1
 52 const int MinNegativeNum = -32768;
 53 
 54 //需要溢出处理,直接定义为short类型不能按照
 55 //当结果大于32767(0x7fff)时,输出32767;当计算结果小于-32768(0x8000)时,输出-32768
 56 //的方式处理
 57 short HandleOverFlow(int num)  //返回值类型
 58 {
 59     if (num < MinNegativeNum)
 60     {
 61         return MinNegativeNum;
 62     }
 63     else if (num > MaxPositiveNum)
 64     {
 65         return MaxPositiveNum;
 66     }
 67     
 68     return num;
 69 }
 70 
 71 int ComplexAdd(const int compNum1,const int compNum2)
 72 {
 73     short ar = compNum1 >> BitWidth;
 74     short ai = compNum1 & Max;
 75     short br = compNum2 >> BitWidth;
 76     short bi = compNum2 & Max;
 77 
 78     cout<<"("<<ar<<" + j*"<<ai<<") + ("<<br<<" + j*"<<bi<<") = ";
 79 
 80     int sumr = ar + br;   //需定义为int类型,保证溢出处理时按要求的
 81     int sumi = ai + bi;
 82 
 83     sumr = HandleOverFlow(sumr);  //HandleOverFlow返回即为short类型的
 84     sumi = HandleOverFlow(sumi);
 85 
 86     cout<<sumr<<" + j* "<<sumi<<endl;
 87     return ((sumr << BitWidth) | (sumi & Max) );
 88 }
 89 
 90 int ComplexMult(const int compNum1,const int compNum2)
 91 {
 92     short ar = compNum1 >> BitWidth;   //定义为short类型即可
 93     short ai = compNum1 & Max;
 94     short br = compNum2 >> BitWidth;
 95     short bi = compNum2 & Max;
 96 
 97     cout<<"("<<ar<<" + j*"<<ai<<") * ("<<br<<" + j*"<<bi<<") = ";
 98 
 99     int multr = ar * br - ai * bi;  //要定义为int类型,而非short类型,否则在溢出时,不能按照要求的溢出处理输出
100     int multi = ar * bi + ai * br;
101 
102     multr = HandleOverFlow(multr);
103     multi = HandleOverFlow(multi);
104 
105     cout<<multr<<" + j* "<<multi<<endl;
106 
107     return ((multr << BitWidth) | (multi & Max) );
108 }
109 
110 int  ComplexDivideN(const int  compNum1,const int N)
111 {
112     short ar = compNum1 >> BitWidth;
113     short ai = compNum1 & Max;
114 
115     cout<<"("<<ar<<" + j*"<<ai<<") / "<<N<<" = ";
116 
117     int divider =  (short)ar / N;   //divider、dividei定义为int、short都可
118     int dividei =  (short)ai / N;
119 
120     cout<<"("<<divider<<" + j* "<<dividei<<")"<<endl; 
121 
122     return ( (divider << BitWidth) | (dividei & Max) );
123 }
124 
125 int ComplexMultAddDivide(const int *compArray,const int n)
126 {
127     assert(compArray != NULL);
128     assert(n > 0 && n <= 1000 && (n % 2 == 0));
129 
130     int index;
131     long long sum = 0;
132 
133     for (index = 0;index < n;index += 2)
134     {
135         sum = ComplexAdd( sum,ComplexMult(compArray[index],compArray[index + 1]) );
136     }
137 
138     return ComplexDivideN(sum,n);
139 }
140 
141 void TestDriver()
142 {
143     //char *pStrState = "112200111";
144     //char *pStrState = "112200";
145     //char *pStrState = "12200";
146     //char *pStrState = "1200";
147     /*char *pStrState = "";
148     char state = '\0';
149     size_t count = 0;
150     CountLamp(pStrState,state,count);
151 
152     cout<<"the state appears most is : "<<state<<endl;
153     cout<<"the times is : "<<count<<endl;*/
154 
155 
156     //int compArray[SIZE] = {1,0xff00ff};
157     int compArray[SIZE] = { 262149,393223,524297,655371 };
158     //int compArray[SIZE] = { -196613,393223,-458761,655371 };
159     //int compArray[SIZE] = { 32767,32767,-32767,32767 };  //溢出测试
160     //int compArray[SIZE] = {524297,655371};
161     int n = 4;
162     int average = 0;
163     average = ComplexMultAddDivide(compArray,n);
164 
165     cout<<"the average is : "<<average<<endl;
166 }
167 
168 int main()
169 {
170     TestDriver();
171     return 0;
172 }

运行结果:

(4 + j*5) * (6 + j*7) = -11 + j* 58
(0 + j*0) + (-11 + j*58) = -11 + j* 58
(8 + j*9) * (10 + j*11) = -19 + j* 178
(-11 + j*58) + (-19 + j*178) = -30 + j* 236
(-30 + j*236) / 4 = (-7 + j* 59)
the average is : -458693
请按任意键继续. . .

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webrtc笔记(1): 基于coturn项目的stun/turn服务器搭建

webrtc是google推出的基于浏览器的实时语音-视频通讯架构。其典型的应用场景为&#xff1a;浏览器之间端到端(p2p)实时视频对话&#xff0c;但由于网络环境的复杂性(比如&#xff1a;路由器/交换机/防火墙等&#xff09;&#xff0c;浏览器与浏览器很多时候无法建立p2p连接&…

ADS中startup.s文件启动分析

映像文件分析&#xff0c;ADS 中startup.s 文件启动分析&#xff0c;学嵌入式开发ADS 必看2010-04-17 10:21声明&#xff1a; 我也是转来的&#xff0c;不是原创&#xff0c;由于别人是网易的日志&#xff0c;不能直接转&#xff0c;所以…… 感谢原创&#xff01;让我明白了st…

String Statistics(2008年珠海市ACM程序设计竞赛)

String Statistics 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 You have an n n matrix of lower-case letters. You start from somewhere in the matrix, walk in one of the eight directions (left, right, up, down, up-left, up-right, …

从0-1背包问题学习回溯法、分支界限法、动态规划

一、0-1背包问题的描述 下面将使用回溯法、分支界限法、动态规划法来分析和解决此问题。 二、回溯法 &#xff08;1&#xff09;算法步骤 &#xff08;2&#xff09;代码如下&#xff08;没有裁剪函数&#xff09;&#xff1a; 用i和n来判断结束与否&#xff0c;是因为解空间…

高可用性的HDFS—Hadoop分布式文件系统深度实践

《高可用性的HDFS—Hadoop分布式文件系统深度实践》基本信息作者&#xff1a; 文艾 王磊 出版社&#xff1a;清华大学出版社 ISBN&#xff1a;9787302282587上架时间&#xff1a;2012-5-14出版日期&#xff1a;2012 年5月开本&#xff1a;16开页码&#xff1a;371版次&#xff…

推荐:解析“extern”

http://blog.csdn.net/keensword/article/details/401114 写的很不错转载于:https://www.cnblogs.com/ATually/archive/2012/04/05/2432826.html

【字符串问题】求一个字符串中重复出现的最长的子串

2013-09-14 15:34:16 用后缀数组求一个字符串中重复出现的最长的子串。 用C中的string类可以很方便地进行操作&#xff0c;需将后缀数组保存在vector<string>&#xff0c;如下面代码中的string版本所示&#xff0c;但这样就会因为<string>有很大的开销&#xff1b;…

关于scanf和的问题

简单地说&#xff0c;如果使用scanf函数把一个字符串读进一个字符数组中&#xff0c;不要使用&&#xff1b;读取其他基本变量类型时&#xff0c;在变量名之前添加&。或者说&#xff0c;字符串名字本身就是一个地址了&#xff0c;所以不用取地址符。 如以下代码&#xf…

Oracle lower() Upper()函数

即将某字段信息中的字母转成小写、大写的方法。 将 user表里的user_name字段信息中含有字母的全部转成大写的方法&#xff1a; update user set  user_nameUpper(user_name) 同理得到将 user表里的user_name字段信息中含有字母的全部转成小写的方法&#xff1a; update user …

【作品】超级玛丽射击版

【下载地址】稍后上传 【以下内容摘自试验报告&#xff0c;可能狗屁不通&#xff0c;尽情谅解】 &#xff0d;游戏介绍: 简单的射击游戏,键盘控制动作[角色的移动,跳跃等],鼠标控制攻击的位置方向, 单击鼠标即射击,同时可以设置游戏规定时间,时间到则结束游戏. &#xff0d;游戏…

嵌入式系统Linux内核开发工程师必须掌握的三十道题

嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理&#xff0c;那么你就可以算得上是基本合格的Linux内核开发工程师&#xff0c;试试看&#xff01; 1) Linux中主要有哪几种内核锁&#xff1f; Linux的内核锁主要是自旋锁和信号…

MySQL锁的用法之行级锁

2019独角兽企业重金招聘Python工程师标准>>> 行级锁是MySQL中粒度最小的一种锁&#xff0c;他能大大减少数据库操作的冲突。但是粒度越小&#xff0c;实现的成本也越高。MYISAM引擎只支持表级锁&#xff0c;而INNODB引擎能够支持行级锁&#xff0c;下面的内容也是针…

matlab中二维插值函数interp2的使用

下面是一段产生log-normal分布的代码&#xff0c;以此进行说明。 clear all; clc; for t1:100Traffic(t) curve(t); end MaxTraffic max(Traffic); w 0.2; Wmax 2*pi*w/3000; x[0:10:300]; y[0:10:300]; Nxlength(x); Nylength(y); Sigma 0.53; t 0&#xff1b; M 10*cu…

8天玩转并行开发——第五天 同步机制(下)

承接上一篇&#xff0c;我们继续说下.net4.0中的同步机制&#xff0c;是的&#xff0c;当出现了并行计算的时候&#xff0c;轻量级别的同步机制应运而生&#xff0c;在信号量这一块 出现了一系列的轻量级&#xff0c;今天继续介绍下面的3个信号量 CountdownEvent&#xff0c;Se…

hive中not in优化

比如&#xff1a;A,B两表&#xff0c;找到ID字段中&#xff0c;存在A表&#xff0c;但不存在B表的数据。A表共13w&#xff0c;去重后3w,B表共2W&#xff0c;且有索引方法一not in&#xff0c;易理解&#xff0c;效率低&#xff0c;时间&#xff1a;1.395sselect distinct A.id …

Quartz 2D编程笔记

当我们需要在一个图形上下文中构建一个路径时&#xff0c;我们需要调用CGContextBeginPath来标记Quartz。然后&#xff0c;我们调用函数CGContextMovePoint来设置每一个图形或子路径的起始点。在构建起始点后&#xff0c;我们可以添加直线、弧、曲线。记住如下规则&#xff1a;…

bitmap算法

博文转载于http://www.cnblogs.com/dyllove98/archive/2013/07/26/3217741.html概述所谓bitmap就是用一个bit位来标记某个元素对应的value&#xff0c;而key即是这个元素。由于采用bit为单位来存储数据&#xff0c;因此在可以大大的节省存储空间算法思想 32位机器上&#xff0c…

Ubuntu下如何解压缩zip,tar,tar.gz,tar.bz2文件

tar解包&#xff1a;tar xvf FileName.tar打包&#xff1a;tar cvf FileName.tar DirName&#xff08;注&#xff1a;tar是打包&#xff0c;不是压缩&#xff01;&#xff09;———————————————.gz解压1&#xff1a;gunzip FileName.gz解压2&#xff1a;gzip -d F…

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

Insert是T-sql中常用语句&#xff0c;Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中&#xff0c;经常会遇到需要表复制的情况&#xff0c;如将一个table1的数据的部分字段复制到table2中&…

向前插入迭代器

**向前插入迭代器&#xff0c;是架构在具有push_front向前插入函数的序列容器&#xff08;比如deque list&#xff09;上的输出迭代器&#xff0c;可以利用*改迭代器提供的“”&#xff0c;“*”&#xff0c;“”以“*fii9;”的类似的形式完成容器元素的赋值。**其中“*”和&qu…