孤单数

本文介绍了一种寻找数组中唯一孤单数的方法。通过排序和位异或两种方式实现,适用于2n+1个数中寻找唯一不成对的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

有2n+1个数,其中有n对数字是成双出现的,有且仅有1个数字只有它自己一个。请你找出这个孤单数。


输入描述

第一行有且只有一个正整数n(n<=500000)

第二行有2n+1个数ai(-10^9<=ai<=10^9)


输出描述

有且只有一个数,输出这个孤单数。


样本输入:

3
6 2 6 3 7 7 3


样本输出:

3



在看到题目的时候,个人对这个题的解决方法分为以下两种:

1.排序

现将所需要排序的数字存到一个数组,然后利用stdlib.h内的qsort函数将数组内数字进行排序,其次,对排序后的数组进行查找。又因为每两个相邻的数字相等的概率很大,所以在思考后优化进行,将索引由每次循环+1改为每次循环+2。当出现第n个与第n+1个不相等时,输出第n个。

2.位异或解决

首先请了解位运算符的概念,并且将其熟悉掌握。在这里只需要用到异或^运算符就可以轻松解决。

C代码如下:

#include <stdio.h>


int main()
{
int m, i, t, k;
scanf("%d%d", &m, &t);
for(i = 1;i < 2*m+1;i++)
{
scanf("%d", &k);
t=t^k;
}
printf("%d\n", t);
return 0;

# B4046 [语言月赛 202410] 寻找质数 ## 题目描述 称一个数 $x$ 是**独数**,当且仅当 $x$ 是质数且 $x$ 除以 $m$ 的余数是 $r$。 给出正整数 $ n,m,r,k$,求 $1\sim n$ 内第 $k$ 大的独数。若不存在输出 $-1$。 例如,$3,5,11,7$ 这四个数中,从大到小排序时 $7$ 是第 $2$ 名,那么我们说 $7$ 是第二大的。 ## 输入格式 输入一行四个正整数 $n,m,r,k$,含义见题目描述。 ## 输出格式 输出一行一个整数表示 $1\sim n$ 内第 $k$ 大的独数,若不存在则输出 $-1$。 ## 输入输出样例 #1 ### 输入 #1 ``` 20 3 2 2 ``` ### 输出 #1 ``` 11 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 10000 6 4 1 ``` ### 输出 #2 ``` -1 ``` ## 输入输出样例 #3 ### 输入 #3 ``` 97 10 7 6 ``` ### 输出 #3 ``` 7 ``` ## 说明/提示 【样例 1 解释】 当 $m=3,r=2$ 时,一个数是独数当且仅当其是质数,并且除以 $3$ 的余数为 $2$。 $1\sim 20$ 的质数有 $2,3,5,7,11,13,17,19$,其中独数有 $2,5,11,17$。 要求 $1\sim 20$ 内第 $2$ 大的独数,根据上面列举出的结论,答案是 $11$。 【样例 2 解释】 除以 $6$ 余 $4$ 的数一定是偶数,并且不等于 $2$,所以一定不是质数。因此,此时不存在独数,也就不存在第 $1$ 大的独数。 【样例 3 解释】 $1\sim 97$ 内的独数从大到小排序依次为 $97,67,47,37,17,7$,其中第 $6$ 大的独数为 $7$。 【数据范围】 本题共 $10$ 个测试点,每个 $10$ 分。 对于测试点 $1,2$,保证 $m=n$。 对于测试点 $1\sim 5$,保证 $k=1$。 对于全部测试点,保证 $1\le k\le n\le 10000$,$1\le r<m\le n$。 #include <iostream> #include <cmath> #include <vector> #include <algorithm> using namespace std; bool isSushu(int x){ bool flag=1; for(int i=1;i<=sqrt(x);i++){ if(x%i==0&&i!=1){ flag=0; } } return flag; } bool compare(int a,int b){ return a>b; } int main() { int n,m,r,k; cin>>n>>m>>r>>k; vector<int> beixuan; for(int i=1;i<=n;i++){ if(isSushu(i)){ beixuan.push_back(i); } } vector<int> gudu; for(int i=0;i<beixuan.size();i++){ if(beixuan[i]%m==r){ gudu.push_back(beixuan[i]); } } sort(gudu.begin(),gudu.end(),compare); if(gudu.size()<k){ cout<<-1; } else{ cout<<gudu[k-1]; } } 为什么有一个测试用例无法通过,
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值