C语言面试题

xddzccn 2007-10-16 06:43:43
指出这段代码的它的功能与不足
#include <stdio.h>
#define MAX_NUM 100
int main(int argc,char *argv[])
{
unsigned int buf[MAX_NUM];
unsigned int i,j;
for(i=0;i<MAX_NUM;i++)
{
buf[i]=i;
}
for(i=2;i<MAX_NUM;i++)
{

if(buf[i]!=0)
{
for(j=i+i;j<MAX_NUM;j+=i)
{
buf[j]=0;
}

}

}

for(i=2;i<MAX_NUM;i++)
{
if(buf[i]!=0)
{
printf("%d\n",i);
}



}
return 0;
}
...全文
923 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenyyy 2009-12-02
  • 打赏
  • 举报
回复
for(j=i+i, k = 0;j <MAX_NUM && k <= j;j+=i, k ++)
这么改会好些
renzhewh 2009-11-30
  • 打赏
  • 举报
回复
知道效率的话,那么sqrt 呢?
计算平方根更费时
akilguo 2009-11-30
  • 打赏
  • 举报
回复
哦,我知道了,在开头加入:#include<math.h>就行了!
akilguo 2009-11-30
  • 打赏
  • 举报
回复
我把9楼第二个for语句中的MAX_NUM改成了sqrt(MAX_NUM),但是这样编译时报错了"error C2065: 'sqrt' : undeclared identifier",这是怎么回事,难道这样子不对吗?sqrt()不是个函数吗?
coolness 2009-11-28
  • 打赏
  • 举报
回复
1 #include <stdio.h>
2 #include <string.h>
3 #include <math.h>
4
5 /*
6 gcc -lm
7 */
8 #define SQRT(m) sqrt((m)+1)
9 #define LIMITED 800
10
11 int main()
12 {
13 int m,i,k,h=0,leap=1;
14
15 for( m = 1; m <= LIMITED; m++ ) {
16 k = SQRT(m);
17 for( i = 2; i <= k; i++)
18 if( m % i == 0 ) {
19 leap = 0;
20 break;
21 }
22 if( leap ) {
23 printf("%-4d", m );
24 h++;
25 if( h % 10 == 0 )
26 printf("\n");
27 }
28 leap = 1;
29 }
30 printf("\nThe total is %d\n",h);
31 return 0;
32 }
wotur 2009-11-28
  • 打赏
  • 举报
回复
大家都看出来是找素数的了?
我看这个最大的缺点就是没有写名函数的具体功能,和要实现的目标!
如果你看到一堆代码首先要去猜它是干什么的,那么肯定不会是优良的code
gx168853 2009-11-28
  • 打赏
  • 举报
回复
i <MAX_NUM这个把效率降低了很多;用MAX_NUM的开方数还好点儿
BePatient 2009-11-18
  • 打赏
  • 举报
回复
觉得第一个for循环 for(i=2;i<MAX_NUM;i++)可以改成 for(i=2;i<(MAX_NUM/2);i++)
liuchangfei 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 davelv 的回复:]
楼主发的代码有点错误,稍微修改了下
另外,效率的确不是很高,最常用的办法,就是从2除到SQRT(N)就好了
引用
[font=Fixedsys]#include <stdio.h>
#define MAX_NUM100
intmain(intargc,char*argv[])
{
       unsigned intbuf[MAX_NUM];
       unsigned inti,j;
       for(i=0;i<MAX_NUM;i++)
        {
               buf[i]=i;
        }
               for(i=2;i<MAX_NUM;i++)
        {

               if(buf[i]!=0)
                {
                       for(j=i+i;j<MAX_NUM;j+=i)
                        {
                               buf[j]=0;
                        }
 
                }

        }

       for(i=2;i<MAX_NUM;i++)
        {
               if(buf[i]!=0)
                {
                       printf("%d\n",i);
                }
        }

       return0;
}
[/font]
[/Quote]效果如何??
davelv 2007-10-24
  • 打赏
  • 举报
回复
楼主发的代码有点错误,稍微修改了下
另外,效率的确不是很高,最常用的办法,就是从2除到SQRT(N)就好了
引用
[font=Fixedsys]#include <stdio.h >
#define MAX_NUM 100
int main(int argc,char *argv[])
{
unsigned int buf[MAX_NUM];
unsigned int i,j;
for(i=0;i <MAX_NUM;i++)
{
buf[i]=i;
}
for(i=2;i <MAX_NUM;i++)
{

if(buf[i]!=0)
{
for(j=i+i;j <MAX_NUM;j+=i)
{
buf[j]=0;
}

}

}

for(i=2;i <MAX_NUM;i++)
{
if(buf[i]!=0)
{
printf("%d\n",i);
}
}

return 0;
}
[/font]
twilight041132 2007-10-23
  • 打赏
  • 举报
回复
判断素数的方法:
用一个数分别去除以2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

所以原代码应改为:
#include <stdio.h >
#include <math.h>
#define MAX_NUM 100
int main(int argc,char *argv[])
{
unsigned int buf[MAX_NUM];
unsigned int i,j,k,flag;
k=(int)sqrt(MAX_NUM);
for(i=0;i <MAX_NUM;i++)
{
buf[i]=i;
}
for(i=2;i <MAX_NUM;i++)
{
flag=1;
for(j=2;j<=k;j++)
{
if(buf[i]%j==0 && buf[i]!=j)
{
flag=0;
break;
}
}
if(flag)
{
printf("%d\n",i);
}
}
return 0;
}
cs_wgh_dn 2007-10-23
  • 打赏
  • 举报
回复
感觉上面几楼说的不太正确啊!
测试了一下,原来程序需要计算144次
5楼的方法需要计算347次!!
真正哪儿不好 还不清楚!
不知道对不?
xddzccn 2007-10-23
  • 打赏
  • 举报
回复
怎么沉下去了阿
zeloas 2007-10-23
  • 打赏
  • 举报
回复
效率太低了,5楼的是种不错的方法
IlikeEnglish 2007-10-23
  • 打赏
  • 举报
回复
不是效率不好,是完全不正确。


最好用筛法
quench 2007-10-16
  • 打赏
  • 举报
回复
找出数组中2~100之间的质数,并打印。

效率不太好,判断N是否是质数,从2开始除,除到√N就可以了。
所以
这个循环改一下

for(i=2;i <MAX_NUM;i++)
{

if(buf[i]!=0)
{
for(j=i+i;j <MAX_NUM;j+=i)
{
buf[j]=0;
}

}

} 改成
unsigned int k = (int)sqrt(MAX_NUM);
for(i=2;i < k;i++)
{

if(buf[i]!=0)
{
for(j=i+i;j <MAX_NUM;j+=i)
{
buf[j]=0;
}

}

}
quench 2007-10-16
  • 打赏
  • 举报
回复
找出数组中2~100之间的质数,并打印。

效率不太好,判断N是否是质数,从2开始除,除到√N就可以了。
所以
这个循环改一下

for(i=2;i <MAX_NUM;i++)
{

if(buf[i]!=0)
{
for(j=i+i;j <MAX_NUM;j+=i)
{
buf[j]=0;
}

}

} 改成
unsigned int k = (int)sqrt(MAX_NUM);
for(i=2;i < k;i++)
{

if(buf[i]!=0)
{
for(j=i+i;j <MAX_NUM;j+=i)
{
buf[j]=0;
}

}

}
xddzccn 2007-10-16
  • 打赏
  • 举报
回复
刚参加完 电子公司的面试
到是看出是 找素数的程序 但是不知道有什么缺点

70,023

社区成员

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

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