大家好,今天我们来详细的总结一下最近这段时间的习题。
习题一
#include<stdio.h>
int main()
{
char arr[13] = { 0 };
int N = 0;
scanf("%d", &N);
int k = 0;
int i = 0;
while (N)
{
if (k != 0 && k % 3 == 0)
arr[i++] = ',';
arr[i++] = N % 10 + '0';
N /= 10;
k++;
}
for (i--; i >= 0; i--)
printf("%c", arr[i]);
return 0;
}
详解:我们这里想要插入什么首先就要想到数组,这是我们可以想到最简单的东西了,首先题目中要求一行输入一个整数,我们就可以最简单的定义一个变量然后从键盘输入就行了,我们在定义一个字符数组,将每一位数字都放进数组当中,我们要将它一个一个放入字符数组中就得使用循环,我们对10取余就得到末位数字,将它放入数组中,我们要注意数组中存放的是字符,所以我们减去一个字符0就是字符型了,让偶就对N除以10去掉末位,k进行计数,到了三位数就插入一个逗号,我们可以对3取余,如果等于0就插入逗号,但是我们得记得不能等于0,不然第一个数组就等于0,最后在k++,我们因为是i++,我们这里的i是要比存入数组的下标大1,所以在循环打印的时候我们就得用i–输出。
习题二
#include<stdio.h>
int is_exit(char ch, char arr[])
{
int i = 0;
while (arr[i])
{
if (ch == arr[i])
return 1;
i++;
}
return 0;
}
int main()
{
char arr1[100] = { 0 };
char arr2[100] = { 0 };
gets(arr1);
gets(arr2);
int i = 0;
while (arr1[i])
{
if (is_exit(arr1[i], arr2) == 0)
{
printf("%c", arr1[i]);
}
i++;
}
return 0;
}
思路:从一个字符串删除另外一个字符串的字符,我们就利用遍历,两个相同的字符串就不输出,不相同的字符串就输出。
我们定义两个数组,题目的要求是输入字符串,我们就得用gets输入,如果我们用scanf的话就得用getchar()去消除回车键,后面我们利用循环,如果我们arr1里面的字符和arr2的一样就不打印,不一样就打印,所以我们定义的函数必须要有遍历这一功能,同样是利用循环完成。
习题三
思路:杨氏矩阵我们是从其中找到一个数,而这个矩阵是每行从左到右都是递增的,从上到下都是递增的,我们的思路是可以给它看成一个二维数组,首先让这个数和这个二维数组第一行最后一个相比,如果大于这个数就行加1,如果小于这个数就列减1。如下图所示:
int Find(int arr[3][3], int *px, int *py, int k)
{
int x = 0;
int y = *py - 1;
while (x <= *px - 1 && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
*px = x;
*py = y;
return 1;
}
}
*px = -1;
*py = -1;
return 0;
}
int main()
{
int arr[3][3] = { 1,2,3, 4,5,6, 7,8,9 };
int k = 0;
int x = 3;
int y = 3;
scanf("%d", &k);//7
int ret = Find(arr, &x, &y, k);//存在返回1,如果不存在返回0
if (ret == 1)
{
printf("Yes\n");
printf("%d %d\n", x, y);
}
else
{
printf("No\n");
printf("%d %d\n", x, y);
}
return 0;
}
习题四
思路:这里我们可以利用暴力求解的方法一个一个的去遍历,这样的话时间复杂度就会很高,所以我们利用另外一种方法^操作符,它的原则是相同为0,不同为1,而且它是满足交换律的。
int find_single_dog(int arr[], int sz)
{
int ret = 0;
int i = 0;
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,5,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = find_single_dog(arr, sz);
printf("%d\n", ret);
return 0;
}
我们将我们的数组和数字个数传过去,我们在函数中全部异或起来,出现两次的数字就会为0,而0与任何一个数异或起来都是这个数字本身,所以只出现一次的数字与其他数字全部异或起来的结果就是这个数字了。
习题五
思路:我们同样是利用^操作符进行求解。
void find_single_dog2(int arr[], int sz, int*ps1, int*ps2)
{
int r = 0;
int i = 0;
//1. 异或在一起
for (i = 0; i < sz; i++)
{
r ^= arr[i];
}
//2. 计算r的第几位是1,得到i
int pos = 0;
for (i = 0; i < 32; i++)
{
if (((r >> i) & 1) == 1)
{
pos = i;
break;
}
}
//3. 分组
int s1 = 0;
int s2 = 0;
for (i = 0; i < sz; i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
(*ps1) ^= arr[i];
}
else
{
(*ps2) ^= arr[i];
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,6};
int sz = sizeof(arr) / sizeof(arr[0]);
int s1 = 0;
int s2 = 0;
find_single_dog2(arr, sz, &s1, &s2);
printf("s1 = %d s2 = %d\n", s1, s2);
return 0;
}
这里就小伙伴们自行完成啦,逻辑和原理和上一题是一样的。
经过这一段时间的C语言学习让我感触最深的是这是一门对逻辑能力要求很高的语言,想要真正的去学好熟练地掌握这一门语言,我们需要花费大量的时间去整理,去整理自己的思路,整理自己的做题方法,积累自己的经验。未来道阻且长,让我们继续努力向前吧,加油,小伙伴们!