时间限制:2000ms
单点时限:1000ms
内存限制:256MB
一个整型数组里除了两个数字(互不相同)之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
第一行:数组的长度N(1
只出现了1次的那两个数,小的在前大的在后,空格隔开
样例输入
10 5 5 6 7 9 9 7 3 3 2
样例输出
2 6
思路:
(1)对于出现两次的元素,使用“异或”操作后结果肯定为0,那么我们就可以遍历一遍数组,对所有元素使用异或操作,那么得到的结果就是两个出现一次的元素的异或结果。
(2)因为这两个元素不相等,所以异或的结果肯定不是0,也就是可以再异或的结果中找到1位不为0的位,例如异或结果的最后一位不为0。
(3)这样我们就可以最后一位将原数组元素分为两组,一组该位全为1,另一组该位全为0。
(4)再次遍历原数组,最后一位为0的一起异或,最后一位为1的一起异或,两组异或的结果分别对应着两个结果。
/* Exam07_TwoSingleNumbers*/
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX 100000
int arr[MAX];
int main() {
int N;
cin >> N;
int i, res = 0;
for(i=0; i> arr[i];
res = (res^arr[i]);
}
/*找到异或结果中最低的1的那一位,用flag标记*/
int flag;
for(i=0; i<32; i++){
if( res & (1<
时间限制:2000ms
单点时限:1000ms
内存限制:256MB
给定两个整数A和B,需要改变几个二进制位才能将A转为B。
1行:A和B,空格隔开
需要改变的位数
样例输入
10 8
样例输出
1
这个非常简单,用1移位后再依次比较两个数的每一位即可。
/* Exam08_ChangeBit */
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX 100000
int arr[MAX];
int main() {
int A,B;
cin >> A >> B;
int i,res = 0;
for(i=0; i<32; i++){
if( ( (1<
时间限制:1000ms
单点时限:1000ms
内存限制:256MB
地产大亨Q先生临终的遗愿是:拿出100万元给X社区的居民抽奖,以稍慰藉心中愧疚。
麻烦的是,他有个很奇怪的要求:
1. 100万元必须被正好分成若干份(不能剩余)。每份必须是7的若干次方元。比如:1元, 7元,49元,343元,...
2. 相同金额的份数不能超过5份。
3. 在满足上述要求的情况下,分成的份数越多越好!
请你帮忙计算一下,最多可以分为多少份?
固定输入:1000000
最多可以分为多少份
样例输入
1000000
样例输出
无
/* Exam09_StrangeDonate */
#include
#include
#include
#include
#include
#include
using namespace std;
#define MON 1000000
string intToA(int n,int radix) //n是待转数字,radix是指定的进制
{
string ans="";
do{
int t=n%radix;
if(t>=0&&t<=9) ans+=t+'0';
else ans+=t-10+'a';
n/=radix;
}while(n!=0); //使用do{}while()以防止输入为0的情况
//reverse(ans.begin(),ans.end());
return ans;
}
int main() {
string str;
str = intToA(MON,7);
int res = 0;
for(int i=0; i