成功的先决条件是“信心”。
文章目录
🍄1.冒泡排序
💒1.1 题目描述
🌟1.2 思路
有n个数据就要比较n-1趟,第一趟比较的次数为n-1-1,以后每趟的比较次数依次减1(因为每次都把最大的数据沉到最后),且如果有一趟的比较时没有发生交换,就表明数据已经有序,此时就跳出循环。
🌻1.3代码演示
#include <stdio.h>
void BubbleSort(int* a, int size)
{
for (int i = 0; i < size - 1; ++i)
{
int exchange = 0;
for (int j = 1; j < size - i; ++j)
{
if (a[j - 1] > a[j])
{
int temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
exchange = 1;
}
}
if (exchange == 0)
break;
}
}
int main()
{
int arr[10] = { 9,8,5,7,6,4,3,2,0,1 };
int size = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, size);
for (int i = 0; i < size; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
🍅2.数组操作
💒2.1题目描述
🌟2.2思路
函数比较简单,逆序就用两个下标分别指向头和尾,交换数据然后往中间走,结束条件是head>=rear
.
🌻2.3代码演示
#include <stdio.h>
void Init(int* a, int sz, int x)
{
for (int i = 0; i < sz; ++i)
{
a[i] = x;
}
}
void Print(int* a, int sz)
{
for (int i = 0; i < sz; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
}
void Reverse(int* a, int sz)
{
int head = 0;
int rear = sz - 1;
while (head < rear)
{
int tmp = a[head];
a[head] = a[rear];
a[rear] = tmp;
++head;
--rear;
}
}
#include <stdio.h>
int main()
{
int arr1[10] = { 9,9,9,9,9,9,9,9,9,9 };
int size1 = sizeof(arr1) / sizeof(arr1[0]);
Init(arr1, size1,0);
Print(arr1, size1);
int arr2[10] = { 0,1,2,3,4,5,6,7,8,9 };
int size2 = sizeof(arr2) / sizeof(arr2[0]);
Reverse(arr2, size2);
Print(arr2, size2);
return 0;
}
🍆3.交换数组
💒3.1 题目描述
🌟3.2 思路
题目比较简单,两个数组从0下标依次交换即可
🌻3.3 代码演示
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Print(int* a, int sz)
{
for (int i = 0; i < sz; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int arr1[10] = { 0 };
int arr2[10] = { 0 };
int i = 0;
printf("请输入10个数字:>");
for (i = 0; i < 10; i++)
{
scanf("%d", &arr1[i]);
}
printf("请输入10个数字:>");
for (i = 0; i < 10; i++)
{
scanf("%d", &arr2[i]);
}
Print(arr1, 10);
Print(arr2, 10);
//交换
for (i = 0; i < 10; i++)
{
int tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
}
Print(arr1, 10);
Print(arr2, 10);
return 0;
}
🍇4.求两个数二进制中不同位的个数
💒4.1题目描述
🌟4.2思路
- 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
- 统计异或完成后结果的二进制比特位中有多少个1即可
关于tmp = tmp&(tmp-1);
这句代码,它可以把tmp二进制序列中最右边的1去掉
🌻4.3代码演示
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int calc_diff_bit(int m, int n)
{
int tmp = m ^ n;
int count = 0;
while (tmp)
{
tmp = tmp & (tmp - 1);
count++;
}
return count;
}
int main()
{
int m, n;
while (scanf("%d %d", &m, &n) == 2)
{
printf("%d\n", calc_diff_bit(m, n));
}
return 0;
}
🍈5.打印整数二进制的奇数位和偶数位
💒5.1 题目描述
🌟5.2 思路
- 提取所有的奇数位,如果该位是1,输出1,是0则输出0
- 以同样的方式提取偶数位置
检测num中某一位是0还是1的方式:
- 将num向右移动i位
- 将移完位之后的结果与1按位与,如果:
结果是0,则第i个比特位是0
结果是非0,则第i个比特位是1
🌻5.3 代码演示
#include <stdio.h>
void Printbit(int num)
{
//统计偶数位
for (int i = 31; i >= 1; i -= 2)
{
printf("%d ", (num >> i) & 1);
}
printf("\n");
//统计奇数位
for (int i = 30; i >= 0; i -= 2)
{
printf("%d ", (num >> i) & 1);
}
printf("\n");
}
int main()
{
Printbit(8);
return 0;
}
🌺6.统计二进制中1的个数
💒6.1 题目描述
🌟6.2 思路
与4.2中tmp = tmp&(tmp-1);
思路相同
🌻6.3 演示代码
#include <stdio.h>
int count_one_bit(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
printf("%d\n", count_one_bit(15));
}
🍍7.交换两个变量(不创建临时变量)
💒7.1题目描述
🌟7.2思路
用按位或进行操作,a^a=0; a^0=a;
🌻7.3代码演示
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("交换前:a = %d b = %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a = %d b = %d\n", a, b);
return 0;
}
🍊8.计算求和
💒8.1题目描述
🌟8.2思路
通过观察可以发现,该表达式的第i项中有i个a数字,因此:
假设第i项为temp,则第i+1项为temp*10+a
🌻8.3代码演示
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int n = 0;
int i = 0;
int sum = 0;
int tmp = 0;
scanf("%d%d", &a, &n);
for (i = 0; i < n; i++)
{
tmp = tmp * 10 + a;
sum += tmp;
}
printf("%d\n", sum);
return 0;
}
🍉9.打印水仙花数
💒9.1题目描述
🌟9.2思路
此题的关键在于只要知道判断一个数据是否为水仙花数的方式,问题就迎刃而解。假定给定一个数据data,具体检测方式如下:
- 求取data是几位数
- 获取data中每个位置上的数据,并对其进行n次方求和
- 对data中每个位上的数据n次方求和完成后,在检测其结果是否与data相等即可,
相等:则为水仙花数
否则:不是
🌻9.3代码演示
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
for (i = 0; i <= 999999; i++)
{
int count = 1;
int tmp = i;
int sum = 0;
//判断i是否为水仙花数
//1. 求判断数字的位数
while (tmp / 10)
{
count++;
tmp = tmp / 10;
}
//2. 计算每一位的次方和
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, count);
tmp = tmp / 10;
}
//3. 判断
if (sum == i)
printf("%d ", i);
}
return 0;
}
🍀10.打印菱形
💒10.1 题目描述
🌟10.2 思路
仔细观察图形,可以发现,此图形中是由空格和星号按照不同个数的输出组成的。
上三角:先输出空格,后输出星号,每行中
空格:从上往下,一行减少一个
星号:2*i+1的方式递增
下三角:先输出空格,后输出星号,每行中
空格:从上往下,每行多一个空格
星号: 从上往下,按照2*(line-1-i)-1的方式减少,其中:line表示总共有多少行
按照上述方式,将上三角和下三角中的空格和*分别输出即可。
🌻10.3代码演示
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int line = 0;
int i = 0;
scanf("%d", &line);//7
//打印上半部分
for (i = 0; i < line; i++)
{
//打印一行
//打印空格
int j = 0;
for (j = 0; j < line - 1 - i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
//打印下半部分
for (i = 0; i < line - 1; i++)
{
//打印一行
int j = 0;
for (j = 0; j <= i; j++)
{
printf(" ");
}
for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}