前言:
本篇博文学习笔记主要是对一些题目进行学习以及记录。在这些题目求解以及分析的过程中,扩宽了思维,收获良多!
例如:T6、T10、T11的处理方式令人意想不到以及非常巧妙,这也增强了作者对于C语言的学习更加深刻的理解!
T1.写一个函数打印arr数组的内容,不使用数组下标,使用指针。arr是一个整形一维数组。
#include <stdio.h> 方法1:形参为数组 //void print_arr(int arr[], int sz) //{ // int i = 0; // for (i = 0; i < sz; i++) // { // printf("%d ", arr[i]); // } //} 方法2:形参为指针 void print_arr(int *p, int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *p++); } } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]); //arr -- > 表示的是首元素的地址 //int* print_arr(arr, sz); return 0; }
编辑 T2.字符串逆置:
编辑
#include <stdio.h> #include <string.h> int main() { char arr[10000] = { 0 }; //输入 gets(arr); //逆序 int len = strlen(arr); char* left = arr; char* right = arr + len - 1; while (left<right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } //打印 printf("%s\n", arr); return 0; }
T3.求Sn = a + aa + aaa + aaaa + aaaaa的前5项之和,其中a是一个数字,
例如:2 + 22 + 222 + 2222 + 22222
#include <stdio.h> int main() { int a = 0; int n = 0; scanf("%d %d", &n, &a);// int sum = 0; int ret = 0; int i = 0; for (i = 0; i < n; i++) { ret = ret * 10 + a; sum += ret; } printf("%d\n", sum); return 0; }
编辑
T4. 打印水仙花数:
编辑
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,
如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。
#include<stdio.h> #include <math.h> int main() { int i = 0; for (i = 0; i <= 100000; i++) { //判断i是否为水仙花数 //i是n位数 int n = 1; int sum = 0; int tmp = i; while (tmp /= 10) { n++; } //求每一位的n次方之和 tmp = i; while (tmp) { sum += (int)pow(tmp % 10, n); tmp /= 10; } if (sum == i) { printf("%d ", i); } } return 0; }
T5.打印菱形:
编辑
打印菱形 #include<stdio.h> int main() { int line = 0; scanf("%d", &line); //上 int i = 0; 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; }
T6.喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
编辑
方法一: #include<stdio.h> int main() { int money = 0; int total = 0;//总共的瓶数 int empty = 0;//空瓶数 scanf("%d", &money);//20 if (money <= 0) total = 0; else total = money * 2 - 1; printf("%d\n", total); return 0; } 方法2: int main() { int money = 0; int total = 0;//总共的瓶数 int empty = 0;//空瓶数 scanf("%d", &money);//20 total += money; empty += money; //置换 while (empty >= 2) { total += empty / 2; empty = empty / 2 + empty % 2; } printf("%d\n", total); return 0; }
面试技巧:
若在面试时,可在面试官询问时,提出自己的一些想法用于活跃氛围(分场合)比如此题的扩展,可以提出像商店老板接一个空瓶,然后再归还!
T7.输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
编辑
编辑
编辑编辑
#include <stdio.h> void print(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } void move(int arr[], int sz) { int* left = arr; int* right = arr + sz - 1; while (left<right) { //从左向右找一个偶数,停下来 while ((left<right) && (*left)%2==1) { left++; } //从右向左找一个奇数,停下来 while ((left < right) && (*right) % 2 == 0) { right--; } //奇数和偶数交换 if (left<right) { int tmp = *left; *left = *right; *right = tmp; } } } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; //int arr[] = { 1,3,5,7,9 }; int sz = sizeof(arr) / sizeof(arr[0]); print(arr, sz); move(arr, sz); print(arr, sz); return 0; }
T8.编辑
编辑
打印此结果的原因是因为char只占用一个字节,且a,b,c均为无符号char型,在截断之后进行运算,再按照%d格式打印,会发生整型提升,但第一种形式的打印是运算后直接打印,第二形式的打印是存放在c中(先截断再整型提升导致原有数据丢失),因此打印结果不一样!
int main() { unsigned char a = 200; unsigned char b = 100; unsigned char c = 0; c = a + b; printf("%d %d", a + b, c); return 0; }
CPU为了保证其计算精度,一般按照整型或者缺省整型的方式进行计算!因此不是先以原有类型进行计算再按照打印格式进行整型提升或者截断 !
T9.杨辉三角:
形式1:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
形式2:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
编辑
int main() { int arr[10][10] = { 0 }; int i = 0; int j = 0; for (i = 0; i < 10; i++) { for (j = 0; j <= i; j++) { if (j == 0) arr[i][j] = 1; if (i == j) arr[i][j] = 1; if (i >= 2 && j >= 1) arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
T10.猜凶手
题目内容:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
编辑
int main() { int killer = 0; for (killer = 'a'; killer <= 'd'; killer++) { //1/0 1/0 1/0 1/0 if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3) { printf("%c\n", killer); } } return 0; }
T11. 跳水问题:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
编辑
编辑
int main() { int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; for (a = 1; a <= 5; a++) { for (b = 1; b <= 5; b++) { for (c = 1; c <= 5; c++) { for (d = 1; d <= 5; d++) { for (e = 1; e <= 5; e++) { if (((b == 2) + (a == 3) == 1) && ((b == 2) + (e == 4) == 1) && ((c == 1) + (d == 2) == 1) && ((c == 5) + (d == 3) == 1) && ((e == 4) + (a == 1) == 1) ) { if (a * b * c * d * e == 120) printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e); } } } } } } return 0; }
后记:
此时,时间是2022年1月1日02:00:14,啊……怎么说呢?2021年就这样成为了回不去的“昨天”,很多东西还没来得及…… 是啊!没来得及……
从昨天上午考完试就一个人在自习室待到现在,一个人的自习室虽说有些孤独,但我可以放开的码字而不用担心打扰到别人。(C生万物!努力“打怪升级”中…… )
哈哈哈,没成想,就这样“跨年”了……