版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yky__xukai/article/details/81450479
a+b=100
Description
给定一个无序的十进制序列,找出两个数的和为100的数对。 如-1 0 50 70 88 101 120中只有-1+101=100,因此只有一对。
Input
有多组测试数据,你的程序必须读到EOF为止。 每组数据两行,第一行一个整数N(2<=N<=10000),N表示给的数的个数,接下来一行N个整数,用空格隔开,这N个整数各不相同,且都在-2^31到2^31之间。N为0时,表示输入结束,不需要处理。
Ouput
对于每组数据,输出单独的一行,表示和为100的数对个数。
Sample Input
10
10 20 30 45 46 60 70 80 90 100
7
-1 0 50 70 88 101 120 0
Sample Output
3 1
超时代码:时间复杂度是O(n^2)
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <cstring>
#define MAX 10001
using namespace std;
int main()
{
int n,i,j,count;
int a[MAX];
while(cin>>n)
{
if(n==0) break;
memset(a,0,sizeof(a));
count=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if((a[i]+a[j])==100)
{
count++;
}
}
}
cout<<count<<endl;
}
return 0;
}
AC代码:O(n*log2(n))+O(n)=O(n*log2(n))
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std ;
int a[100002] ;
int MyCompare(const void *elem1,const void *elem2)
{
int *p1,*p2 ;
p1 = (int *)elem1 ;
p2 = (int *)elem2 ;
return (*p1)-(*p2) ;
}
int work(int num,int m)
{
int k = m-1 ;
int t = 0 ;
while(t < k)
{
if(a[t] + a[k] == 100)
{
t++;
k--;
num += 1 ;
}
else if(a[t] + a[k] > 100)
k-- ;
else
t++ ;
}
return num ;
}
int main()
{
int m;
int i,j ;
while(cin>>m){
if(m == 0)
break ;
memset(a,0,sizeof(a)) ;
for( i = 0 ; i < m ; i++)
cin>>a[i];
qsort(a,m,sizeof(int),MyCompare) ;
cout<<work(0,m)<<endl;
}
return 0;
}
C 库函数 - qsort()
描述
C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 对数组进行排序。
声明
下面是 qsort() 函数的声明。
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数
-
base -- 指向要排序的数组的第一个元素的指针。
-
nitems -- 由 base 指向的数组中元素的个数。
-
size -- 数组中每个元素的大小,以字节为单位。
-
compar -- 用来比较两个元素的函数。
返回值
该函数不返回任何值。
实例
下面的实例演示了 qsort() 函数的用法。
#include <stdio.h>
#include <stdlib.h>
int values[] = { 88, 56, 100, 2, 25 };
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main()
{
int n;
printf("排序之前的列表:\n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}
qsort(values, 5, sizeof(int), cmpfunc);
printf("\n排序之后的列表:\n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
排序之前的列表:
88 56 100 2 25
排序之后的列表:
2 25 56 88 100