一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个数字,编程实现
思路:先排序,因为其他数都是成对出现的,所以当某个数的前面和后面都和这个数不相等时,这个数就是单独出现的
#include<stdio.h>
/*
> 1. 一个数组中只有两个数字是出现一次,
> 其他所有数字都出现了两次。
> 找出这两个数字,编程实现。 */
void find(int arr[10],int size)
{
int i = 0;
int res = 0;
int flag = 0;
int a = 0;
int b = 0;
for (i = 0; i < size; i++)
{
res ^= arr[i];
}
//找不同的bit位
for (i = 0; i < 32; i++)
{
if ((res & 1) == 1)
{
break;
}
res >>= 1;
flag++;
}
//按比特位不同将arr分组,同时,整体给两个数组异或,得到两个数
for (i = 0; i < size; i++)
{
if (((arr[i] >> flag) & 1) == 1)
a ^= arr[i];
else
b ^= arr[i];
}
printf("%d %d\n", a, b);
}
int main()
{
int arr[] = { 9,0,1,2,3,2,5,6,6,1,0 };
int num = sizeof(arr) / sizeof(arr[0]);
find(arr,num);
return 0;
}
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,
给20元,可以买多少汽水
思路:当手里只剩下一个空瓶或者没空瓶则购买结束
#include<stdio.h>
/*> 2. 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,
> 给20元,可以买多少汽水。*/
int main()
{
int num = 0, money = 20, count = 0;//汽水数,钱,空瓶数
num = count = money;
while (count>1)
{
num += count / 2;
if (count & 1)
{
count = count / 2 + 1;
}
else
{
count /= 2;
}
}
printf("%d", num);
return 0;
}