使用指针算法打印质数

Print prime numbers using pointer arithmetic

我的函数 writePrime 必须使用指针算法写入数组中的所有素数。除了 mainwritePrime.

我不能使用任何其他函数
#include <stdio.h>
void writePrime(int arr[], int n) {
  int *q = arr, *qq = arr, i, prime;
  while (q < arr + n) {
    while (qq < arr + n) {
      i = 1;
      if (*qq % i != 0)
        continue;
      else
        prime = 1;
      i++;
      qq++;
    }
    if (prime == 1)
      printf("%d ", *q);
    q++;
  }
}
int main() {
  int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 92, 93, 94, 95, 96};
  int n = sizeof(arr) / sizeof(*arr);
  writePrime(arr, n);
  return 0;
}

此代码仅打印相同的未更改数组。我该如何修改它才能工作?

变量 n 应声明为类型 size_t

size_t n = sizeof(arr) / sizeof(*arr);

因为它是带有 sizeof 运算符的表达式类型。

所以函数应该这样声明

void writePrime( const int arr[], size_t n );

在函数中使用带有两个指针的两个循环没有任何意义。

每个变量都可以被1整除。所以这个代码片段

  i = 1;
  if (*qq % i != 0)
    continue;
  else
    prime = 1;

也没有任何意义。

并且您正在使用最初未初始化的变量 prime,必须在处理数组的每个元素之前重置它。

函数可以这样定义

void writePrime( const int arr[], size_t n )
{
    for ( const int *p = arr; p != arr + n; ++p )
    {
        int prime = *p % 2 == 0 ? *p == 2 : *p != 1;

        for ( int i = 3; prime && i <= *p / i; i += 2 )
        {
            if ( *p % i == 0 ) prime = 0;
        }

        if ( prime ) printf( "%d ", *p );
    }

    putchar( '\n' );
}