一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
找出这两个数字。
#include<stdio.h>
#include<windows.h>
#include<assert.h>
/*用0依次和数组中的每个元素进行异或,出现两次的数字通过异或会相互抵消,最后剩下的就是只出现一次的数字。剩下的两个数不相等,异或的话至少有一位是为1的,二进制对应位也不相同。
1.得到0与数组中各元素依次异或的结果;
2.找到依次异或后的结果中为1的位置并标记,根据标记位是否为1进行分组;
2.将原数组分为两组,每组都含有一个只出现一次的数字,然后进行数组元素依次异或, 剩下的即为出现一次的数字。*/
void find_single_nums(int a[], int size)
{
assert(a);
int num1 = 0;
int num2 = 0;
int i = 0;
int num = 0;
int flag = 0;
for (i = 0;i < size;i++)
{
num ^= a[i];
}
for (i = 0;i < size;i++)
{
if (((num >> i) & 1) != 1)
{
flag++;
}
else
{
break;
}
}
for (i = 0; i < size; i++)
{
if (((a[i] >> flag) & 1) != 1)
{
num1 ^= a[i];
}
else
{
num2=num^(num1);
}
}
printf("%d %d", num1, num2);
}
int main()
{
int a[] = { 1,2,3,4,5,1,2,3 };
int size = sizeof(a) / sizeof(a[0]);
find_single_nums(a, size);
system("pause");
return 0;
}
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。编程实现。
#include<stdio.h>
#include<windows.h>
#include<assert.h>
//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。编程实现。
int count_juice(int n)
{
int bottle= n;
int sum = n;
while (bottle>= 2)
{
sum +=bottle/2 ;
bottle = bottle / 2 + bottle % 2;
}
printf("%d", sum);
return 0;
}
int main()
{
count_juice(20);
system("pause");
return 0;
}
模拟strcpy
#include<stdio.h>
#include<windows.h>
#include<assert.h>
char* my_strcpy(const char* p, char* p1)
{
char* p2 = p1;
assert(p);
assert(p1);
while (*p != '\0')
{
*p1++ = *p++;
}
*p1 = *p;
return p2;
}
int main()
{
const char* p = "hello123";
char p1[64] = { 0 };
my_strcpy(p, p1);
system("pause");
return 0;
}
模拟strcat
#include<stdio.h>
#include<windows.h>
#include<assert.h>
char* my_strcat( char* p, char* p1)
{
assert(p);
assert(p1);
char* p2 = p;
while (*p != '\0')
{
p++;
}
while (*p1 != '\0')
{
*p++ = *p1++;
}
*p = *p1;
return p2;
}
int main()
{
char p[64] = "hello";
char* p1 = "world";
my_strcat(p, p1);
system("pause");
return 0;
}