用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数
来源:互联网 发布:大数据解决方案供应商 编辑:程序博客网 时间:2024/04/28 07:04
题目大意:
输入:实数数组X, 实数个数n, 输出: 距离最小的两个实数.
我大概做了两个版本,不过道理都是差不多的
1.代码如下:
/*4用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数。输入:实数数组X, 实数个数n, 输出: 距离最小的两个实数.*/#include<stdio.h>#include<math.h>#define N 10000int c1=0,c2=1;int min(int a,int b,int c){int m;m=a<b?a:b;return m<c?m:c;}int Cpair(int S[],int left,int right){int l,r,n;int d,d1,d2;n=right-left+1;if(n<2){d=100000;return d;}else if(n==2){d=S[right]-S[left];return d;}else{if(n%2==0){l=n/2;r=n/2-1;}else{l=(n+1)/2;r=(n-1)/2;}d1=Cpair(S,0,r);d2=Cpair(S,l,n-1);if(d2<d1){c1=left;c2=right;}d=min(d1,d2,S[l]-S[r]);if(d==S[l]-S[r]){c1=r;c2=l;}return d;}}void main(){int i,j,n,S[N],dis;printf("请输入数据个数:");scanf("%d",&n);printf("请输入数据\n");for(i=0;i<n;i++)scanf("%d",&S[i]);for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(S[j]>S[j+1]){S[j]^=S[j+1];S[j+1]^=S[j];S[j]^=S[j+1];}}}dis=Cpair(S,0,n-1);printf("最短的距离是:%d\n",dis);printf("最近的两个数是:%d %d\n",S[c1],S[c2]);}
2.。代码如下:
/*4用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数。输入:实数数组X, 实数个数n, 输出: 距离最小的两个实数.*/#include<stdio.h>#include<math.h>#define N 1000#define MAXNUM 10000struct dis Cpair(int a[],int p,int q);struct dis{int d;int x;int y;};struct dis minlen;void main(){int a[]={12,25,65,46,34,19,29,91,73,59}; minlen=Cpair(a,0,9);printf("最小距离是:%d\n",minlen.d);printf("最近的两个数是:%d %d\n",minlen.x,minlen.y);}struct dis Cpair(int a[],int p,int q){int j=0,k=0,min=100000,max=0;int b[N],c[N];struct dis tom,man,cat;if(p==q){tom.x=a[p];tom.y=a[q];tom.d=MAXNUM;return tom;}if(q-p==1){tom.x=a[p];tom.y=a[q];tom.d=abs(a[q]-a[p]);return tom;}double temp=(a[p]+a[q])/2.0;for(int i=0;i<=q;i++){if(a[i]<temp){b[j]=a[i];if(b[j]>max)max=b[j];j++;}else{c[k]=a[i];if(c[k]<min)min=c[k];k++;}}man=Cpair(b,0,j-1);cat=Cpair(c,0,k-1);minlen.x=max;minlen.y=min;minlen.d=min-max;if(man.d<cat.d){tom=man;}else{tom=cat;}if(tom.d<minlen.d){minlen=tom;}return minlen;}
- 用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数
- 请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用"6.2f"格式输出。
- 一个无序实数数组中的相邻两个元素的最大差值
- n个实数(仅包含正实数和负实数)组成的数组A进行重新排序, //使得其中的所有的负实数都要在正实数之前
- N个实数中偶数的平均值
- 两个实数的交换
- 输出实数的格式
- 输入20个实数存放在一维数组中,输出它们的平均值以及高于平均的数的个数
- 给出一个实数集合和一个实数,怎样判断集合中是否存在两个和等于该实数的元素
- 5.1 从键盘任意输入一个实数,不要绝对值就输出实数的绝对值
- 给你N个实数,求他们的平均值,
- 求N个实数的最大值和最小值
- 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。
- 随机产生一个(m,n)之间的实数
- 由键盘输入两个实数,交换后输出
- 输入两个实数,交换后输出
- 输入一个实数,并输出该数的绝对值
- 5.1计算并输出一个实数的值
- 从一个实例看jaxb的强大
- EXCEL 函数
- JiBX初步
- JSF入门
- 黑马程序员—两种设计模式及其代码的实现—第11篇
- 用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数
- 对滚动区域QScrollArea用法的摸索
- 多处最优问题
- 控制系统动态性能分析
- libxml库解析XML文件
- HTML编辑器FCKeditor使用详解
- 网球循环赛问题
- 清明节---山东又叫寒食节--吃冷食
- 使用Libxml2操作XML文档