不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

任务

求 1 万以内所有素数的和。

编码

素数筛算法介绍

所谓素数筛,是将其产出的信息存储在一个标记数组中,数组的第 i 位,标记的是 i 这个数字是否是合数的信息。如果 i 这个数字是合数,数组下标为 i 的位置就被标记成为 1,如果 i 不是合数,则数组下标为 i 的位置就是 0。素数筛就是通过一套算法流程,产生一个这样的数组。

阅读全文 »

任务

求出 1000 以内所有 3 或 5 倍数的数字的和。

编码

一份合格的程序实现

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 1; i < 1000; i++) { //循环遍历 1000 以内的所有整数
sum += i * (i % 3 == 0 || i % 5 == 0); //把 3 或 5 的倍数累加到变量 sum 中
}
printf("%d\n", sum); //最后输出 sum 变量的值,就是 1000 以内,所有 3 或 5 的倍数和。
return 0;
}
阅读全文 »

任务

实现一个可变循环层数的程序。

编码

我们可以一开始假设,有一个函数,是实现 5 层循环打印的程序,那么它会循环 n 次,每次调用一个实现 4 层循环打印的程序。

1
2
3
4
5
6
7
8
9
10
11
//代码框架
int print_loop(int k, int n) {
//代表 k 层循环的程序,然后循环 n 次,每次调用一个 k - 1 层循环的程序。
if (k == 0) {
// 打印一行
}
for (int i = 1; i <= n; i++) {
print_loop(k - 1, n);
}
return;
}
阅读全文 »

任务

请你实现一个打印“漂亮日志格式”的方法。

首先我们先说“日志”的作用,程序中的“日志”,通常是指在程序运行过程中,输出的一些与程序当前状态或者数据相关的一些信息。这些信息,可以帮助程序开发人员做调试,帮助运营人员做数据分析,帮助管理人员分析日活等等。总而言之,一份合理的日志信息,是非常有价值的数据。而我们今天呢,接触一种最简单的日志形式,就是程序运行过程中的调试信息。

请你实现一个参数形式和 printf 函数一样的 log 方法,用法如代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void func(int a) {
log("a = %d\n", a);
}

int main() {
int a = 123;
printf("a = %d\n", a);
log("a = %d\n", a);
func(a);
return 0;
}
阅读全文 »

任务

仿照 scanf 函数,实现一个低配版的 my_scanf 函数。这个函数的功能,简单来说就是将一个字符串信息转换成整型数字,能够完成这个任务,你会更深刻的理解 scanf 函数,更深刻的理解参数设计。

例如:

1
2
3
4
5
6
7
8
9
//第一个基础功能
int n = 98;
my_scanf("12345", &n);
printf("%d", n); // 输出 12345,而不是 98

//第二个基础功能
int n = 98, m = 0;
my_scanf("123 45", &n, &m);
printf("n = %d m = %d", n, m); // 输出 n = 123 m = 45

实现

阅读全文 »

任务

假设有如下结构体数组,请看如下代码:

1
2
3
struct Data {
int x, y;
} a[2];

请用尽可能多的形式,替换下面代码中 &a[1].x 的部分,使得代码效果不变:

1
2
struct Data *p = a;
printf("%p", &a[1].x);
阅读全文 »

任务

Q:printf 函数在输出浮点型数据的时候,如何保留位数呢?

1
2
printf("%.2lf", 3.1415926);
//输出:3.14

A:%lf 是 double 双精度浮点型输出的格式占位符,当我们想要保留小数点后两位的时候,只需要在 % 和 lf 中间加上 .2 即可,2 写在 .(点) 的后面代表小数点后 2 位。

实现一个能够保留小数点后 n 位的程序,这里的 n 是我们程序读入的一个变量。
例如:

阅读全文 »

任务

程序中读入一个整数 n,假设 n 不会大于 1000,请输出 1 到 n 的每一个数字二进制表示中的 1 的个数。

当 n 等于 7 的时候,我们把 1 到 7 的每个数字的二进制表示罗列出来,会得到下表所示内容:

到7的二进制表示

根据表中的内容,如果你的程序编写成功的话,程序应该分别输出 1、1、2、1、2、2、3,这些输出内容分别代表每个数字二进制表示中 1 的数量。

阅读全文 »

任务

圆周率 π 对你来说肯定不是一个陌生的概念,它指的是圆的周长与直径的比值。在古代,数学家们为了计算 π 的精确值想尽方法,可能穷尽一生也不过精确到小数点后几位而已。但到了现在,你可能不相信,只要你知道 π 的定义,就可以利用编程轻易计算出 π 的值。那究竟怎么做到呢?

编码

rand用法

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
printf("%d\n", rand() % 1000); // 永远输出固定值
srand(time(0));
printf("%d\n", rand() % 1000); // 每次运行都不同
return 0;
}
阅读全文 »

任务

如果我给你一个由年月日组成的日期,再给你一个数字 X,你能否准确地让程序输出 X 天后的日期呢?
例如

1
2
3
1989 11 20
20
1989 12 10

数据中给出了 1989 年 11 月 20 日这个日期,然后问你 20 天后的日期是多少,你的程序应该输出 1989 年 12 月 10 日。特别需要注意的是,在这个任务中,你需要考虑到闰年中 2 月份的特殊性,闰年的 2 月有 29 天。

编码

阅读全文 »