【问题标题】:generate a list with adjecant pair of co-primes生成具有相邻互质数对的列表
【发布时间】:2014-12-31 15:01:36
【问题描述】:

给定 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.

输入:

输入的第一行包含一个整数 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;
}

【问题讨论】:

  • 与答案无关coprime 函数中的最后一个else 是多余的。
  • 甚至不运行,只是永远坐在那里。无论如何,这听起来像是一个家庭作业问题。
  • 你应该使用函数,这并不容易理解你的程序的意图。
  • 如果输入是(数字)怎么办:2、4、8、10、13、11、16、18
  • giorgim,元素必须是连续的。它们中的每一个都出现一次,除了一个出现两次。输入以一种极其低效的方式组织:不是只给出 N 和出现两次的数字,而是给出所有数字,其中一个给出两次。至少描述是这样解释的。

标签: c algorithm primes


【解决方案1】:

这是一个非常简单的解决方案:假设出现两次的数字是x。那么答案是{x, 1, 2, 3, ..., n - 1}。为什么它有效? gcd(x, 1) = 1 用于任何xgcd(a, a + 1) = 1 用于任何a。因此,这个排序是正确的。

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2021-10-12
    • 2019-10-05
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多