1. 求最大公约数
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
//辗转相除法
while (c = a % b) {
a = b;
b = c;
}
printf("%d\n", b);
return 0;
}
2. 字符串逆序(递归实现)
方法 1:
#include <stdio.h>
#include <string.h>
void reverse(char* str) {
int len = strlen(str);
if (len <= 1) {
return;
}
char tmp = *str;//1
*str = *(str + len - 1);//2
*(str + len - 1) = '\0';//3
reverse(str + 1);//4
*(str + len - 1) = tmp;//5
}
int main() {
char arr[] = "abcdef";
reverse(arr);
printf("%s", arr);
return 0;
}
方法 2:
#include <stdio.h>
#include <string.h>
void reverse(char* str, int left, int right) {
if (right <= left)
return;
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
reverse(str, left + 1, right - 1);
}
int main() {
char arr[] = "abcdef";
reverse(arr, 0, strlen(arr) - 1);
printf("%s", arr);
return 0;
}
3. n 的 k 次方(递归实现)
#include <stdio.h>
double Pow(int n, int k) {
if (k == 0)
return 1;
else if (k > 0) {
return n * Pow(n, k - 1);
}
else if (k < 0) {
return 1 / Pow(n, -k);
}
}
int main() {
int n = 0, k = 0;
scanf("%d %d", &n, &k);
double ret = Pow(n, k);
printf("%lf\n", ret);
return 0;
}
4. 小乐乐走台阶(BC117)
小乐乐上课需要走 n 阶台阶,每次可以选择走 1 阶或者走 2 阶,一共有多少种走法?
#include <stdio.h>
int fib(int n) {
if (n <= 2)
return n;
return fib(n - 1) + fib(n - 2);
}
int main() {
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
5. 序列中删除指定数字(BC98)
#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
int arr[n];
int i = 0;
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int del = 0;
scanf("%d", &del);
int j = 0;
for (i = 0; i < n; i++) {
if (arr[i] != del) {
arr[j++] = arr[i];
}
}
for (i = 0; i < j; i++)
printf("%d", arr[i]);
return 0;
}
6. 字母大小写转换(BC48)
#include <stdio.h>
int main() {
char ch = 0;
while (scanf("%c", &ch) == 1) {
if (ch >= 'a' && ch <= 'z')
printf("%c", ch - 32);
else
printf("%c", ch + 32);
getchar();//过滤'\n'
}
return 0;
}
scanf() 函数
在读取成功的时候,返回的是读取的数据的个数;
在读取失败的时候,返回 EOF。
调用库函数写法:
#include <stdio.h>
#include <ctype.h>
int main() {
char ch = 0;
while (scanf(" %c", &ch) == 1) {
if (islower(ch))
printf("%c", toupper(ch));
else if (isupper(ch))
printf("%c", tolower(ch));
}
return 0;
}
%c 的前面加空格:跳过下一个字符之前的所有空白字符。
7. 变种水仙花(BC38)
#include <stdio.h>
#include <math.h>
int main() {
int i = 0;
for (i = 10000; i <= 99999; i++) {
int j = 0;
int sum = 0;
for (j = 1; j <= 4; j++) {
int k = (int)pow(10, j);
sum += (i / k) * (i % k);
}
if (sum == i) {
printf("%d ", i);
}
}
return 0;
}
8. 写一个函数返回参数的二进制中 1 的个数
方法 1:
#include <stdio.h>
int count_num_of_1(unsigned int n) {
int count = 0;
while (n) {
if (n % 2 == 1) {
count++;
}
n /= 2;
}
return count;
}
int main() {
int n = 0;
scanf("%d", &n);
int ret = count_num_of_1(n);
printf("%d", ret);
return 0;
}
注意:该函数在传递 负数 参数时要将其转换为 无符号数 再进行运算,因此函数定义时的形参为 无符号整型。
类比于十进制数(如:1234)通过 %10 和 /10 来遍历十进制数的每一位。
二进制数(如:1011)也可以通过 %2 和 /2 来遍历二进制数的每一位。
方法 2:
#include <stdio.h>
int count_num_of_1(int n) {
int count = 0;
int i = 0;
for (i = 0; i < 32; i++) {
if ((n >> i) & 1 == 1) {
count++;
}
}
return count;
}
int main() {
int n = 0;
scanf("%d", &n);
int ret = count_num_of_1(n);
printf("%d", ret);
return 0;
}
方法 3:
#include <stdio.h>
int count_num_of_1(int n) {
int count = 0;
while (n) {
n = n & (n - 1);
count++;
}
return count;
}
int main() {
int n = 0;
scanf("%d", &n);
int ret = count_num_of_1(n);
printf("%d", ret);
return 0;
}
采用 借位 的思想。
应用:判断一个数是不是 2 的 n 次方。
9. X型图案(BC68)
#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
int i = 0, j = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i == j) {
printf("*");
}
else if (i + j == n - 1) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
10. 获得月份天数
#include <stdio.h>
int is_leap_year(int y) {
return ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0);
}
int main() {
int y = 0;
int m = 0;
int d = 0;
int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
while (scanf("%d%d", &y, &m) == 2) {
d = days[m];
if (is_leap_year(y) && m == 2) {
d++;
}
printf("%d", d);
}
return 0;
}
scanf() 函数返回 接收元素 的个数。
11. 求最大公约数与最小公倍数 (BC115)
#include <stdio.h>
int main() {
long n = 0;
long m = 0;
while (scanf("%d %d", &n, &m) == 2) {
long i = n;
long j = m;
long r = 0;
while (r = i % j) {
i = j;
j = r;
}
printf("%ld\n", j + m * n / j);
}
return 0;
}
m * n / j 就是最小公倍数。
注意 数据的取值范围问题。
12. 空心正方形图案(BC69)
#include <stdio.h>
int main() {
int n = 0;
while (scanf("%d", &n) == 1) {
int i = 0;
int j = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i == 0 || j == 0 || i == n - 1 || j == n - 1) {
printf("* ");
}
else {
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
13. 三角形判断(BC51)
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
int c = 0;
while (scanf("%d %d %d", &a, &b, &c) == 3) {
if ((a + b > c) && (a + c > b) && (c + b > a)) {
if (a == b && b == c) {
printf("Equilateral triangle!\n");
}
else if ((a == b && b != c) || (a == c && b != c) || (c == b && a != c)) {
printf("Isosceles triangle!\n");
}
else {
printf("Ordinary triangle!\n");
}
}
else {
printf("Not a triangle!\n");
}
}
return 0;
}
14. 求 Sn = a + aa + aaa + aaaa + aaaaa 的前 5 项之和
其中 a 是一个数字
#include <stdio.h>
int main() {
int a = 0;
int n = 0;
scanf("%d %d", &a, &n);
int i = 0;
int k = 0;
int num = 0;
for (i = 0; i < n; i++) {
k = k*10 + a;
sum += k;
}
printf("%d\n", sum);
return 0;
}
15. 水仙花数
水仙花数是指一个 n 位数,其各位数字的 n 次方之和刚好等于该数本身。
#include <stdio.h>
#include <math.h>
int main() {
int i = 0;
for (i = 0; i <= 100000; i++) {
//计算 i 的位数
int n = 1;
int tmp = i;
while (tmp/10) {
n++;
tmp /= 10;
}
//得到 i 每一位,计算他的 n 次方之和
int sum = 0;
tmp = i;
while (tmp) {
sum += pow(tmp % 10, n);
tmp /= 10;
}
if (sum == i) {
printf("%d ",i);
}
}
return 0;
}
不要在 for 循环中改变循环变量,创建临时变量 tmp 使用。
封装函数:
#include <stdio.h>
#include <math.h>
int isNarcissisticNumber(int i) {
//计算 i 的位数
int n = 1;
int tmp = i;
while (tmp/10) {
n++;
tmp /= 10;
}
//得到 i 每一位,计算他的 n 次方之和
int sum = 0;
tmp = i;
while (tmp) {
sum += pow(tmp % 10, n);
tmp /= 10;
}
return sum == i;
}
int main() {
int i = 0;
for (i = 0; i <= 100000; i++) {
if (isNarcissisticNumber(i)) {
printf("%d ",i);
}
}
return 0;
}
16. 打印菱形
#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
int i = 0;
//上半部分
for (i = 0; i < n; i++) {
int j = 0;
for (j = 0; j < n - i - 1; j++) {
printf(" ");
}
for (j = 0; j < 2 * i + 1; j++) {
printf("*");
}
printf("\n");
}
//下半部分
for (i = 1; i < n; i++) {
int j = 0;
for (j = 0; j < i; j++) {
printf(" ");
}
for (j = 0; j < 2*(n - i)-1; j++) {
printf("*");
}
printf("\n");
}
return 0;
}