首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一道面试题(小弟我自己写的代码运行的时候出错,高手帮小弟我指出异常.)

2012-03-03 
一道面试题(我自己写的代码运行的时候出错,高手帮我指出错误...)15个人围成一圈,报数1,2,3.当报数为3的人

一道面试题(我自己写的代码运行的时候出错,高手帮我指出错误...)
15个人围成一圈,报数1,2,3.
当报数为3的人退出.
求最后一个人.
我的思路:
用字符串 "abcdefghijklmno "表示15个人
当报数为3的时候就将他从字符串中删除.
比如第一个报3的为c,他报数后字符串就变为 "abcdefghijklmno ".
我的程序在将字符c   从字符串里面删除的时候就出错.
高手帮我看看....


#include   "stdafx.h "
#include   <stdlib.h>
#include <ctime>  
#include   <string.h>
void   findclose(char   *str,int   n)//循环报数1,2,3,4,..N   报数为N的退出
{
int   count   =   0;
char   *   pstr   =   str;
char   *beforestr;
char   *afterstr;
while   (strlen(str)> 1)   {

count++;
beforestr   =   pstr;//指向当前报数的人
afterstr   =   pstr;
afterstr++;//指向当前报数的下一个人
if   (count%n==0)   {
//memmove(beforestr,afterstr,strlen(afterstr));
                                      //         用memmove   也会报错
while(*afterstr!= '\0 '){
*beforestr++=   *afterstr++;
                                                                            //   就是这一句的时候出错
}
}
if   (*pstr== '\0 ')
pstr   =   str;
pstr++;
}
printf(str);
}


int   main(int   argc,   char*   argv[])
{
char   *   str   = "abcdef ";
int   n=3;
findclose(str,n);
return   0;
}

[解决办法]
那里报错是因为你这里定义char * str = "abcdef "; 常量指针str所指的内容 "abcdef "是只读不能修改的。。。

char str[] = "abcdef "; 这样定义好了。。
[解决办法]
你的太复杂了,给你一个简单的答案:vc6.0运行
#define N 15
#define M 3
#include "stdio.h "
main()
{

int k=0,i,j;
char t;
char a[N];
printf( "\n the original orders are :\n ");
for( t= 'a ',i=0;i <N;i++,t++)
{
a[i]=t;
printf( "%3c ",a[i]);
}
printf( "\n ");
for(i=0;k <N*M;i++)
{
if(a[i%N]!= '$ ')
{
k++;
if(k%3==0)
{
printf( "\n%3c is out! ",a[i%N]);
a[i%N]= '$ ';

if(k!=N*3)
printf( "the new order is : ");
else
printf( "the game is over ");
for(j=0;j <N;j++)
{
if(a[j]!= '$ ')
printf( "%3c ",a[j]);
}
}
}
}
return 0;
}
[解决办法]
改了一下
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void findclose(char *str,int n)
{
int count = 0;
char * pstr = str;
char *beforestr;
char *afterstr;
int i = 0;
while (strlen(str)> 1)
{
count++;
beforestr = pstr;
afterstr = pstr;
afterstr++;
if (count%n==0)
{
i = strlen(afterstr);
memmove(beforestr,afterstr,strlen(afterstr));


memset(beforestr+i, 0, 1);
if (*pstr== '\0 ' )
pstr = str;
continue;
}
if (*pstr== '\0 ' || *afterstr == '\0 ')
{
pstr = str;
continue;
}
pstr++;
}
printf(str);
}


int main(int argc, char* argv[])
{
char str[] = "abcdefgh ";
int n=3;
findclose(str,n);
return 0;
}

[解决办法]
下面是我自认为比较好的算法,用链表来实现的
#include <stdio.h>
#define N 15
struct person
{
int number;
int nextp;
}link[N+1];

void main()
{
int i,count,h;
for (i=1;i <=N;i++)
{if (i==N)
link[i].nextp=1;
else
link[i].nextp=i+1;
link[i].number=i;}
printf( "\n ")
count=0;
h=N;
printf( "sequence that persons leave the circle:\n ");
while(count <N-1)
{i=0;
while(i!=3)
{h=link[h].nextp;
if (link[h].number)
i++;
}
printf( "%4d ",link[h].number);
link[h].number=0;
count++;
}
printf( "\nThe last one is ");
for (i=1;i <N;i++)
if (link[i].number)
printf( "%3d ",link[i}.number);
printf( "\n ");
}

热点排行