生成具有相邻的一对共素的列表

时间:2014-12-31 15:01:37

标签: c algorithm primes

给定N个元素,使得从1到N-1的每个元素只出现一次,除了一个。你的任务非常简单。以任何顺序排列这些元素,使得每对相邻元素是互质的。假设我们有5个元素A1,A2,A3,A4,A5,并且所需的顺序是任意顺序B1,B2,B3,B4,B5这样。

gcd(B1,B2) = gcd(B2,B3) = gcd(B3,B4) = gcd(B4,B5) =1.

INPUT:

第一行输入包含一个表示元素数量的整数N.输入的下一行包含N个空格分隔的整数,表示N个元素。

输出:

输出由N个空格分隔的整数组成,表示根据上述条件的有效序列。

约束:

N<=5*10^6

A[i] <= [common sense]

所有值都严格按照约束条件。

我试过这个。请建议一个更好的算法。

#include<stdio.h>
#include<stdlib.h>
int coprime(int num1 , int num2)
 {
     while(num2%num1!=0)
     {
          int rem= num2%num1;
          num2=num1;
          num1=rem;
     }
     return (num1==1);
}

int main()
{
    long int *arr , n , i=0 ,j ,k , p,flag=0,t;
    puts("enter the no of elements");
    scanf("%ld" ,&n);
    arr=(long int*)malloc(n*sizeof(long int));
    p=n;

    while(i<n)
    {
        scanf("%ld",&arr[i]);

        if(arr[i]==0)
            break;
        i++;
    }

    for(i=0 ; i<n ; i++)
    {
        if(!flag)
            p--;
        k=arr[p];

        for(j=0; j<n; j++)
        {
            if(coprime(k,arr[j]))
            {

                if(coprime(k,arr[j+1]))
                {
                    for(t=n; t>j+1 ; t--)
                    {
                        arr[t]=arr[t-1];
                    }
                    arr[j+1]=k;
                    j++;
                }
                else if(j>0&&coprime(k,arr[j-1]))
                {
                    for(t=n; t>j ; t--)
                    {
                        arr[t]=arr[t-1];
                    }
                    arr[j]=k;

                }
                flag=1;
                break;
            }
        }
    }

    for(i=0; i<n; i++)
        printf("%ld " ,arr[i]);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是一个非常简单的解决方案:让我们假设两次出现的数字是x。然后答案是{x, 1, 2, 3, ..., n - 1}。它为什么有效?任何gcd(x, 1) = 1的{​​{1}}和任何x的{​​{1}}。因此,这种排序是正确的。