C语言习题——数组指针
1、用转移表实现微型计算器
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
do
{
printf("*************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf(" 0:exit \n");
printf("*************************\n");
printf("请选择:");
scanf("%d", &input);
if ((input <= 4 && input >= 1))
{
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = p[input](x, y);
printf("ret = %d\n", ret);
}
else if (input == 0)
{
printf("退出计算器\n");
}
else
{
printf("输入有误\n");
}
} while (input);
return 0;
}
2、找单身狗2
思路:
找出一个只出现过一次的数字的问题处理方法就是找一个数字把里面所有的数字都异或一遍,利用异或两次等于没异或的特点来处理。那么如果有两个数字都只出现了一次,那么如此得到的应该是两个数异或的结果。首先这个结果肯定不是0(要不然就全都配对了),所以里面一定至少一位是一。找出值为1的一位,以这一位的值将结果分为两组。例如1 2 3 4 1 2,异或完的结果应该是3^4得到的111,那么随便找一位就行了。例如找最低位,那么这一位是1的有1 3 1,是0的有2 4 2,由于是利用异或结果为1的某一位分的组,所以两个待查询数字一定分别在两组中。所以再找两个变量,分别异或两组数,即可找到这两个数。
#include <stdio.h>
void find_single_dog(int arr[], int sz, int* pd1, int* pd2)
{
int ret = 0;
for (int i = 0; i < sz; i++)
ret ^= arr[i];
int pos = 0;
for (int i = 0; i < 32; i++)
if (((ret >> i) & 1) == 1)
{
pos = i;
break;
}
for(int i = 0; i < sz; i++)
if (((arr[i] >> pos) & 1) == 1)
{
*pd1 ^= arr[i];
}
*pd2 = ret ^ *pd1;
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
int dog1 = 0, dog2 = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
find_single_dog(arr, sz, &dog1, &dog2);
printf("%d %d", dog1, dog2);
return 0;
}