1.题目
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。
2.程序代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
int find_num(int arr1[9])
{
int i = 0;
int j = 0;
int arr2[9] = {0};//定义一个数组,来与原数组比较
for (i = 0; i < 9; i++)
{
arr2[i] = arr1[i];//把原数组的值赋给新数组
for (j = 0; j < 9; j++)
{
if ((arr1[i] == arr1[j])&&(i != j))//对比当前数组的某个元素与其他元素
{
arr2[i]++;//如果有相同的,就给新数组加一
}
}
}
for (i = 0; i < 9; i++)
{
if (arr1[i] == arr2[i])//只有原数组中没有对应相同的数字,新数组中的该元素才与原数组相同
{
return arr1[i];
}
}
}
int main()
{
int arr[9] = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
int ret = 0;
ret = find_num(arr);
printf("只出现一次的数字为:%d\n", ret);
system("pause");
return 0;
}
//简便写法,使用位运算
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
int find_num(int arr[9])
{
int i = 0;
int count = arr[0];
for (i = 1; i < 9; i++)
{
count = count ^ arr[i];//把数组中所有元素都按位与,相等的两个数按位与为0,
//所以最后只剩下没有成对的数字
}
return count;
}
int main()
{
int arr[9] = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
printf("只出现一次的数字为:%d\n", find_num(arr));
system("pause");
return 0;
}