【题述】
Description
给定一个整数集合s,集合中有n个元素,我有m次询问,对于每次询问给定一个整数x,若 x存在于集合s中输出x found at y,y为集合s按从小到大排序后第一次出现x的下标,否则输出x not found.
Input
多组测试数据,每组第一行为两个正整数n,m.(1<=n,m<=1000)代表集合中元素的个数和查询次数,接下来n行每行有一个正整数代表集合里的元素.(每个整数的大小小于等于100000),接下来 m行每行有一个正整数代表查询的元素.
Output
详见sample output
Sample Input
4 1 2 3 5 1 5 5 2 1 3 3 3 1 2 3
Sample Output
CASE# 1:
5 found at 4
CASE# 2:
2 not found
3 found at 3
【9.6更新代码】
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
int a[1005];
int main(){
int n,m,k,tmp = 1;
while(scanf("%d%d",&n,&m) != EOF)
{
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
sort(a + 1,a + n + 1);
printf("CASE# %d:\n",tmp ++);
for(int j = 1 ; j <= m;j++)
{
scanf("%d",&k);
int flag = 0 ;
for(int i = 1;i <= n;i++)
{
if(a[i] == k)
{
printf("%d found at %d\n",k,i);
flag = 1;
break;
}
}
if(!flag)
printf("%d not found\n",k);
}
}
return 0;
}
【我的代码(通过代码)】
#include <stdio.h>
#include <string.h>
void sort(int arr[], int len) { //从小到大排序
int i, j;
for (i = 0; i < len - 1; i++) //外层循环控制趟数,总趟数为len-1
for (j = 0; j < len - 1 - i; j++) //内层循环为当前i趟数 所需要比较的次数
if (arr[j] > arr[j + 1]){
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
int main(){
int n,m,i,j,t,count;
t=1;
while(scanf("%d%d",&n,&m)!=EOF){
int a[n],b[m];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,n);
for(j=0;j<m;j++){
scanf("%d",&b[j]);
}
printf("CASE# %d:\n",t);
for(j=0;j<m;j++){
count=0;//注意⚠️count=0的位置
for(i=0;i<n;i++){
if(b[j]==a[I]){
printf("%d found at %d\n",b[j],i+1);
break;//要返回第一次匹配的下标,所以这里要及时break;
}
else{
count++;
if(count==n){//这里判定有没有找到这个数
printf("%d not found\n",b[j]);
break;
}
}
}
}
t++;
}
return 0;
}