【问题标题】:Finding highest prime number from set of input integers in C从C中的一组输入整数中找到最高素数
【发布时间】:2015-09-25 01:01:59
【问题描述】:

虽然我的代码没有错误,但我很难理解我的逻辑中奇怪的输出和错误。 我的想法是将素数与输入分开并将它们存储在一个数组中,然后按降序排列它们。我无法确定输入中是否没有整数,或者输入是否小于特定数量的输入。这里我采用 4 个输入。

#include<stdio.h>
int main()
{ 

    int i,j,p[3],n[3], count = 0;

    printf("Enter 4 integers:");
    scanf("%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3]);

    if(scanf("%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3]) != 4);
        printf("enter only 4 inputs\n");
    if(scanf("%d,%d,%d,%d",&n[1],&n[2],&n[3],&n[4]) < 4);
        printf("enter only integers\n");


    for(j=0;j<4;j++)
    {
        for (i = 2; i <= n[j] / 2; i++)
        {
            if (n[j] % i == 0) 
            {
            count++;
            break;
            }
            if (count == 0)
                p[j] = n[j];
            else
                p[j]=0;

        }
    }
    for(j=0;j<4;j++)                          // to display prime array
    {
    printf("%d\n",p[j]);
    }

    if(p[0] == p[1] == p[2] == p[3] ==0 )
        printf("No prime number is present\n");

    for(i=1;i<4;++i)                              // Loop to store largest number to p[0] 
        {
            if(p[0]<p[i]) 
            p[0]=p[i];
        }
        printf("Largest element = %d",p[0]);
    return 0;
}

【问题讨论】:

  • 首先,不要访问超出范围的p[3]n[3]n[4]
  • 每次您在if() 中调用scanf 时,它都会等待用户输入另外4 个数字。
  • p[0] == p[1] == p[2] == p[3] ==0 不会产生预期的结果。请改为将每个元素与0 进行比较。即p[0] == 0 &amp;&amp; p[1] == 0 &amp;&amp; p[2] == 0 &amp;&amp; p[3] == 0
  • 你不能像if(p[0] == p[1] == p[2] == p[3] ==0 )那样链接比较。应该是if (p[0] == 0 &amp;&amp; p[1] == 0 &amp;&amp; p[2] == 0)
  • 我觉得if(scanf(~))后面的两个分号应该去掉。

标签: c scanf primes


【解决方案1】:

我希望这会有所帮助。我尽可能多地做笔记。

#include<stdio.h>
#include<iostream>



using namespace std;

int main() {

//int i,j,p[3],n[3], count = 0;
//  When possible try to place declarations
    //close to where they are going to be used.

int n[4] = {0,0,0,0}; //Declare the array, we won't need the other no more.

printf("Enter 4 integers:");

//I would put this in a loop.
std::cin >> n[0]; cout << " next \n";
std::cin >> n[1]; cout << " next\n";
std::cin >> n[2]; cout << " next\n";
std::cin >> n[3]; cout << " next\n";
//also this computer was acting weird
//with scanf so I had to switch to cin.

//weird way to check for four numbers
//if(scanf("%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3]) != 4);
//    printf("enter only 4 inputs\n");
//if(scanf("%d,%d,%d,%d",&n[1],&n[2],&n[3],&n[4]) < 4);
//    printf("enter only integers\n");


//Lets declare a place to store the largest prime.
int largest_prime = -1; //-1 to detect errors.

//initiate j here.
for(int j=0;j<4;j++)//Iterate through all the numbers.
{
    if(n[j] % 2 == 1){
        if(n[j] > largest_prime)
        {
            largest_prime = n[j];
        }
    }
//    for (i = 2; i <= n[j] / 2; i++)
//    {
//        if (n[j] % i == 0)
//        {
//        count++;
//        break;
//        }
//        if (count == 0)
//            p[j] = n[j];
//        else
//            p[j]=0;

    }
//for(j=0;j<4;j++)                          // to display prime array
//{
//printf("%d\n",p[j]);
//}
//
//if(p[0] == p[1] == p[2] == p[3] ==0 )
//    printf("No prime number is present\n");
//
//for(i=1;i<4;++i)                              // Loop to store largest number to p[0]
//    {
//        if(p[0]<p[i])
//        p[0]=p[i];
//    }
//    printf("Largest element = %d",p[0]);

std::cout << "\nThe highest prime number: " << largest_prime << " Thanks!";
return 0;
}

【讨论】:

  • 我的输入不仅仅是素数,它们可以是任何整数。这就是我试图将素数与其他整数分开的原因。当我将素数与其他整数分开时,我的 o/p 很奇怪。如果你能帮我解决这个逻辑错误,我真的很感激。谢谢
【解决方案2】:

使用此代码

#include <stdio.h>

int main(void)
{
    int i,j, n[4] = {0,};
    int max_prime_val = -1;
    int check_prime;

    //int n, i, j, check;
    printf("Enter four integers:\n");

    for(j=0; j<4; j++)
    {
        scanf("%d", &n[j]);
    }

    for (j = 0; j < 4; j++)
    {
        check_prime = 0;
        //Use sqrt(n[j]) in place of n[j]/2 for increase time efficiency
        //temp = (int)sqrt(n[j]);
        //for (i = 2; i < temp ; i++)    
        for (i = 2; i < n[j]/2 ; i++)
        {
            if (n[j] % i == 0)
            {
                check_prime = 1;
                break;
            }
        }
        if ( (check_prime == 0) && (n[j] > max_prime_val) )
        {
            max_prime_val = n[j];
        }
    }
    printf("The biggest prime number is [%d]",max_prime_val);
    return 0;
}

【讨论】:

  • 关闭 1:temp = sqrt(n[j]) for (i = 2; i &lt; temp ; i++) --> i &lt;= temp。将 FP sqrt()int 数学混合会导致精度问题。建议for (i = 2; i &lt;= n[j] / i; i++)
  • 感谢@chux 的提醒。我在想int temp,所以无论如何,来自 sqrt() 的 FP 都会被转换为 int。但是是的,temp = (int)sqrt(n[j]) 会更好用。
  • 错过了 1 个问题。使用i &lt;= temp,而不是i &lt; temp
猜你喜欢
  • 1970-01-01
  • 2022-08-10
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
相关资源
最近更新 更多