数组中素数的平均值

时间:2014-06-09 04:09:11

标签: c

嗯,问题是上面的问题。总结一下,它编译,但我想我的主要想法是错误的。我尝试使用该代码的原因是:

  • 我希望这个人给我们数组的元素,他想要多少(限制为100个元素)。
  • 之后,我会检查哪些数组位置是素数。(例如:位置2,3,5,等等。不是元素本身)。
  • 之后,我正在处理素数位置的平均值。

那就是它。有任何想法吗?请记住,我在第一个工程时期,所以我不是最好的编程。

代码如下:

#include <stdio.h>
#include <windows.h>
int main(void)
{
    int k, i, j, d, v[101], sum, prim, f;
    float ave;

    i = 0;

    while ((i < 101) && (j != 0) )
    {
        i++;
        printf("Set the value of the element %d => ", i);
        scanf("%d", &v[i]);
        printf("To stop press 0 => ");
        scanf("%d", &j);
    }
    k = 0;
    prim = 1;
    f = i;
    sum = 0;
    while (f > 2)
    {
        if (i % (f - 1) == 0)
        {
            prim = 0;
        }
        else
        {
            k++;
            sum = sum + v[f];
        }
        f = f - 1;
    }

    med = sum / k;
    printf("%d, %d, %d", k, soma, i);
    printf("The average is => %f \n", ave);
    system("pause");
}

对于那些想知道的人,这是我在正确答案中编辑后得到的:

int main(void)
{
    int v[101];
    int n = 0;
    int k,j = 0;
    int i=0;
    int sum = 0;

    while( i<100 )
    {
        i++;
        printf ("Set the value of the element %d => ", i);
        scanf ("%d", &v[i]);
        int x,primo=1;
        if (i>1){
          for (x=2; x*x<=i; x++) {
            if (i % x == 0) primo = 0;
          }
          if(primo==1)
          {
             sum = sum+ v[i];
             n++;
          }
        }
        printf ("To stop press 0 => ");
        scanf ("%d", &j);
        if(j == 0)
            break;
    }

    float ave =(sum /n);
    printf("%d, %d, %d", n,i,sum);
    printf("The average is => %f \n", ave);
    system("pause"); 
}

4 个答案:

答案 0 :(得分:3)

首先让我们设一个可读的方法来测试一个数字是否为素数;来自另一篇SO帖子的this answer给了我们一个很好的帖子:

int IsPrime(int number) {
  int i;
  for (i=2; i*i<=number; i++) {
    if (number % i == 0) return 0;
  }
  return 1;
}

其次,让我们清理您的代码,并计算到目前为止遇到的所有素数的运行总和。另外,我们会检查scanf的返回值(但我们应该avoid scanf!)

第三,我们添加了一些缩进。

int main(void)
{

    int n = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    int sum = 0;

    while( i<101 )
    {
       i++;
       printf ("Set the value of the element %d => ", i);
       if(scanf ("%d", &k) != 1)
           continue;

       if(is_prime(k))
       {
        sum += k;
        ++n;
       }

       printf ("To stop press 0 => ");
       if(scanf ("%d", &j) == 1)
          if(j == 0)
              break;
    }

    float ave = sum / (double) n;
    printf("The average is => %f \n", ave);
    system("pause");
}

答案 1 :(得分:1)

嗯,有几件事要说。首先是简单的部分:如果允许读取的最大整数数是100,那么变量&#34; v&#34;应该是v[100]。这不是char数组,因此这个数组不需要有一个额外的元素(v[100]将是int的数组,从v[0]v[99] };也调整循环限制。

此外,您正在检查变量f中的数字是否为素数,但此变量是使用变量i分配的,而i不是数组的元素。您希望为f分配v[i]之类的内容(对于i等于0,读取的数字减去1)。因此,您需要2个循环:您现在用于检查数字是否为素数的循环,以及另一个将v[i]分配给f的循环。

另一个要说的是你要两次调用scanf进行阅读,你可以只读取数字并将其存储在一个临时变量中。如果此数字不为零,则将其存储在数组中并继续读取,否则您将停止读取。

最后,我强烈建议您设置有意义的var名称,仅对索引变量使用单个字母; temparraymaxcountnumbers等名称应出现在您的代码中。您和其他人更容易阅读您的代码,并且您将减少错误的数量。

答案 2 :(得分:1)

这是您问题的解决方案。非常简单。

/* C program to find average of all prime numbers from the inputted array(you can predefine it if you like.) */        

#include <stdio.h>
#include <conio.h>
void main()
{
    int ar[100], i, n, j, counter;
    float avg = 0, numprime = 0;
    printf("Enter the size of the array ");
    scanf("%d", &n);
    printf("\n Now enter the elements of the array");
    for (i = 0; i < n; i++)
    {
        scanf("%d", &ar[i]);
    }
    printf(" Array is -");
    for (i = 0; i < n; i++)
    {
        printf("\t %d", ar[i]);
    }
    printf("\n All the prime numbers in the array are -");
    for (i = 0; i < n; i++)
    {
        counter = 0;
        for (j = 2; j < ar[i]; j++)
        {
            if (ar[i] % j == 0)
            {
                counter = 1;
                break;
            }
        }
        if (counter == 0)
        {
            printf("\t %d", ar[i]);
            numprime += 1;
            avg += at[i];
        }
    }
    avg /= numprime;
    printf("Average of prime numbers is ℅f", avg);
    getch();
}

对于所有平均计算,您只需要上述计数器变量。 (因为我们需要知道数组中素数的数量,这样我们就可以划分它们的总数,从而获得平均值。)不要担心类型转换正在向下完成...这个解决方案有效。我自己写的。

答案 3 :(得分:1)

这是做你想做的事情。您不需要接近原来的变量数量。而且,在不知道你想要素数的情况下,我只是在遇到素数时输出。同样如前所述,使用函数检查素数确实有帮助:

#include <stdio.h>
// #include <windows.h>

/* see: http://stackoverflow.com/questions/1538644/c-determine-if-a-number-is-prime */
int IsPrime(unsigned int number) {
    if (number <= 1) return 0; // zero and one are not prime
    unsigned int i;
    for (i=2; i*i<=number; i++) {
        if (number % i == 0) return 0;
    }
    return 1;
}

int main(void)
{
    int i, v[101], sum, pcnt=0, psum=0;
    float ave;

    i=0;

    printf ("\nEnter array values below, use [ctrl + d] to end input\n\n");
    printf ("Set the value of the element %d => ", i);
    while((i<101) && scanf ("%d", &v[i]) != EOF ){
        sum += v[i];
        if (IsPrime (v[i]))
            psum += v[i], pcnt++;
        i++;
        printf ("Set the value of the element %d => ", i);
    }

    ave=(float)psum/pcnt;

    printf("\n\n  Number of elements     : %d\n",i);
    printf("  The sum of the elements: %d\n",sum);
    printf("  The number of primes   : %d\n",pcnt);
    printf("  The average of primes  : %f\n\n", ave); 

    return 0;
}

示例输出:

Enter array values below, use [ctrl + d] to end input

Set the value of the element 0 => 10
Set the value of the element 1 => 20
Set the value of the element 2 => 30
Set the value of the element 3 => 40
Set the value of the element 4 => 51
Set the value of the element 5 => 11
Set the value of the element 6 => 37
Set the value of the element 7 =>

Number of elements     : 7
The sum of the elements: 199
The number of primes   : 2
The average of primes  : 24.000000