CSDN博客

img leebons

一道面试题

发表于2004/10/30 21:46:00  702人阅读

分类: 编程语言

有数组a[0...n-1],其内容是无序的,另一数组b[0...m],其中n>m,现要求不准用其它数组,不准改变a[0...n]的内容,把a数组内最小的数放到b[0]中,把第二小的数放到b[1],依此类推

这是东莞东越饰的面试题目,我用了一个小时都没做出来,希望各位高手指点一二

foreach(int i in a)//对a中的每一个值
{
  for(int j=0;j<b.length;j++)
  {
    if(i>=b[j]&&i<b[j+1])
    {
      insert(b,j+1,i);//向b中j+1位置插入i,这个函数可以自己写
    }
  }
}

public void insert(int[]b,int index,int value)
{
  for(int i=b.length-1;i>=index;i--)
  {
    b[i]=b[i-1];//插入后向后移一位
  }
  b[index]=value;
}

一个面试题 求 n! (n的阶层)需要考虑溢出。
大家一起来写写程序

/*

    本程序对给定的n(n<=100),计算出输出k!(k=1,2,...,n)的全部有效数字,因k!的值可能很大,故采用一维数组存储计算结果。设数组的每个元素存储k!的一位数字,并约定从低位到高位依次存于数组的第一个位置,第二个位置···。
程序中,计算k!采用对已求得的(k-1)!的结果连续加k-1次后求出,例如,4!=24,则计算5!对原来的24累加4次后得到120。为了控制累加的位数,另引入整型变量c用于记录当前(k-1)!的位数。

*/
#include <stdio.h>

#define MAXN 1000

int a[MAXN], b[MAXN];

void pnext(int k, int *cp)
{
 int c = *cp, i, m, r;
 for (i = 0; i < c; i++)
  b[i] = a[i];
 a[c] = 0;
 for (m = 1; m < k; m++)
  for (i = 0; i < c; i++) {
   r = a[i] + b[i];
   a[i] = r % 10;
   a[i + 1] += r / 10;
  }
 r = a[c];
 while (r > 0) {
  a[c++] = r % 10;
  r = r / 10;
 }
 *cp = c;
}

void write(int *a, int k, int c)
{
 int i;
 printf("%4d! = ", k);
 for (i = c - 1; i >= 0; i--)
  printf("%d", a[i]);
 printf("/n/n");
}

main()
{
 int n, c, k;
 printf("Enter the number n(<=100):");
 scanf("%d", &n);
 a[0] = 1;
 c = 1;
 write(a, 1, c);
 for (k = 2; k <= n; k++) {
  pnext(k, &c);
  write(a, k, c);
  getchar();
 }
}

阅读全文
0 0

相关文章推荐

img
取 消
img