您的位置:首页 > 产品设计 > UI/UE

HDU6025-Coprime Sequence-简单数学

2017-05-07 22:08 387 查看

能AC的错误代码

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
using namespace std;
#define LL long long
#define N 1000005
#define M 2005
#define INF 0x3f3f3f3f
const double eps = 1e-10;
/*
题意:去掉数组中人任意一个数,使数组gcd值最大。
思路:任选一个数
1)求不去掉这个数的数组gcd最大值 a
2)求去掉这个数的数组gcd值 b
答案为 max(a,b)
*/
int ans1
;
int num
;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
for(int i=2;i<=n;i++){
ans1[i] = gcd(num[1],num[i]);
}
int a=INF,b=INF;
for(int i=2;i<=n;i++){
if(a>ans1[i]){
b = a;
a = ans1[i];
}else if(b>ans1[i]){
b = ans1[i];
}
}
a = num[2];
for(int i=3;i<=n;i++){
a = gcd(a,num[i]);
if(a==1) break;
}
printf("%d\n",max(a,b));
}
}

能AC的正确代码

思路:任选一个数,不妨取第一个数 x
1)求不去掉 x 的数组gcd最大值 a,再求解 其余 n-1 个数与 x 的 gcd 最小的数 y, 求去掉y之后的数组gcd a
2)求去掉 x 的数组gcd值 b
答案为 max(a,b)
#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define INF 0x3f3f3f3f
int num
;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
scanf("%d",&num[1]);
scanf("%d",&num[2]);
int a = INF,b = num[2] ,index; // index 记录 与num[1] gcd 最小的数 在数组中位置,b 为去掉 num[1]的数组 gcd 值
if(a>gcd(num[1],num[2])){
a = gcd(num[1],num[2]);
index = 2;
}
for(int i=3;i<=n;i++){
scanf("%d",&num[i]);
b = gcd(b,num[i]);
if(a>gcd(num[1],num[i])){
a = gcd(num[1],num[i]);
index = i;
}
}
a = num[1];
for(int i=1;i<=n;i++){
if(i==index) continue;   //求解 去掉 num[index]的数组gcd值
a = gcd(a,num[i]);
}
printf("%d\n",max(a,b));
}
}






                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU简单数学