- 论坛徽章:
- 0
|
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- void inline swap(int *x,int *y)
- {
- int tmp;
- tmp=*x;
- *x=*y;
- *y=tmp;
- }
- void max_heapify(int a[],int i,int j)
- {
- int k=i;
- int ind;
- while(2*k+1<=j){
- ind=2*k+1;
- if(ind+1<=j && a[ind+1]>a[ind])
- ind++;
- if(a[k]<a[ind])
- swap(a+k,a+ind);
- k=ind;
- }
- }
- void build_heap(int a[],int i,int j)
- {
- int k;
- for(k=(j-1)/2;k>=0;k--)
- max_heapify(a,k,j);
- }
- void heap_sort(int a[],int n)
- {
- int k;
- build_heap(a,0,n);
- for(k=n;k>=1;k--){
- swap(a,a+k);
- max_heapify(a,0,k-1);
- }
- }
- int bin_search(int a[],int key,int i,int j)
- {
- int low=i;
- int high=j;
- int mid;
- while(low<=high){
- mid=(low+high)/2;
- if(key==a[mid])
- return mid;
- else if(key<a[mid])
- high=mid-1;
- else
- low=mid+1;
- }
- return -1;
- }
- int bin_locate(int a[],int key,int i,int j)
- {
- int low=i;
- int high=j;
- int mid;
- while(high-low>1){
- mid=(low+high)/2;
- if(key==a[mid])
- return mid;
- else if(key<a[mid])
- high=mid-1;
- else
- low=mid+1;
- }
- return low;
- }
- int gog(int a[],int n)
- {
- int i,j;
- int ind1,ind2;
- heap_sort(a,n);
- for(i=n;i>=0;i--){
- if(sqrt(a[i])<a[0]) continue;
- ind1=bin_locate(a,sqrt(a[i]),0,n);
- for(j=0;j<=ind1;j++){
- if(a[i]%a[j]==0){
- ind2=bin_search(a,a[i]/a[j],ind1+1,i-1);
- if(ind2>=0){
- printf("%d*%d=%d\n",a[j],a[i]/a[j],a[i]);
- return 0;
- }
- }
- }
- }
- return -1;
- }
- int main(void)
- {
- int i;
- int test[10]={13,13,12,11,10,9,8,7,4,1};
- gog(test,9);
- system("pause");
- return 0;
- }
复制代码
写了个n(3/2)*logn的程序,不知道对错 |
|