cainiao 发表于 2006-4-6 04:44

C或C++的一些题目,多多思考

<P>这些题目是我从一个论坛上的{每日一题}的版快里找来的</P>
<P></P>
<P><STRONG>1 google 的 top coder 的 850 分例题</STRONG></P>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">假设有这样一种字符串,它们的长度不大于 26 ,而且若一个这样的字符串其长度为 m ,则这个字符串必定由 a, b, c ... z 中的前 m 个字母构成,同时我们保证每个字母出现且仅出现一次。比方说某个字符串长度为 5 ,那么它一定是由 a, b, c, d, e 这 5 个字母构成,不会多一个也不会少一个。嗯嗯,这样一来,一旦长度确定,这个字符串中有哪些字母也就确定了,唯一的区别就是这些字母的前后顺序而已。 <BR><BR>现在我们用一个由大写字母 A 和 B 构成的序列来描述这类字符串里各个字母的前后顺序: <BR><BR>如果字母 b 在字母 a 的后面,那么序列的第一个字母就是 A (After),否则序列的第一个字母就是 B (Before); <BR>如果字母 c 在字母 b 的后面,那么序列的第二个字母就是 A ,否则就是 B; <BR>如果字母 d 在字母 c 的后面,那么 …… 不用多说了吧?直到这个字符串的结束。 <BR><BR>这规则甚是简单,不过有个问题就是同一个 AB 序列,可能有多个字符串都与之相符,比方说序列“ABA”,就有“acdb”、“cadb”等等好几种可能性。说的专业一点,这一个序列实际上对应了一个字符串集合。那么现在问题来了:给你一个这样的 AB 序列,问你究竟有多少个不同的字符串能够与之相符?或者说这个序列对应的字符串集合有多大?注意,只要求个数,不要求枚举所有的字符串。</DIV>
<P></P>
<P>2 <STRONG>为什么要定义:char (*p),而不是定义:char (*p)</STRONG></P>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>#include<iostream></P>
<P>using namespace std;</P>
<P>void main()</P>
<P>{</P>
<P>char (*p);</P>
<P>char a={"hello","iam","David"};</P>
<P>for(int i=0;i<3;i++)</P>
<P>{</P>
<P>p=a;</P>
<P>cout<<p<<" ";</P>
<P>cout<<endl;</P>
<P>}</P>
<P>}</P>
<P>为什么要定义:char (*p),而不是定义:char (*p)<BR></P></DIV>

cainiao 发表于 2006-4-6 04:45

<STRONG>3 求X的Y次方的最后三位数</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">求X的Y次方的最后三位数(10 < x, y < 1000)<BR>如13的13次方的最后三位数为253 <BR>如15的20次方的最后三位数为625 <BR>如67的210次方的最后三位数为449<BR><BR>int LastThree(int x, int y);<BR>输入参数x,y, 返回X的Y次方的最后三位数。<BR>保证输入的数字有效。<BR></DIV><STRONG>4 一首唐诗的编程题</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>#include<ostream><BR>using namespace std;</P>
<P><BR>int main()<BR>{<BR>cout<<"白日依山尽,\n";<BR>return 0;<BR>}</P>
<P>要求:1、输出"白日依山尽<BR> 黄河入海流<BR>欲穷千里目<BR> 更上一层楼"</P>
<P>2、不能改动main()函数<BR></P></DIV>

cainiao 发表于 2006-4-6 04:46

<STRONG>5 现有3*3的九个方格</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">现有3×3的九个方格,空出中心的方格,将数字1-8随机的放入到其它的8个方格中,数字1不动,其它的数字可以移动,<BR> 最终,使所有数字按1-8的顺序顺时针排列外围方格中。移动的规则是:都可以移向横排或竖排相临空着的方格,而且,都可以移向中心空着的方格。<BR> 要求计算出移动移动最少的次数。<BR><BR>函数接口: int minMove(int a[]);<BR>其中 a[] 表示从左上角顺时针放入的8个数。<BR></DIV><STRONG>6 编一个能处理简单四则运算的函数。</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">编一个能处理简单四则运算的函数。为了简单起见,参与运算的数都为int,且只需考虑加法,减法和乘法,不考虑除法,但要考虑括号。<BR>函数接口:<BR> int expr(char a[]);<BR>说明:<BR>数组a[]中保存需要计算的数学表达式,其长度l <= 30。比如<BR>chara[] =“3*(5-4)”;<BR>表达式不会为空,且保证有意义,里面只有阿拉伯数字0~9,+,-,*,(,),以’\0’结尾,没有空格,括号只有’(‘与’)’,可以嵌套,但肯定成对出现;测试环境为32位平台(若参赛者使用16位编译器,我会用32位编译器重新编译),保证运算过程和结果不会产生溢出;函数返回值为最终计算结果。<BR></DIV>

cainiao 发表于 2006-4-6 04:47

<STRONG>7 拼音输入法</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';"><BR>在PC上模拟实现一个类似手机上的拼音输入法,要求可以显示大部分常用汉字。输入输出为标准输入输出。具体要求如下。 <BR><BR>输入: <BR>0-9的数字键,以及上下左右4个键。左作为确定键,右作为取消键。英文字母在数字键上的布局如下: <BR>0 (标点符号) <BR>1 (空格) <BR>2 abc <BR>3 def <BR>4 ghi <BR>5 jkl <BR>6 mno <BR>7 pqrs <BR>8 tuv <BR>9 wxyz <BR><BR>例:如果要输入“文”,就按9、3、6,程序应该显示所有可能的拼音组合,在这里是wen、zen。如果这时候按键盘上的左箭头键,就表示确定,显示部分拼音为"wen"的汉字,如文、问、闻、温、稳等。再次按左就将“文“显示出来了。具体的输出格式看输出部分。 <BR><BR>标点符号必须包括以下几个: <BR>,。、:;?! <BR>其它的也可以自己定义。 <BR><BR>例:按0再按左显示”,” <BR>按00左显示“。” <BR>以此类推。 <BR><BR>按1左显示空格。比如按了以下键: <BR>0左1左00左 <BR>那么显示的效果是 <BR>, 、 <BR><BR>右箭头为取消键,消去当前层次的上一个输入。如“936右"等效于"93","936左右”等效于“936”,“936左左右”相当于什么都没输入。 <BR><BR>除以上按键外,另外有两个键a、b也可以自定义它们的用法。<BR><BR>输出: <BR>标准输出。模拟手机显示屏。每次按键后输出4行,每行可显示13个汉字。具体显示格式可自行设计。 <BR>注意要求每按一个键就重新输出4行,不管那个按键是否会引起显示变化。 <BR><BR></DIV>
<P></P>
<P><STRONG>8 北京某所高校的一道C++期末考试题</STRONG></P>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>#include <iostream.h></P>
<P>#include <math.h></P>
<P>class Power</P>
<P>{</P>
<P>public:</P>
<P>Power(int i){x=i;}</P>
<P>_______________________</P>
<P>protected:</P>
<P> int x;</P>
<P> };</P>
<P>class Squqre:public Power</P>
<P>{</P>
<P>public:</P>
<P>__________________________;</P>
<P>void display()</P>
<P>{cout<<”x=”<<x<<endl;cout<<x square=”<<x*x<<endl;}</P>
<P>};</P>
<P>class Cube:public Power</P>
<P>{________________________</P>
<P>};</P>
<P>void fun(__________) </P>
<P>{p.display();</P>
<P>}</P>
<P>void main()</P>
<P>{Square squ(2);</P>
<P>Cube cub(3);</P>
<P>fun(squ);</P>
<P>fun(cub);</P>
<P>}</P></DIV>

cainiao 发表于 2006-4-6 04:49

<STRONG>9. 100囚犯问题</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">有100个无期徒刑囚徒,被关在100个独立的小房间,互相无法通信。每天会有一个囚徒被随机地抽出来放风,随机就是说可能被抽到多次。放风的地方有一盏灯,囚徒可以打开或者关上,除囚徒外,没有别人会去动这个灯。每个人除非出来防风,是看不到这个灯的。 一天,全体囚徒大会,国王大赦,给大家一个机会:如果某一天,某个囚徒能够明确表示,所有的囚徒都已经被放过风了,而且的确如此,那么所有囚徒释放;如果仍有囚徒未被放过风,那么所有的囚徒一起处死! 囚徒大会后给大家20分钟时间讨论,囚徒们能找到方法么?</DIV><STRONG>10 约瑟夫问题</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>有n个人围成一圈,1到3开始转圈报名,喊道3的同学出列,问最后剩下原来的几号</P></DIV>

cainiao 发表于 2006-4-6 04:49

<STRONG>11 分数变小数</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">写出一个程序,将一个以N/D的形式的分数转换为它的小数形式,其中N为分子,D为分母。如果它的小数形式存在循环节,要将其用括号括起来。例如:1/3=.33333……表示为.(3)。又如41/333=.123123123…表示为.(123)。<BR>一些转化的例子;<BR>1/3=.(3)<BR>22/4=4.4<BR>1/7=.(142857)<BR>3/8=.375<BR>不限位数,越精确越好。<测试数据结果小数点后不超过1024位><BR></DIV><STRONG>12 排列自然数</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';"><BR>将l、2、3、4、5、6、……N,这N个连续的自然数排成一圈,使每两个相邻数之和都为素数。那么这N最大为多少?编程输出N的值,输出这N个数的排列。<BR>函数接口: char *prime(int &n)<BR>说明: 1、n返回为满足条件最大的自然数,<BR>2、函数返回这n个数的排列,<BR>3、字符串排列1在最前,每两个数用一个空格分割开,例如:1 2 5 8 9。</DIV>

cainiao 发表于 2006-4-6 04:50

<STRONG>13 单链表反序</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>将一个单链表反序,只有一个链表头节点head,还有两个指向节点元素类型的指针p和q,不许申请新的节点及指针变量什么的.用c或c++实现算法.<BR></P></DIV><STRONG>14 从10亿个数中选出最大的一万个。</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>从10亿个数中选出最大的一万个。</P>
<P>求时间和空间复杂度上最优的算法</P></DIV>

cainiao 发表于 2006-4-6 04:51

<STRONG>15 如何定义和实现一个类的成员函数为回调函数?</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">就是这个简单的问题啦</DIV><STRONG>16 把10个苹果分成三堆,每堆至少1个,应有多少种分法。</STRONG>

cainiao 发表于 2006-4-6 04:52

<STRONG>17 蛇形矩阵</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';"><FONT color=#0000bb>本程序将自然数 1,2,……,N2 按蛇形方式逐个顺序存入 N 阶矩阵。 例如,当 N </FONT><FONT color=#007700>= </FONT><FONT color=#0000bb>3 和 4 时分别如图 3.1 和图 3.2。 <BR><BR>                       7  13  14  16<BR><BR>              6  7  9     6  8  12  15<BR><BR>              2  5  8     2  5  9  11<BR><BR>              1  3  4     1  3  4  10<BR><BR>               图3.1       图3.2<BR><BR>从 an0 开始到 a0n 为止(n </FONT><FONT color=#007700>= </FONT><FONT color=#0000bb>N</FONT><FONT color=#007700>-</FONT><FONT color=#0000bb>1)顺序填入自然数,交替地对每一斜列从左上元素向右下元素或从右下元素向左上元素存数。<BR></FONT></DIV><STRONG>18 海盗问题</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">问题描述:<BR>5个海盗抢到了100颗宝石,每一颗都一样大小且价值连城。他们决定这么分:  <BR>1抽签决定自己的号码(1~5);  <BR>2首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按<BR>照他的方案进行分配,否则将被扔进大海喂鲨鱼;  <BR>3如果1号死后,再由2号提出分配方案,然后剩下的4个人进行表决,当且仅当超<BR>过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼;  <BR>5依此类推……  <BR>条件:每个海盗都是很聪明的人,都能很理智地做出判断,从而做出选择。<BR>  问题:第一个海盗提出怎样的分配方案才能使自己的收益最大化?<BR><BR>解题思路:<BR>每个海盗都会想到把前面的人杀死,以便自已获得最大利益,所以他们心里都先有<BR>一个假设轮到自已分配时的最优方案。而总是前者的方案要优于所有后者的方案就<BR>能获得通过,所以这里出现递归关糸式:第一个方案要优于第二个,第二个要优于第<BR>三,第三... ; 那么第一个就要知第二个方案,第二个就要知第三个方案,第三<BR>个。。。;只到最后一个。注意一个特殊情况:假如有人的方案不管怎样都逃不过<BR>被杀,那么他肯定会把投给前一位,以保证自已的存活。<BR></DIV>

cainiao 发表于 2006-4-6 04:53

<STRONG>19 微软的一道面试题</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>一个给定的数值由左边开始升位到右边第N位,如 <BR>0010<<1 == 0100 <BR>或者 <BR>0001 0011<<4 == 0011 0000 <BR>请用C或者C++或者其他X86上能运行的程序实现。</P></DIV><STRONG>20 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" twffan="done" onload="this.style.overflowX='auto';">
<P>编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数   1/1+1/3+...+1/n(利用指针函数)<BR></P></DIV>
页: [1] 2
查看完整版本: C或C++的一些题目,多多思考