Arrays 在C中使用数组表示法或指针算法获取数组的最后五个值

Arrays 在C中使用数组表示法或指针算法获取数组的最后五个值,arrays,c,pointers,Arrays,C,Pointers,我很难找到正确的数组表示法 编程以返回数组素数的最后五个值 换句话说,我需要数组中最高的五个值,因为它被设置为按从1到1000的升序计算素数 最初,这个问题询问数组的正确指针表示法 #include <stdio.h> #define ARRAY_SIZE 1000 int is_prime(int n); int maximum(int array[], int i); int main(){ int n; int prime[ARRAY_SIZE]; int

我很难找到正确的数组表示法 编程以返回数组素数的最后五个值

换句话说,我需要数组中最高的五个值,因为它被设置为按从1到1000的升序计算素数

最初,这个问题询问数组的正确指针表示法

#include <stdio.h>

#define ARRAY_SIZE 1000

int is_prime(int n);
int maximum(int array[], int i);


int main(){
  int n;
  int prime[ARRAY_SIZE];
  int k=0;
  for(n = 0; k < ARRAY_SIZE; ++n){
    if(is_prime(n)){
      prime[k] = n;
      printf("%d\n", prime[k]);
      k++;
    }
  }
  maximum(prime, k);

}

int maximum(int array[], int k){
  int i;
  int max = array[0];
  second_largest;
  for(i = 1; i < k; i++)
    if(array[i] > max)
      max = array[i];
  second_largest = array[k-2];
  printf("largest element = %d\n", max);
  printf("second largest element = %d", array[k-2];
}


int is_prime(int n)
{
  for (int d = 2; d < n; ++d)
    if(n%d == 0)
      return 0;
  return 1;
}
任何帮助都将不胜感激。

我应该使用[…]吗?–是的,除此之外,你应该减去5,而不是1,以得到最后五个元素

请注意,此sizeof技巧仅在阵列作为原始阵列可用时有效;一旦衰减到指针e。G当传递给函数时,需要单独提供大小。G作为附加参数传递;但是你得到的值也完全一样

完整表达式如下所示:

int* lastFive = a + sizeof(a)/sizeof(*a) - 5;
通过将as操作数用作+它已经衰减为指针;或者,如果你更喜欢,你可以写信

int* lastFive = &a[sizeof(a)/sizeof(*a) -5];
旁注1:在我首选的短于类型的替代变量中,当将解引用运算符*应用于a时,数组再次自动衰减为指针–正如应用索引运算符[]时实际发生的一样,其中a[i]实际上只是*a+i的语法糖–这解释了为什么5[a]看起来很奇怪,不是吗?实际上是有效的C,意思完全相同

旁注2:从头开始一次又一次地计算素数是非常低效的。首先:只要k*k小于n,就只需要迭代!如果任何大于n的平方根的k除以,那么必须有另一个小于的因子,这是您之前已经发现的

然后你可以从你之前的素数已经可用的事实中获益;您可以重新使用数组来计算新的素数。计算结果可能是这样的

for(k = 0; primes[k]*primes[k] < n; ++k)
{
    if(n % primes[k] == 0)
    {
        return 0;
    }
}
return 1;

请注意,is_prime将为0和1返回1,两者都不被视为prime。此外,main中的循环设置prime[k],但在该循环中k是常数0。所以它所做的就是将prime[0]设置为它找到的最后一个prime。然后,当它调用maximum时,它通过0表示k。那似乎不是你想要的。您可能希望每次存储新值时都增加k。您的主例程从不增加k,因此它从不写入prime[0]以外的prime元素。如果试图从中返回1、2、3或4个元素,则将访问超出边界的数组。它可以生成您报告的“看似随机的整数”,而C标准没有定义这种行为。因此,您可能得出了错误的结论“看似随机的整数”不是由于错误地计算所需元素的位置造成的,而是由于您的代码从未写入足够的元素以返回。此外,循环一直运行到nint k = 0; for(int n = 0; n < ARRAY_SIZE; ++n) { if(is_prime(n) prime[k++] = n; } int* lastFive = prime + k - 5;
#include <stdio.h>

#define ARRAY_SIZE 100

int is_prime(int n);
int maximum(int array[], int i);


int main(){
  int n;
  int prime[ARRAY_SIZE];
  int k = 0;
  for(n = 0; n < ARRAY_SIZE; ++n){
    if(is_prime(n)){
      prime[k] = n;
      printf("%d\n", prime[k]);
      k++;
    }
  }
  maximum(prime, k);
}

int maximum(int array[], int k){
  int i;
  int max = array[0];
  int second_largest;
  int third_largest;
  int fourth_largest;
  int fifth_largest;
  for(i = 1; i < k; i++)
    if(array[i] > max)
      max = array[i];
  second_largest = array[k-2];
  third_largest = array[k-3];
  fourth_largest = array[k-4];
  fifth_largest = array[k-5];
  printf("largest element = %d\n", max);
  printf("second largest element = %d\n", second_largest);
  printf("third largest element  = %d\n", third_largest);
  printf("fourth largest element = %d\n", fourth_largest);
  printf("fifth largest element = %d\n", fifth_largest);
}


int is_prime(int n)
{
  for (int d = 2; d < n; ++d)
    if(n%d == 0)
      return 0;
  return 1;
}