C语言基础编程题(一)

创作不易,切勿白嫖,多多点赞支持!,如有疑问欢迎评论区讨论

一、冒泡排序
        1. 从当前元素起,向后依次比较每一对相邻元素,若逆序则交换
        2. 对所有元素均重复以上步骤,直至最后一个元素

void arr1(int arr[], int sz)
{
    int teep = 0;
    int i, j;//i为循环趟数,j为内部循环次数
    for (i = 0; i < sz-1; i++)
    {
        for (j = 0; j < sz-1-i; j++)
        {
            if (arr[j] < arr[j + 1])
            {
                teep = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = teep;
            }
        }
    }
}
int main() 
{
    int arr[10] = { -1,2,0,-3,5,9,6,8,-4,10 };
    int i;
    int sz = sizeof(arr) / sizeof(arr[0]);//元素个数
    arr1(arr, sz);//冒泡排序法函数
    for (i = 0; i < sz; i++)
        printf("%d\t", arr[i]);
    return 0;
}

样题输出:10      9       8       6       5       2       0       -1      -3      -4

二 、创建一个整形数组,完成对数组的操作
        1、实现函数Iint(),初始化数组全部为0
        2、实现Print(),模拟打印数组中的元素
        3、实现reverse()函数,完成数组元素的逆置(数组中的内容倒过来)

void Iint(int arr[], int sz)
{
	int i;
	for (i = 0; i < sz; i++)
	{
		arr[i] = 0;
	}

}
void Print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void Reverse(int arr[], int sz)//逆序函数
{
	int i;
	int temp = 0;
	for (i = 0; i < sz; i++)
	{
		temp = arr[sz - 1];
		arr[sz - 1] = arr[i];
		arr[i] = temp;
		sz--;
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,8,9,7,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//模拟打印函数
	//初始化前
	Print(arr, sz);
	//Iint(arr,sz);//对数组初始化全零
	//初始化后
	//Print(arr, sz);
	Reverse(arr, sz);
	Print(arr, sz);
	return 0;
}

样题输出:

未逆序前:1 2 3 4 5 6 8 9 7 10

逆序之后:10 7 9 8 6 5 4 3 2 1

注:Iint函数已经注释 (想操作,去掉注释即可)

三、将数组a中的内容和数组b中的内容交换

        1、数组一样大

int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 5,4,3,2,1 };
	int arr3 = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	int i,j;
	for (i = 0; i < sz; i++)
	{
		arr3 = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = arr3;
	}
	return 0;
}

四、统计二进制中1的个数

        此题列举了多种解法!

解法一:

int Sum(unsigned int a)//传过来的数改为无符号数,符号位无效
{
	int count = 0;
	while (a)
	{
		if (a % 2 == 1)
		{
			count++;
		}
		a = a / 2;
	}
	return count;
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	//写一个函数,求a的二进制(补码)表示中1的个数
	int count=Sum(a);
	printf("%d\n", count);
	system("pause");//system库函数—执行系统命令pause(暂停)
	return 0;
}

解法二:

int Sum(int a)
{
	int count = 0;
	int i;
	for (i = 0; i<32; i++)
	{
		if (((a >> i) & 1) == 1)
		{
			count++;
		}
	}
	return count;
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	//写一个函数,求a的二进制(补码)表示中1的个数
	int count=Sum(a);
	printf("%d\n", count);
	system("pause");//system库函数—执行系统命令pause(暂停)
	return 0;
}

解法三:

int Sum(int a)
{
	int count = 0;
	//13 1101 a 
	//12 1100 a-1
	//1100 a
	//1011 a-1
	//1000 a
	//0111 a-1
	//0000
	while (a)
	{
		a = a & (a - 1);
		count++;
	}
	return count;
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	//写一个函数,求a的二进制(补码)表示中1的个数
	int count=Sum(a);
	printf("%d\n", count);
	system("pause");//system库函数—执行系统命令pause(暂停)
	return 0;
}

五、求两个二进制中不同位的个数

解法一:

int main()
{
	int count = 0;
	int a = 5;
	int b = 9;
	int i;
	for (i = 0; i < 32; i++)
	{
		a = a >> i;
		b = b >> i;
		if (a!=b)
		{
			count++;
		}
	}
	printf("%d\n", count);
	return 0;
}

解法二:

int Sum(int a)
{
	int count = 0;
	while (a)
	{
		a = a & (a - 1);
		count++;
	}
	return count;
}
int Get_diff_bit(int m, int n)
{
	int tmp = m ^ n;//按位异或相同为0,相异为1
	return Sum(tmp);
}
int main()
{
	int count = 0;
	int m = 0;
	int n = 0;
	scanf("%d%d", &m, &n);
	count=Get_diff_bit(m, n);//创建一个函数实现计算两个二进制中有多少个不同的个数
	printf("%d\n", count);
	return 0;
}

以上代码均在vs2022环境下编译

猜你喜欢

转载自blog.csdn.net/qq_72935001/article/details/126311752