大家来看看2001程序员考试试题,网上提供的尽是些错误的试题与答案(100分求解)

Stefine 2005-05-12 03:38:14
首先声明:试题是下载的,我也去一些别的网站上提供的试题与答案,看了,都是一样的!小弟我不才,这试题又不太对,所以程序看也不是怎么看得懂!大侠们路过,帮忙看看,能够照题写出一个更好的算法来最好!
试题四
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序4说明]
设一个环上有编号为 0~n-1 的 n 粒不同颜色的珠子(每粒珠子颜色用字母表示, n 粒珠子颜色由输入的字符串表示)。以环上某两粒珠子间为断点,从断点一方按顺时针方向取走连续同色的珠子,又从断点另一方按逆时针方向对剩下珠子取走连续同色的珠子,两者之和为该断点可取走珠子的粒数。移动断点,能取走的珠子数不尽相同。本程序找出可以取走最多的珠子数及断点的位置。程序中用双向链表存储字符串。例如,编号为0-9的10粒珠子颜色的字符串为“aaabbbadcc",对应链表为:

若在2号与3号珠子间为断点,共可取走6粒珠子,且为取走的珠子数最多。
[程序4]
#include〈stdio.h〉
#include〈string.h〉
#include〈malloc.h〉
typedef struct node { char d ;
struct node *fpt ; /*后继指针*/
struct node*bpt ; /*前趋指针*/
}NODE ;
NODE *building( char *s ) /*生成双向循环链表*/
{ NODE *p = NULL , *q ;
while ( *s ){
q = ( NODE * ) malloc( sizeof( NODE ) ) ;
q -> ch = *s++ ;
if ( p = NULL ) p = q -> fpt = q -> b t = q ;
else {
p -> bpt -> fpt = q ;
q -> fpt = p ;
q -〉bpt = __(1)__;
__(2)__ ;
}
}
return
}
int count( NODE *start , int maxn ,int step ) /*求可取走珠子粒数*/
{ int color ,c ;
NODE *p ;
color = -1 ; C = 0 ;
for ( p = start ; c <maxn ; p = step > O ? p -> fpt ; p -> bpt ){
if ( color == -1 ) color = p -> ch ;
else if (__(3)__) break ;
c++
}
return
}
 
int find ( char *s ,int *cutpos ) /*寻找取走珠子数最多的断点和粒数*/
{ int i , c , cut , maxc = 0 ,1en = strlen(s) ;
NODE *p ;
if ( ( p = building(s) ) = NULL ){ *cu1tpos = -1 ; return -1 ; }
i = 0 ;
do { c = count( p , 1en ,1 ) ;
c = c + __(4)__ ;
if ( c > maxc ) { maxc = c ; cut = i ; }
__(5)__ ;
i++ ;
} while (i < len ) ;
* cutpos = cut ;
return maxc ;
}
 
void main()
{ int cut , max ;
char s[120] ;
scanf( , %s', s ) ;
max = find( s , &cut ) ;
printf ( "Cut position = %d , Number = %d.\n" , cut , max ) ;
}

小弟的疑问:
若在2号与3号珠子间为断点,共可取走6粒珠子,且为取走的珠子数最多。
这里不是前面两个a,右边就三个d,再加两个c,不就是7个吗?

但小弟我还是做下去,我的答案
1: p->bpt 2: q=p 3:不晓得 4 :count(p,len,0) 5: 不晓得

感觉这个题目看不太懂,那位仁兄能帮忙解释下,顺便写出程序看看

...全文
162 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Stefine 2005-05-14
  • 打赏
  • 举报
回复
非常感谢boxban(冻酸梨) 的分析

其实题目确实下载下来的时候是这样的,网上流传的也大都是这样的!



bxdx 2005-05-12
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct node {
char ch ;
struct node *fpt ; /*后继指针*/
struct node*bpt ; /*前趋指针*/
}NODE ;


NODE *building( char *s ) /*生成双向循环链表*/
{
NODE *p = NULL , *q ;
while ( *s ){
q = ( NODE * ) malloc( sizeof( NODE ) ) ;
q -> ch = *s++ ;
if ( p == NULL ) p = q -> fpt = q -> bpt = q ;
else {
p -> bpt -> fpt = q ;
q -> fpt = p ;
q ->bpt = p->bpt;
p->bpt=q ;
}
}
return p;
}
int count( NODE *start , int maxn ,int step ) /*求可取走珠子粒数*/
{ int color ,c ;
NODE *p ;
color = -1 ;
c = 0 ;
for ( p = start ; c <maxn ; p = (step > 0 ? p -> fpt : p -> bpt) ){
if ( color == -1 ) color = p -> ch ;
else if (color!=p->ch)
break ;
c++;
}
return c;
}

int find ( char *s ,int *cutpos ) /*寻找取走珠子数最多的断点和粒数*/
{
int i , c , cut , maxc = 0 ;
int len = strlen(s) ;
NODE *p ;
if ( ( p = building(s) ) == NULL ){
*cutpos = -1 ;
return -1 ;
}


i = 0 ;
do { c = count( p , len ,1 ) ;
c = c + count(p->bpt,len-c,-1) ;
if ( c > maxc ){
maxc = c ;
cut = i ;
}
p=p->fpt ;
i++ ;
} while (i < len ) ;
* cutpos = cut ;
return maxc ;
}

void main()
{ int cut , max ;
char s[120] ;
scanf("%s",s) ;
max = find( s , &cut ) ;
printf ( "Cut position = %d , Number = %d.\n" , cut , max ) ;
}


源程序真恶心,故意改错了一些,len 为 1en(第一个字符是一),‘:’改为‘;’等



我也是那一年考的,当时好像填错了一两个
boxban 2005-05-12
  • 打赏
  • 举报
回复
to yangyouyi(yangyouyi):
这个题目没有问题(当然,搂主拷贝来的程序有些地方又问题,比如if语句中的=/==问题。)
----------------------------------------------------------------------------------
//你拷贝的代码错误百出,还夹杂着一些中文字符 :(
//
//我调试了一阵才搞定 :D
//
//=======================================================

/*
试题四
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序4说明]
设一个环上有编号为 0~n-1 的 n 粒不同颜色的珠子(每粒珠子颜色用字母表示, n 粒珠子颜色由输入的字符串表示)。以环上某两粒珠子间为断点,从断点一方按顺时针方向取走连续同色的珠子,又从断点另一方按逆时针方向对剩下珠子取走连续同色的珠子,两者之和为该断点可取走珠子的粒数。移动断点,能取走的珠子数不尽相同。本程序找出可以取走最多的珠子数及断点的位置。程序中用双向链表存储字符串。例如,编号为0-9的10粒珠子颜色的字符串为“aaabbbadcc",对应链表为:

若在2号与3号珠子间为断点,共可取走6粒珠子,且为取走的珠子数最多。

*/


#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef struct node { char ch ;
struct node *fpt ; /*后继指针*/
struct node*bpt ; /*前趋指针*/
}NODE ;

NODE *building( char *s ) /*生成双向循环链表*/
{ NODE *p = NULL , *q ;
while ( *s ){
q = ( NODE * ) malloc( sizeof( NODE ) ) ;
q -> ch = *s++ ;
if ( p == NULL ) p = q -> fpt = q ->bpt = q ;
else {
p -> bpt -> fpt = q ;
q -> fpt = p ;
q -> bpt = p->bpt;//q -> bpt = __(1)__;
p->bpt = q; // __(2)__ ;
}
}
return p;
}
/*
p 指向第一个节点(即插入的第一个节点)。
假设已有3个节点:
A-->B-->C
则有:
p == A;
C->fpt == A;
A->bpt == C;
现在尾部添加一新节点D(程序中为q):
A-->B-->C-->D
则有:
p == A;
C->fpt == D; // p->pbt->fpt = q;
D->fpt == A == p; // q->fpt = p;
D->bpt == C // q->bpt = p->bpt; (1)(注意插入前的情形)
A->bpt == D; // p->bpt = q; (2)
*/


int count( NODE *start , int maxn ,int step ) /*求可取走珠子粒数*/
{ int color , c ;
NODE *p ;
color = -1 ; c = 0 ;
for ( p = start ; c <maxn ; p = (step > 0 ? p -> fpt : p -> bpt)){
if ( color == -1 ) color = p -> ch ;
else if (color != p->ch) break; //else if (__(3)__) break ;
c++;
}
return c;
}
/*
(3) 处判断珠子的颜色是否发生了变化,如果与前一个不同,则退出循环,计数结束。
*/


int find ( char *s ,int *cutpos ) /*寻找取走珠子数最多的断点和粒数*/
{ int i , c , cut , maxc = 0 ,len = strlen(s) ;
NODE *p ;
if ( ( p = building(s) ) == NULL ){ *cutpos = -1 ; return -1 ; }
i = 0 ;
do { c = count( p , len ,1 ) ;
c = c + count(p->bpt, len - c, -1); // c = c + __(4)__ ;
if ( c > maxc ) { maxc = c ; cut = i ; }
p = p->fpt; //__(5)__ ;
i++ ;
} while (i < len ) ;
* cutpos = cut ;
return maxc ;
}
/*
(4) 处的填写要结合函数count()的阅读理解。
前面一条语句向前计算同色珠子个数:c = count( p , len ,1 ) ;
那么下语句明显应该是后向计算同色珠子个数,因此此处应该是填写count函数。

注意到count()中for循环语句:
for ( p = start ; c <maxn ; p = (step > 0 ? p -> fpt : p -> bpt)){
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
结合题目要求,可以看出,step是一个“往前数”/“往后数”的标志。当step > 0 时向前数,否则向后数。所以答案(4)中step参数可以是任意“不大于0的数”,个人觉得“-1”对应用“1”是一个十分合适的选择。
这个问题清楚了,那么count()的第一个参数也就很清楚了(注意不要重复计算当前节点,因此要取其前趋)。
至于第2个参数,考虑到这是一个双向循环链表,则必须要从总串中减掉已经计算过的部分,否则当用户只输入一种颜色的珠子时,得到的计数结果将是实际的2倍。

(5)处的填写就十分直截了当了:该程序采用从头到尾遍历整个链表的方式得到最大可能值,因此只要移动指针就可以了。
*/

void main()
{ int cut , max ;
char s[120] ;
scanf("%s", s ) ;
max = find( s , &cut ) ;
printf ( "Cut position = %d , Number = %d.\n" , cut , max ) ;
}



walkany 2005-05-12
  • 打赏
  • 举报
回复
(1) p; (2) p=q;(3);
这个题目和他自己的计算过程是不相符的。明显的逻辑错误。因为题目说先从一个方向把颜色相同的珠子计算个数;然后去走这个方向上已经计算过个数的竹子。然后从另外一个方向相同的方法计算。
首先计算的过程中没有拿走珠子的过程。其次,根本就没有从另外一个方向上去操作。
取走合不去走计算过的竹子结果可能不一样的。所以题目本身是完全错误的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧