Hdu 包含21个题解

大一寒假做的hdu写到一起了, 基本都是C代码

题号 **** 题目----
1. 2098 分拆素数和
2. 2092 整数解
3. 1005 Number Sequence
4.1001 Sum Problem
5.1050 Moving Tables
6.1205 吃糖果
7.1052 Tian Ji – The Horse Racing
8. 1280 前m大的数
9.1862 EXCEL排序 (c+±AC,c-WA)
10.1009 FatMouse’ Trade
11.1872 稳定排序
12.1234 开门人和关门人
13.1070 Milk
14.1789 Doing Homework again
15.1792 A New Change Problem
16.1108 最小公倍数
17.2111 Saving HDU
18.2044 一只小蜜蜂…
19.2018 母牛的故事
20.1176 免费馅饼
21.2034 人见人爱A-B

2098
先将10000以内的素数存起来,
接着找一个比正偶数小的素数,
然后在判断偶数与此素数的差是否为素数:

#include<stdio.h>
int main()
{
 int i,j,k,l,n,m,f;
 int a[10001]={0};
 for(i=2;i<=10000;i++)//把10000以内的素数存起来 
 {
  f=1;//假设 i 是素数 
  for(j=2;j<=i/2&&f;j++)
  {
   if(i%j==0)
   {
    f=0;//i不是素数 
   }
  }
  if(f==1)
  a[i]=1;//记录素数 
 }
 while(scanf("%d",&m),m)
 {
  j=0;
  for(i=2;i<m/2;i++)
  {
   if(a[i]==1)
   {
    if(a[m-i]==1)
    {
     j++;
    }
    } 
  }
  printf("%d\n",j);
 }
 } 

2092

a+b=n;
ab=m;
只需判断a
(n-a)==m; 是否可以满足
也就是只需判断a为整数时是否满足

#include<stdio.h>
int main(void)
{
 i,n,m,t;    
 while(scanf("%d%d",&n,&m)&&(m!=0||n!=0))
 {
  t=0;
  for(i=-10000;i<10000;i++)
  {
   if(i*(n-i)==m)
   {
    t=1;
    break;
   }
  }
  if(t)
   printf("Yes\n");
  else
   printf("No\n");
 }
 return 0;
}

1005
因为对于f(n)来说,
当n>=2时候,f(n)只可能为0-6之间的数字。
f[i]=(af[i-1]+bf[i-2])%7,
如果能够在f(n)中能够找到他的循环周期的话,
那么只要用f[(n-1)/T]]即可在数组f中找到其对应的值,
其算法复杂度仅仅只有O(i),这个i远远小于n。
当这个n值越大,这种周期式的算法优势就越明显
//注释:因为无论是多么优秀的算法,只要当 a、b、n中的n足够大时候,都不行,除非找到他的规律,
// 这样的话,计算一个周期T内f(n)的值即可解决问题。剩余的只要输出f[(n-1)/T]就行了。

#include<stdio.h>
#include<math.h>
int main()
{
 int i,a,b,n;
 char f[1000];
 while(scanf("%d%d%d",&a ,&b ,&n)!=EOF)
 {
  if(a == 0 && b==0 && n == 0) 
   return 0;
  f[0] = 1 ; 
  f[1] = 1;
  if(n == 1 || n == 2)
  {
   printf("1\n");
   continue;
  }
  for(i = 2 ;i < 1000 ; i++)
  {
   f[i]=(a*f[i-1]+b*f[i-2])%7;
   if(f[i-2] == 1 && f[i-1] == 1 && i != 2) //找到循环的位置
   break;
  }
  printf("%d\n",f[(n-1)%(i-2)]);
 }
 return 0;
} 

1001
直接利用公式:
Sn=n*(a1+an)/2;

#include <stdio.h>
int main(void)
{
 int n;
 __int64 sum = 0;
 while (scanf("%d", &n) != EOF)
 {
  sum = (n % 2) == 0 ? ((1 + n) * (n / 2)) : ((1 + n) * (n / 2) + n / 2 + 1);
  printf("%I64d\n", sum);
  printf("\n");
 }
return 0;
}

1050
首先只需要记录一行房间就行呢
然后记录已经被占用的楼道与次数

#include<stdio.h>
#define SR(a) scanf("%d",&(a))//define的另一种用法
#define qian(a)  printf("%d\n",(a))
#define FOR(i,a,b) for((i)=a;(i)<=(b);(i)++)
int main(void)
{
	int i,j,n,m;
	SR(n);
	while(n--)
	{	
		SR(m);
		int x,y,a[201]={0},l=0;
		while(m--)
		{	
			SR(x);
			SR(y);
			if(x>y)
			{
				int t;
				t=x;
				x=y;
				y=t;
			}
			FOR(j,(x+1)/2,(y+1)/2)//只考虑一边就OK
			{
				++a[j];//走过的路都记录
				if(a[j]>l)//记录叠加的次数
					l=a[j];	//记录最大叠加的次数
			}
		}
		qian(l*10);//输出时间
	}
	return 0;
}

1205

第一种 第二种
9个(■) 5个(@) 2个(#) 5个(&) 12个(■) 5个(@) 3个(#) 1个(&)
9-(5+2+5)>=2不成立,所以可以吃完 12-(5+3+1)>=2成立所以吃不完
■@& ■@
■@& ■@
■@& ■@
■@ ■@
■@ ■@
■# ■#
■# ■#
■& ■#
■& ■&

也就是说最大的一组如果和其他合起来的差不大于1就Y

#include<stdio.h>
#define SR(a) scanf("%lld",&(a))//输入
#define N    printf("No\n")//输出
#define Y    printf("Yes\n")
#define FOR(i,a,b) for((i)=a;(i)<(b);(i)++)
int main(void)
{
	long long i,j,k,l,n,m;
	while(SR(n)!=EOF)
	{
		while(n--)
		{
			long long max=0,sum=0;
			SR(m);
			FOR(i,0,m)
			{
				SR(l);
				sum+=l;//求总和
				if(l>max)//找出种类中数量最大的
				{
					max=l;
				}
			}
			sum-=max;//总和减去最大的
			if(max-sum>=2)
			{
				N;
			}
			else
			{
				Y;
			}
		}
	}
	return 0;
}

1052

1、如果田忌最快的马比齐王最快的马快,则比之
2、如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比 //这是贪心的第一步
3、如果田忌最快的马的速度与齐威王最快的马速度相等
3.1、如果田忌最慢的比齐威王最慢的快,则比之 //这是贪心的第二步
3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快
3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快

#include<stdio.h>
#include<limits.h>
#define SR(a) scanf("%lld",&(a))
#define qian(a)  printf("%lld\n",(a))
#define FOR(i,a,b) for((i)=a;(i)<(b);(i)++)
void sort(long long a[],long long  n)
{
	long i,j,t;
	FOR(i,0,n)
	{
		FOR(j,i+1,n)
		{
			if(a[i]<a[j])
			{
				t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
		}
	}
}
int main(void)
{
	long long i,j,n,m;
	while(SR(n),n!=0)
	{
		long long a[1000],b[1000];
		FOR(i,0,n)
		{
			SR(a[i]);
		}
		sort(a,n);
		FOR(i,0,n)
		{
			SR(b[i]);
		}
		sort(b,n);
		long long k,sum,f,ji;
		ji=0;    //   记录 king  比赛用的马  循环跳出的判定条件 
		i=j=sum=0;
		k=n-1;
		f=n-1;
		while(1)
		{           
			if(ji==n)   
			break;   //   king  的马全部比完后跳出 
			if(b[j]>a[i])  //如果king的比tian的快马快 用tian的慢马对king的快马 
			{
			   sum-=200;
			   j++;
			   k--;
			   ji++; 
			   continue;
			} 
			if(b[j]==a[i])//如果相等 
			{                             
			    if(b[f]<a[k])//看两人的慢马 tian的慢马比king的慢马快则比 
				{
					f--;
					k--;
					sum+=200;
					ji++;
					continue;
				} 
			    if(b[j]>a[k])
				{
					sum-=200;
					k--;
					j++;
					ji++;
				}
			    else 
				{
					k--;
					j++;
					ji++;
				}
			        continue;
			}
			if(b[j]<a[i])//如果tian的比king的快马快 直接比 
			{
				sum+=200;
				j++;
				i++;
				ji++;
				continue;
			}  
		}    
		qian(sum); 		
	}
	return 0;
}

1280

#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
    return a>b;
}
int a[3002],b[9000002];
int main()
{
    int n,m;
    int i,j,k;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        k=0;
        for(i=0;i<n;i++)               //求出所有的和
            for(j=i+1;j<n;j++)
                b[k++]=a[i]+a[j];
        sort(b,b+k,cmp);
        printf("%d",b[0]);
        for(i=1;i<m;i++)
        printf(" %d",b[i]);
        printf("\n");
    }
    return 0;
}

1862
C++代码:

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define MAX 100010
using namespace  std;
struct IN
{
   char num[10];
   char name[10];
   int mark;
};
IN a[MAX];
int cmp1(IN x,IN y)//排序学号 
{
     return strcmp(x.num ,y.num)<0;
}
int cmp2(IN x,IN y)//排序名字 
{
    if(strcmp(x.name,y.name))   
        return   strcmp(x.name ,y.name)<0;
    return strcmp(x.num ,y.num)<0;//名字相同排序学号 
}
int cmp3(IN x,IN y)//排序成绩 
{
    if(x.mark!=y.mark)   
          return x.mark<y.mark;
       return strcmp(x.num ,y.num)<0;//成绩相同 排序学号 
}
int main()//主函数 
{
    int i,j=1,k,n,c;
    while(scanf("%d%d",&n,&c)&&(n+c))
    {
        memset(a,0,sizeof(a));//格式化 
        for(i=0;i<n;i++)//遍历结构 
            scanf("%s %s %d",a[i].num,a[i].name,&a[i].mark);
            
        if(c==1)        sort(a,a+n,cmp1);//排序学号 
        else if(c==2)   sort(a,a+n,cmp2); //排序名字 
        else            sort(a,a+n,cmp3);  //排序成绩 
           
        					printf("Case %d:\n",j++);   //输出结构 
        for(i=0;i<n;i++)   	printf("%s %s %d\n",a[i].num,a[i].name,a[i].mark);           
    }
    return 0;//返回 
}
/************************************************************************************************/
/*
C语言代码一直没过,求助,,: ↓
#include<stdio.h>
#include<string.h>
struct pai{//结构输入 
	char str[10],ser[10];
	int fen;
}a[110000],t[2];
void sort1(int n){//排序学号 
	int i,j;
	for(i=0;i<n;i++)
	for(j=i+1;j<n;j++)
	{
		if(strcmp(a[i].str,a[j].str)>0)
		{
			t[1]=a[i];
			a[i]=a[j];
			a[j]=t[1];
			memset(t,0,sizeof(t));
		}	
	}
} 
void sort2(int n){//排序名字 
	int i,j;
	for(i=0;i<n;i++)
	for(j=i+1;j<n;j++)
	{
		if(strcmp(a[i].ser,a[j].ser)>0)
		{ 
			t[1]=a[i];
			a[i]=a[j];
			a[j]=t[1];
			memset(t,0,sizeof(t));
		}	
	}
	for(i=0;i<n;i++)//名字相同排序学号 
	for(j=i+1;j<n;j++)
	{
		if(strcmp(a[i].ser,a[j].ser)==0)
		{
			if(strcmp(a[i].str,a[j].str)>0)
			{
				t[1]=a[i];
				a[i]=a[j];
				a[j]=t[1];
				memset(t,0,sizeof(t));
			}	
		}
	} 
	
}
void sort3(int n){//排序成绩 
	int i,j;
	for(i=0;i<n;i++)
	for(j=i+1;j<n;j++)
	{
		if(a[i].fen>a[j].fen)
		{
			t[1]=a[i];
			a[i]=a[j];
			a[j]=t[1];
			memset(t,0,sizeof(t));
		}	
	}
	for(i=0;i<n;i++)//成绩相同排序学号 
	for(j=i+1;j<n;j++)
	{
		if(a[i].fen==a[j].fen)
		{
			if(strcmp(a[i].str,a[j].str)>0)
			{
				t[1]=a[i];
				a[i]=a[j];
				a[j]=t[1];
				memset(t,0,sizeof(t));
			}	
		}
	}
}
int main(void)//主函数 
{
	int i,k=1,n,m;
	while(scanf("%d%d",&n,&m)&&(n+m))//输入 
	{
		memset(a,0,sizeof(a));
		for(i=0;i<n;i++)//遍历结构 
			scanf("%s %s %d", a[i].str, a[i].ser,&a[i].fen);	
	/*↓↓↓↓↓↓↓↓↓↓ →处理 ← ↓↓↓↓↓↓↓↓↓↓↓↓↓*/
			
		if(m==1)		sort1(n);//学号 排序 
		else if(m==2) 	sort2(n);//名字 排序 
		else 			sort3(n);//成绩 排序 
		
	/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
							printf("Case %d:\n",k++);//输出 
		for(i=0;i<n;i++)	printf("%s %s %d\n",a[i].str,a[i].ser,a[i].fen);	
	}
	return 0;
}
*/

1009

#include<stdio.h>
#include<string.h>
struct mao{
	int gua,shi;
	double bi;
}a[1001],t;
void sort(int n){ 
	int i,j;
	for(i=0;i<n;i++)
	for(j=i+1;j<n;j++)
	{
		if(a[i].bi<a[j].bi)
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}
} 
int main(void)
{
	double l,n;
	int i,m;
	while(scanf("%lf%d",&n,&m),m!=-1 || n!=-1)
	{
		memset(a,0,sizeof(a));
		for(i=0;i<m;i++)  
		{
			scanf("%d%d",&a[i].gua,&a[i].shi);
			a[i].bi=a[i].gua*1.0/a[i].shi;//求出性价比
		}
		sort(m);//性价比排序
		l=0;
		for(i=0;i<m;i++)
		{
			if(n>=a[i].shi)
			{
				l+=a[i].gua;
				n-=a[i].shi;
			}
			else
			{
				l+=(n*1.0/a[i].shi)*a[i].gua;
				break;
			}
		}
		printf("%.3f\n",l);
	}
}

拾壹1872

#include <stdio.h>
#include<string.h>
int main()
{
    int s[310], p[310], i, j, t, n;
    char a[310][110], b[310][110], c[110];
    while (~scanf("%d%*c", &n))//输入不等于EOF 
    {
        for (i = 0; i < n; i++)//遍历 
        {
            gets(a[i]);
            sscanf(a[i], "%*s%d", &s[i]);//只记录成绩 
        }
        for (i = 0; i < n; i++)
        {
            gets(b[i]);
            sscanf(b[i], "%*s%d", &p[i]);//只记录成绩 
        }
        for (i = 0; i < n - 1; i++)//排序 
        {
            for (j = 0; j < n - i - 1; j++)
            {
                if (s[j] < s[j + 1])
                {
                    t = s[j];
                    s[j] = s[j + 1];
                    s[j + 1] = t;
                    strcpy(c, a[j]);
                    strcpy(a[j], a[j + 1]);
                    strcpy(a[j + 1], c);
                }
            }
        }
    	for (i = 0; i < n; i++)
            if (strcmp(a[i], b[i]))
                break;
        for (j = 0; j < n; j++)
            if (s[j] != p[j])
                break;
        if (i == n && j == n)
            printf("Right\n");
        else if (j == n)
        {
            printf("Not Stable\n");
            for (j = 0; j < n; j++)
                printf("%s\n", a[j]);
        }
        else
        {
            printf("Error\n");
            for (j = 0; j < n; j++)
                printf("%s\n", a[j]);
        }
    }
    return 0;
}

拾贰1234

#include <stdio.h>
#include<string.h>
#include<limits.h>
int main(void)
{
    int i,j,k,l,n,m;
    while(scanf("%d",&n)!=EOF)
    {	
    	while(n--)
    	{
			char a[2][50],str1[50],str2[50],str3[50];
    		scanf("%d",&m);	
			int t1,t2,t3,t4,t5,t6;
    		int time1=0,time2=0,max=INT_MIN,min=INT_MAX;
    		for(i=0;i<m;i++)
    		{
    			scanf("%s %s %s",str1,str2,str3);//输入
    			sscanf(str2,"%2d%*c%2d%*c%2d",&t1,&t2,&t3);//把时间转为数字
    			sscanf(str3,"%2d%*c%2d%*c%2d",&t4,&t5,&t6);
    			time1=t1*3600+t2*60+t3;//求秒
    			time2=t4*3600+t5*60+t6;
    			if(time1<min)//记录开门人
    			{
    				min=time1;
					strcpy(a[0],str1);	
				}
    			if(time2>max)//记录关门人
    			{
    				max=time2;
    				strcpy(a[1],str1);
				}
			}
			printf("%s %s\n",a[0],a[1]);
		}
	 } 
    return 0;
}

拾叁 1070

#include<stdio.h>
#include<string.h>
struct milk{
	char pp[110];//品牌 
	int  jiage;//价格 
	int liang;//体积 
	double dj;//单位量 
}nn[100];
int main(void)
{
	int t,n,i,k,dj;
	double min;
	
	scanf("%d",&t);
	while(t--)
	{
		memset(nn,0,sizeof(nn));
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			scanf("%s%d%d",nn[i].pp,&nn[i].jiage,&nn[i].liang);
			if(nn[i].liang>=1000)//体积大于六天的量 
			{
				nn[i].dj=nn[i].jiage*1.0/5;
			} 
			else if(nn[i].liang<200)//体积不够一天 
			{
				nn[i].dj=0; 
			}	
			else//其他 
			{
				nn[i].dj=nn[i].jiage*1.0/(nn[i].liang/200);
			} 
		}
		min=1000000;
		for(i=0;i<n;i++) 
		{
			if(nn[i].dj<min && nn[i].dj!=0)
			{
				min=nn[i].dj;
				k=i;
			}
		}
		for(i=0;i<n;i++)
		{
			if(nn[i].dj==nn[k].dj)
			{
				if(nn[i].liang>nn[k].liang)
					k=i;
			}
		} 
		printf("%s\n",nn[k].pp);
	}
	return 0;
}

拾肆1789

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;

struct Node {
	int day, cost;
} node[maxn];
int n;
int f[maxn];

int cmp(Node a, Node b) {
	return a.cost < b.cost;
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);		
		for (int i = 0; i < n; i++) {
			scanf("%d", &node[i].day);
			if (node[i].day > n)
				node[i].day = n;
		}
		int sum = 0;
		for (int i = 0; i < n; i++) {
			scanf("%d", &node[i].cost);
			sum += node[i].cost;
		}
		sort(node, node+n, cmp);
		memset(f, 0, sizeof(f));
		for (int i = n-1; i >= 0; i--) 
			for (int j = node[i].day; j >= 1; j--) 
				if (!f[j]) {
					f[j] = 1;
					sum -= node[i].cost;
					break;
				}
		printf("%d\n", sum);
	}
	return 0;
}

拾伍 1792

#include<stdio.h>
/*
题目就是给了两个互质的数A,B。
A*x+B*y(x>=0,y>=0)
问最大不能表示的数,和不能表示的数的个数。

数论知识;
个数就是  --->>(A-1)*(B-1)/2;
最大不能表示的数就是  --->> A*B-A-B;
*/
int main()
{
	int i,j,k,l,n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		k=m*n-n-m;
		l=(n-1)*(m-1)/2;
		printf("%d %d\n",k,l);
	}
}

拾陆 1108

#include<stdio.h>
int main()
{
	int i,j,k,l,n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(k=1;;k++)
		{
			if(k%n==0 && k%m==0)//简单找就过了
			break;
		}
		printf("%d\n",k);
	}
}

拾柒 2111

#include<stdio.h>
struct bag
{
    int pi;
    int mi;
}a[1005],t;
void sort(int n)//danjia 
{
	int i,j;
	for(i=0;i<n;i++)
	for(j=i+1;j<n;j++)
	{
		if(a[i].pi<a[j].pi)
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}
}
int main()
{
   int n,m,i,j,count;
   while(~scanf("%d",&n)&&n)
   {
       scanf("%d",&m);
       count=0;
       for(i=0;i<m;i++)
       scanf("%d %d",&a[i].pi,&a[i].mi);
       sort(m);
       for(i=0;i<m;i++)
       {
           if(n>a[i].mi)
           {
               count+=a[i].mi*a[i].pi;
               n-=a[i].mi;
           }
else
           {
               count+=a[i].pi*n;
               break;
           }
       }
       printf("%d\n",count);
   }
   return 0;
}

拾捌 2044

#include<stdio.h>
int main(void)
{
	long long i,j,k,l,n,m;
	long long a[51]={1,1};
	for(i=2;i<=50;i++)
	{
		a[i]=a[i-1]+a[i-2];
	}
	while(scanf("%lld",&n)!=EOF)
	{
		while(n--)
		{
			scanf("%lld%lld",&m,&l);
			printf("%lld\n",a[l-m]);
		}
	}
} 

拾玖 2018

#include<stdio.h>
int main(void)
{
	long long i,j,k,l,n,m;
	long long a[57]={1,2,3};
	for(i=3;i<=56;i++)
	{
		a[i]=a[i-1]+a[i-3];
	}
	while(scanf("%lld",&n)&&n)
	{
		printf("%lld\n",a[n-1]);
	}
} 

贰拾 1176

解题思路:
首先对于gameboy来说他下一秒只能在 0~10 这十一个位置移动,而对于 1~9 这九个位置来说他可以移动(假设他现在的位置为x)到x+1,或者x-1,或者x;0和10这两个位置只有两个位置可以移动,可以用dp[t][x],t秒的馅饼获得就看t-1秒时的下一位置(x+1,x,x-1)因为要求整个过程的最大值,因此求的是dp累加的和
所以状态转移方程式为:
a[i][j]+=max(a[i+1][j-1],max(a[i+1][j],a[i+1][j+1]));
比如:
6
5 1
4 1
6 1
7 2
7 2
8 3
第一步:

0 1 2 3 4 5 6 7 8 9 10 11
三秒 0 0 0 0 0 0 0 1 0 0 0
二秒 0 0 0 0 0 0 2 0 0 0 0
一秒 0 0 0 1 1 1 0 0 0 0 0

第二步

0 1 2 3 4 5 6 7 8 9 10 11
三秒 0 0 0 0 0 0 0 1max 0 0 0
二秒 0 0 0 0 0 0 (2+1)max 0+1 0+1 0 0
一秒 0 0 0 0+1 0+1 1+(2+1) 0+2+1 0+2+1 0+0+1 0+0+1 0

c代码如下:

#include<stdio.h>
#include<string.h>
#include<math.h>
typedef long long ll;
ll a[100010][15];
ll max(ll x,ll y)
{
	return (x > y ? x : y);
}
int main(void)
{
	ll i,j,k,l,n,m,weizhi,time;
	while(scanf("%lld",&n)&&n)
	{
		ll tmax=0; 
		memset(a,0,sizeof(a));//初始化 
		for(i=0;i<n;i++)//遍历 
		{
			scanf("%lld %lld",&weizhi,&time);
			a[time][weizhi+1]++; //time,weizhi,a[time][weihzi]-分别记录饼掉落时间,位置,个数 位置+1是为避免0-1不存在
			tmax=max(tmax,time);//记录最后落下时间 
		}
		for(i=tmax-1;i>=0;i--)//每个时间 
		{
			for(j=12;j>=0;j--)/
			{
				a[i][j] += max(a[i+1][j-1],max(a[i+1][j],a[i+1][j+1]));
			}
		}
		printf("%lld\n",a[0][6]);
	}
	return 0;
} 

贰拾壹 2034

#include<stdio.h>
#include<string.h>
#include<limits.h>
typedef long long ll;
void sort(ll a[],ll n)
{
	ll i,j,t;
	for(i=0;i<n;i++)
	for(j=i+1;j<n;j++)
	{
		if(a[i]>a[j])
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}
}
int main()
{
	ll i,j,k,l,n,m;
	while(scanf("%lld%lld",&n,&m),m||n)
	{
		ll a[110],b[110],c[110];
		for(i=0;i<n;i++)//遍历第一个 
		scanf("%lld",&a[i]);
		for(i=0;i<m;i++)//遍历第二个 
		scanf("%lld",&b[i]);
		for(i=0,k=0,l=0;i<n;i++)//处理 
		{
			for(j=0;j<m;j++)
			{
				if(a[i]==b[j])
				break;
			}
			if(j==m)
			{
				c[k]=a[i];
				k++;
				l=1;//说明c数组有元素 
			}
		}
		if(l==1)
		{
			sort(c,k); 
			for(i=0;i<k;i++)
			printf("%lld ",c[i]);
			printf("\n");
		}
		else if(l==0)
		{
			printf("NULL\n");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44009311/article/details/86751444