【发布时间】: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 和出现两次的数字,而是给出所有数字,其中一个给出两次。至少描述是这样解释的。