免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1568 | 回复: 9
打印 上一主题 下一主题

一道面试题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-22 22:26 |只看该作者 |倒序浏览
:将一个数组中的所有素数移到数组的前面,而非素数移到后面,要求数据的位置不改变。多谢解答!

论坛徽章:
0
2 [报告]
发表于 2006-08-22 22:31 |只看该作者
原帖由 tail_2003 于 2006-8-22 22:26 发表
要求数据的位置不改变

什么意思

论坛徽章:
0
3 [报告]
发表于 2006-08-22 23:23 |只看该作者
不知道要不要很高效的算法!
正在思考!
写了个垃圾的代码?
不知道能不能满足要求?
#include"stdio.h"
#include"math.h"
int isp(int x);
main()
{
int i;

int j=0;

int k=0;

int iData[10]={56,45,79,46,23,19,86,59,96,35};

int iData1[10];
for(i=0; i<10; i++)
{

   if(isp(iData[i]))
   {
  
   iData[j++]=iData[i];
  
   }
   else
   {
   
   iData1[k++]=iData[i];
  
   }

}

  k=0;

  for(i=j; i<10; i++)
  {

  iData[j++]=iData1[k++]   ;

  }

  for(i=0; i<10; i++)
  {

  printf("%d\n",iData[i]);

  }









}
再想想有什么高效一点的算法!

论坛徽章:
0
4 [报告]
发表于 2006-08-23 00:06 |只看该作者
又想了一个看看这个怎么样?



  1. #include"stdio.h"
  2. #include"math.h"
  3. int isp(int x);
  4. main()
  5. {
  6.   int i;

  7.   int j=0;

  8.   int k=0;

  9.   int t;

  10.   int iData[10]={56,45,79,46,23,19,86,59,96,35};

  11.   int iData1[10];
  12.   for(i=0;i<10;i++)
  13.   {
  14.      if(isp(iData[i])==1)
  15.     {

  16.        for(k=i; k>j;k--)
  17.      {
  18.    
  19.        t=iData[k];

  20.        iData[k]=iData[k-1];

  21.        iData[k-1]=t;
  22.   
  23.      }
  24.   
  25.       j++;
  26.     }


  27. }

  28. for(i=0; i<10; i++)
  29. {

  30.   printf("%d\n",iData[i]);

  31. }

  32. }

  33. int isp(int x)
  34. {  int i;

  35.    if(x==0||x==1)return 0;

  36.    if(x==2)return 1;


  37.    for(i=2;i<=sqrt(x);i++)
  38.    if((x%i)==0)return 0;

  39.          
  40.    return 1;

  41. }









复制代码

[ 本帖最后由 foolfoolbird 于 2006-8-23 00:07 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-08-23 07:43 |只看该作者
多谢foolfoolbird 的回答

论坛徽章:
0
6 [报告]
发表于 2006-08-23 11:18 |只看该作者
从数组头到尾次检查每各数是否为素数,如果是,将数组前面的第一个非素数到该数的部分循环右移。

void main() {
int *Head = &iData[0];
int *End = &iData[9];
int *ptr_prm = Head;
int *ptr_data = Head;

for(;ptr_data <= End; ptr_data++)
{
    if(is_prm(*ptr_data)) {
        cycle_shift_right(&ptr_prm[1], ptr_data);
        ptr_prm++;
    }     
}

return; //finish

}

void cycle_shift_right(int *head, int *end)
{
    int temp = end[0];
    int *ptr = end;
    for(;ptr>head;ptr--){
        ptr[0] = ptr[-1];
    }
    head[0] = temp;   
}

[ 本帖最后由 yunongfang1981 于 2006-8-23 11:24 编辑 ]
tan1 该用户已被删除
7 [报告]
发表于 2006-08-23 14:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2006-08-23 15:17 |只看该作者
呵呵!
都用的是轮换着把素数往前面移还有没有其他的好方法阿?

论坛徽章:
0
9 [报告]
发表于 2006-08-23 15:32 |只看该作者
在 使用 另外两个数组,一个存放素数,一个放非素数,
最好把这两个数据合并。

论坛徽章:
0
10 [报告]
发表于 2006-08-23 17:04 |只看该作者
#include <stdio.h>
#include <math.h>
int isp(int x);
void check(int y);
int i,j;
int a[10]={1,2,3,4,5,6,7,8,9,10};

main()
{
i=0;
while(i<10)
{
check(i);
printf("%d\n",a[i]);
i++;
}
}


int isp(int x)
{  int i;

   if(x==0||x==1)return 0;

   if(x==2)return 1;


   for(i=2;i<=sqrt(x);i++)
   if((x%i)==0)return 0;

         
   return 1;
}

void check(int x)
{
int temp;
if (x<10)
{
if(isp(a[x])==1)
check(x+1);
else
{
temp=a[x];
for(j=x;j>i;j--)
a[j]=a[j-1];
a[i]=temp;

}
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP