5月7日
p33 循环
- 输入一串数字,输出这串数字一共有多少位数
int main() {
int a;
int n = 0;
printf("input a number:");
scanf("%d", &a);
while (a > 0) {
n++;
a /= 10;
}
printf("%d", n);
}
不用循环也可以做到,对其求以10为底的对数,然后取整数部分再加1,就是这个整数的位数
#include<stdio.h> #include<math.h> void main() { int n; scanf("%d",&n); printf("%d的位数是%d\n",n,(int)log10(n)+1); //注意int }
p34 while循环
-
do-while循环:先进循环体,再判断是否满足循环条件
do{ <循环体语句> } while (<循环条件>);
void main() { int x, n = 0; printf("input x: "); scanf("%d", &x); do { n++; x /= 10; } while (x > 0); printf("%d位数", n); }
p35 do-while循环
- 验证
- 测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等
- 个位数
- 10
- 0
- 负数
p36 循环计算
-
计算 l o g 2 X log_2 X log2X
- 为什么ret从0开始?
- 要兼顾循环条件
x>1
- 为什么循环条件是
x>1
? - 因为
l
o
g
2
1
=
0
log_2 1 = 0
log21=0,所以不希望
x=1
进入while循环,即可直接输出0
int main() {
int x;
int ret = 0;
printf("input a number:");
scanf("%d", &x);
int temp = x;
while (x > 1) {
x /= 2;
ret++;
}
printf("log2 of %d is %d", temp, ret);
}
p37 猜数游戏
- 让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,直到用户猜中为止,最后还要告诉用户他猜了几次。
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int main() {
int input = 0;
int count = 0;
srand((unsigned int) time(NULL));//每次运行可以生成不同的随机数
int ret = rand() % 100 + 1;//产生一个1到100的随机数
do {
printf("please input a number:");
scanf("%d", &input);
count++;
if (input < ret) {
printf("\n你猜错了!再大一点!\n");
} else if (input > ret) {
printf("\n你猜错了!再小一点!");
}
} while (input != ret);
printf("\n你猜对了!\n答案是:%d,你猜了%d次", ret, count);
}
p38 算平均数
-
让用户输入一系列的正整数,最后输入
-1
表示输入结束,然后程序计算出这些数字的平均数,输出输入数字的个数和平均数。s u m = ∑ i = 1 n x i n sum = \frac{\sum_{i=1}^nx_i}{n} sum=n∑i=1nxi
int main() {
int sum = 0;
int count = 0;
int temp = 0;
do {
printf("如果想要终止输入,请输入\"-1\"。输入整数:");
scanf("%d", &temp);
sum += temp;
count++;
} while (temp != -1);
double result = (1.0 * (sum + 1))/ (count - 1);
printf("the result is %.2lf", result);
}
p39 整数逆序
- 整数的分解:一个整数由1至多位数字组成,如何分解出整数各个位上的数字,然后加以计算。
int main() {
int x;
int digit;
int ret = 0;
printf("input a number:");
scanf("%d", &x);
while (x > 0) {
digit = x % 10;//最后一位数
ret = ret * 10 + digit;
printf("x = %d,digit = %d,ret = %d\n", x, digit, ret);
x /= 10;
}
}
/*example:
input a number:1160
x = 1160,digit = 0,ret = 0
x = 116,digit = 6,ret = 6
x = 11,digit = 1,ret = 61
x = 1,digit = 1,ret = 611
*/
5月8日
p40 for循环
- 计算阶乘
- 对于一开始的
i=1
,当i <= x
时,重复做循环体,每一轮循环在做完循环体内的语句后,使得i=i+1
int main() {
int x;
int y = 1;
printf("input:");
scanf("%d", &x);
for (int i = 1; i <= x; i++) {
y *= i;
}
printf("%d! = %d", x, y);
}
p42 循环的控制
- 判断素数
break
:跳出循环continue
:跳过循环这一轮剩下的语句,进入下一轮
int main() {
int x;
int temp = 0;
printf("input:");
scanf("%d", &x);
for (int i = 2; i < x; i++) {
if (x % i == 0) {
temp = 1;
break;
}
}
if (temp == 0) {
printf("%d是素数!", x);
} else {
printf("%d不是素数!", x);
}
}
p43 嵌套的循环
- 输出100以内的素数
int main() {
int max = 0;
printf("input maximum:");
scanf("%d", &max);
for (int i = 2; i <= max; i++) {
int temp = 0;
for (int j = 2; j < i; ++j) {
if (i % j == 0) {
temp = 1;
break;
}
}
if (temp == 0) {
printf("%d ", i);
}
}
}
- 输出指定个数的素数
int main() {
int max = 0;//素数的个数
int cnt = 0;
int x = 2;
printf("input maximum:");
scanf("%d", &max);
// for (int i = 2; i <= max; i++) {
while (cnt < max) {
int temp = 0;
for (int j = 2; j < x; ++j) {
if (x % j == 0) {
temp = 1;
break;
}
}
if (temp == 0) {
cnt++;
printf("%d\t", x);
if (cnt % 5 == 0) {
printf("\n");
}
}
x++;
}
}
//运行结果
input maximum:40
2 3 5 7 11
13 17 19 23 29
31 37 41 43 47
53 59 61 67 71
73 79 83 89 97
101 103 107 109 113
127 131 137 139 149
151 157 163 167 173
p44 离开多重循环
- 凑硬币
- 如何用1角、2角和5角的硬币凑出10元以下的金额呢?
p45 前n项求和
- f ( n ) = 1 + 1 2 + 1 3 + 1 4 + . . . + 1 n f(n)=1+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+...+\frac{1}{n} f(n)=1+21+31+41+...+n1
int main() {
int n = 0;
double temp = 0;
printf("input:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
temp = temp + 1.0 / i; // 1/i是int类型,所以要用1.0/i
}
printf("result:%.2lf", temp);
}
- f ( n ) = 1 − 1 2 + 1 3 − 1 4 + . . . + 1 n f(n)=1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+...+\frac{1}{n} f(n)=1−21+31−41+...+n1
int main() {
int n = 0;
double temp = 0;
printf("input:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
// temp = temp + 1.0 / i;// 1/i是int类型
if (i % 2 == 1) {
temp = temp + 1.0 / i;
} else {
temp = temp - 1.0 / i;
}
}
printf("result:%.2lf", temp);
}
-
对于第二题,一加一减的计算方式,视频中给出了更好的答案,通过定义一个新的变量
sign=1
,在每一轮的循环中,我们将sign
取其相反数。这种方法更加简单直接,同时避免了上一个答案中的if
判断。
p46 整数分解
- 正序分解整数
- 输入一个非负整数,正序输出它的每一位数字
- 输入:13425,输出:1 3 4 2 5
int main() {
int x;
printf("inuput:");
scanf("%d", &x);
int count = 1;
int t = x;
while (t > 9) {
t /= 10;
count *= 10;
}
do {
int d = x / count;
printf("%d", d);
if (count > 9) {
printf(" ");
}
x %= count;
count /= 10;
} while (count > 0);
}
p47 求最大公约数
- 输入两个数a和b,输出它们的最大公约数
- 如输入:12 19,输出:6
- 枚举法
- 如果求最小公约数,可以在14行后面加上
break;
- 如果求最小公约数,可以在14行后面加上
int main() {
int a, b;
int min;
int ret = 0;
printf("input a and b:");
scanf("%d %d", &a, &b);
min = a;
if (a > b) {
min = b;
}
for (int i = 1; i <= min; i++) {
if (a % i == 0 && b % i == 0) {
ret = i;
}
}
printf("%d和%d的最大公约数是%d", a, b, ret);
}
- 辗转相除法
- 如果
b=0
,计算结束,a就是最大公约数 - 否则,计算
a%b
,让a=b
,而b等于余数 - 回到第一步
int main() {
int a, b;
int ret = 0;
printf("input a and b:");
scanf("%d %d", &a, &b);
while (b != 0) {
int c = a % b;
a = b;
b = c;
}
printf("%d", a);
}