如何在数组中找到两个素数的最大乘积?

时间:2016-09-01 04:18:32

标签: c algorithm primes

#include <stdio.h>
int final[3];
int checkprime(int n,int loopcount)
{
    int flag=0,m;
    for(m=2; m<=loopcount; m++)
    {
        if(n%m==0 && n!=2)
        {
            flag=1;
            return 0;
            break;

        }
        else if(n==2)
        {
            flag=0;
            break;

        }
    }
    if(flag==0)
    {
        return 1;
    }
}
int main()
{
    int test_no,n,i,j,k,m,max=1,loopcount,product=1,max_available=0,count=0;
    scanf(" %d",&test_no);
    for(i=0; i<3; i++)
    {

        scanf(" %d",&n);
        int array[n];
        for(j=0; j<n; j++)
        {
            scanf(" %d",&array[n]);
            loopcount=array[n]/2;
            if(max<loopcount)
            {
                max=loopcount;
            }
        }
        loopcount=max;
        max=array[0];
        for(j=0; j<n; j++)
        {
            int x=checkprime(array[j],loopcount);
            if(x==1)
            {
                if(array[j]>=max)
                {
                    max=array[j];
                }
            }
        }
        product=product*max;
        max=1;
        for(j=0; j<n; j++)
        {
            int x=checkprime(array[j],loopcount);
            if(x==1)
            {
                if(array[j]>max && product!=array[j])
                {
                    max=array[j];
                    max_available=1;
                }
                else if(array[j]>=max && product==array[j] && max_available==0)
                {
                    max=product;
                }
            }
            if(x==0)
            {
                count++;
            }
        }
        if(count==n || count==n-1)
        {
            final[i]=-1;

        }
        else
        {
            product=product*max;
            final[i]=product;

        }
        product=1;
    }
    for(i=0; i<3; i++)
    {
        printf("%d\n",final[i]);
    }
    return 0;
}

上面的代码工作不正常,我无法得到这背后的原因,我找到素数两次,我使用了一个变量loopcount,以便找到检查数字是否为素数的迭代次数或不。

我最初采用了3号阵列,我提供了3个输入,每个输入的阵列大小不同,然后我迭代两次以找到最大值的产品,如果我找不到任何素数,我输出输出屏幕上的-1。 第一行描述了可以被视为测试用例数量的输入总数,对于每个测试用例,第一行描述了数组的大小,第二行描述了数组中存在的元素。请帮我识别问题,对于第一个输入它是打印-1但有一些问题,理想情况下,它应该只去部分

if(count==n || count==n-1)
{
    final[i]=-1;         
}

但它会编写其他部分的代码片段,

else
{
    product=product*max;
    final[i]=product;
}

我通过在else部分编写printf语句来检查,所以我能够获得为第一个输入打印的值,这是非常令人困惑的,因为如果部分正在执行那么为什么else部分被执行?并且对于其余的输入,它是打印垃圾值。

这是一个输入集:

3

5
1 4 6 8 10

3
2 2 9

2
156 13 

相应的输出是:

-1
4
169

2 个答案:

答案 0 :(得分:2)

您应该扫描array[j]而不是array[n]nth索引无效。

int array[n];
for(j=0; j<n; j++)
{
    scanf(" %d",&array[n]);  /// Problem is here
    loopcount=array[n]/2;
    if(max<loopcount)
    {
        max=loopcount;
    }
}

答案 1 :(得分:1)

以前,你有一个非常复杂的想法。以下是对代码进行的一些优化。随意问什么。希望它有所帮助:)

#include <stdio.h>
#include <math.h>

int checkprime(int n)
{
    int flag=0,m;
    for(m=2; m<=sqrt(n); m++)
    {
        if(n%m==0)return 0;
    }
    return 1;
}
int main()
{
    int test_no,n,i,j,k,m,max=1,loopcount,product=1,max_available=0,count=0;
    scanf("%d",&test_no);
    for(i=0; i<test_no; i++)
    {
        scanf(" %d",&n);
        int array[n];
        for(j=0; j<n; j++)
        {
            scanf("%d",&array[j]);
        }
        sort(array);  // Use any sort algorithm you wish to sort the array
        int _1=1, _2=1;
        for(int j=n-1; j>=0; j--){
            if(checkprime(array[j])==1){
                if(_1==1){
                    _1=array[j];
                }
                else if(_1!=1 && _2==1){
                    _2=array[j];
                    break;
                }
            }
        }
        if(_1==1 && _2==1)printf("-1\n");
        else if(_2==1 && _1!=1)printf("%d\n", _1*_1);
        else printf("%d\n", _1*_2);
    }
    return 0;
}