- 曾雪琳 的博客
3.循环结构.md
- 2023-11-9 21:17:52 @
3.循环结构
p51求表达式的和
题目 S=1+2+3+4+...+n
输入 整数n
输出 整数S
#include <stdio.h>
int main() {
int n, s = 0;
scanf("%d", &n);
for (int t = 1; t <= n; t++) {
s = t + s;
}
printf("%d", s);
}
p52求分数和
题目 S=1+1/2+1/3+...+1/n
输入 整数n
输出 实数S(保留三位小数)
#include <stdio.h>
int main() {
int n;
double s = 0.0, m;
scanf("%d", &n);
for (int t = 1; t <= n; t++) {
s = s + 1 / (t * 1.0); // 记得t要乘1.0,将整型转化浮点型
}
printf("%.3lf", s); // 保留三位小数
}
p53三位回文数
题目 从小到大输出[m,n]之间的所有回文数,并求这些数有多少个
输入 两个整数 m和n用空格隔开(m<=n,且m.n一定都是 3 位数)
输出 先输出m,n之间所有的 3 位的回文数,每行 1 个;最后 1 行输出 3 位回文数总共有多少个
#include <stdio.h>
int main() {
int m, n, a, b, p = 0;
scanf("%d %d", &m, &n);
for (int t = m; t <= n; t++){ // t应该从m开始
a = t / 100; // 位于百位的数字
b = t % 10; // 位于个位的数字
if (a == b) {
p = p + 1; // p表示回文数的个数
printf("%d\n", t); // 记住换行
}
}
printf("%d", p);
return 0;
}
p54回文数个数
输入 正整数n
输出 一个正整数,表示[1,n]之间的回文数个数
#include <stdio.h>
int main() {
int i, a, b, c, num = 0;
scanf("%d", &a);
for (i = 1; i <= a; i++) {
b = i; // 保留原有i的值
int d = 0;
while (b != 0) {
c = b % 10;
d = d * 10 + c;
b /= 10; // 得到的d就是b的倒置数
}
if (d == i) // 若成立则a是回文数
num++; // 回文个数加一
}
printf("%d", num);
return 0;
}
p55打分
题目 有n(n≤1000) 位评委打分,分值从 0 到 10,需要去一个最高分,去一个最低分(如果有多个最高或者最低分,也只需要去掉一个),剩下的评分的平均数就是这位选手的得分
输入
第一行输入一个正整数 n,表示有 n 个评委。
第二行输入n个正整数,第个正i整数表示第 i个评委打出的分值。
输出 最后得分(保留两位小数)
#include <stdio.h>
int main() {
int n, max = -2e9, min = 2e9; // 赋初值,保证max,min一定会被更新
int x, sum = 0, sum1;
double p; // 注意后面得分是小数
scanf("%d", &n);
for (int i = 0; i <= (n - 1); i++) {
scanf("%d", &x);
sum = sum + x;
if (x > max) max = x; // 得到最大值
if (x < min) min = x; // 得到最小值
}
sum1 = sum - max - min;
p = 1.0 * sum1 / (n - 2); // 要乘1.0,由整型化成浮点型
printf("%.2lf", p); // 保留两位小数
return 0;
}
p56整除问题
题目 输入三个正整数 min、max 和 factor,然后对于 min 到 max 之间的每一个整数(包括 min 和 max ),如果它能被 factor 整除,就把它打印出来
输入 一行,包括三个整数 min、max和factor
输出 一行,包括若干个整数(空格隔开)
#include <stdio.h>
int main() {
int min, max, factor;
scanf("%d %d %d", &min, &max, &factor);
for (int t = min; t <= max; t++) { // t从min到max
if (t % factor == 0) { // 即t能被factor整除
printf("%d ", t);
}
}
return 0;
}
p57鸡兔同笼问题
题目 一个笼子里面有鸡若干只,兔若干只,共有头n个,共有腿 m 条。求鸡兔各多少只?
输入 一行两个整数 n*,*m
输出 一行两个整数,表示鸡兔的只数,中间空格隔开
#include <stdio.h>
int main() {
int m, n, j, t;
scanf("%d %d", &m, &n);
for (t = 0; t <= m; t++) { // 先兔的数量的循环
j = m - t; // 由鸡+兔=头从而求出鸡的表达式
if (t * 4 + j * 2 == n) {
printf("%d %d", j, t);
break;
}
}
return 0;
}
p58角谷猜想
题目 任给一个自然数,若为偶数则除以 2,若为奇数则乘 3 加 1,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为 1。请编写代码验证该猜想:求经过多少次运算可得到自然数 1。
输入 一个正整数n
输出 一个整数,表示运算次数
#include <stdio.h>
int main() {
int n, t = 0; scanf("%d", &n);
while (n > 1) {
if (n % 2 == 0) { // 先判断奇偶
n = n / 2; // 如果是偶数
} else { // 如果是奇数
n = n * 3 + 1;
}
t = t + 1; // t表示运算次数
}
printf("%d", t);
}
p59猴子吃桃
题目 一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n 天早上起来一看,只剩下 1个桃子了。请问小猴买了几个桃子?
输入 一个正整数 n,表示天数
输出 一个整数,表示小猴买了多少个桃子
#include <stdio.h>
int main() {
int n, x1 = 1; scanf("%d", &n);
while (n > 1) { // 最后一天只有一个,n>1;
x1 = (x1 + 1) * 2; // 前一天加一个苹果再乘2等于今天的苹果数
n --;
}
printf("%d", x1);
return 0;
}
p60求最大公约数
题目 求两个自然数 a,b的最大公约数(a,b 都在长整型范围内)
输入 一行,包括两个整数
输出 只有一行,包括 11 个整数
#include <stdio.h>
int main() {
long long a, b; // 用int 也可以
int n;
scanf("%lld %lld", &a, &b); // long long 的占位符%lld
while (a != b) {
if (a > b) { // 判断大小
a -= b;
} else {
b -= a;
}
}
n = a;
printf("%d", n);
return 0;
}
p67七仙女
题目 如果一个数是7的倍数,七仙女喜欢,如果一个数至少有一位含有数值7(例如71虽然不是7的倍数,但它的十位数是7),则七仙女也喜欢。所以7、14,71,117,都是七仙女喜欢的数
输入
第一行一个正整数n,表示共有n个数
接下来一行,n个正整数,表示需要统计的n个数
输出 一行一个数,表示七仙女喜欢的数的个数
#include <stdio.h>
int main() {
int n, p1 = 0, p2 = 0;
scanf("%d\n", &n);
for (int t = 1; t <= n; t++) {
long long m;
scanf("%lld ", &m); // 注意long long 对应的占位符
if (m % 7 == 0) {
p1 = p1 + 1; // 第一种情况m是7的倍数
} else {
while (m >= 7) {
if (m % 10 == 7) { // 第二种情况m不是7的倍数,但含有7
p2 = p2 + 1;
break;
} else {
m = m / 10;
}
}
}
}
printf("%d", p1 + p2); // 两种情况相加
return 0;
}
p68计数问题
题目 计算在区间 1 到n 的所有整数中,数字x(0≤x≤9)共出现了多少次?
输入 2 个整数n,x,用一个空格隔开
输出 1 个整数,表示x出现的次数
#include <stdio.h>
int main() {
int n, x, t, t1, p = 0;
scanf("%d %d", &n, &x);
if (n >= x) { // 如果n<x,则次数为0
for (t = 1; t <= n; t++) {
t1 = t; // 保留原来t的值
while (t1) { // 条件就是t1!=0
if (t1 % 10 == x) { // 此时t1的个位数为x
p = p + 1;
}
t1 = t1 / 10;
}
}
}
printf("%d", p);
return 0;
}
p70回文数
题目 对任意给出的一个整数n,经过一系列的处理(该数加上它的颠倒数),最后都变成回文数
输入 一个整数(n>=1&&n<=1000000)
输出 使n变成回文数最少处理次数
#include <stdio.h>
int main() {
long long n, p = 0, b, a1; // 用long long
scanf("%lld", &n); // long long 对应的占位符
while (1) { // 可一直循环,死循环
b = 0, a1 = n;
while (a1) {
b = b * 10 + a1 % 10;
a1 /= 10; // b是a的颠倒数
}
if (n == b) break; // 中断循环
else {
n = n + b;
p++;
}
}
printf("%lld", p);
return 0;
}
p79数字和
题目 某合数的各位数字之和等于它所有质因数的各数字之和,你帮助桐桐把n以内(包括n)具有上述特点的所有合数找出来好吗?
输入 一个整数n
输出 若干行,每行输出5个满足条件的数
#include <stdio.h>
int main() {
int n, cnt = 0; scanf("%d", &n);
for (int i = 1;i <= n; i++) {
int f = 1; // 假设 i 是素数
for (int j = 2; j <= i / j; j++)
if (i % j == 0) { f = 0; break; }
if (f == 0) { // i为 合数
int t = i, a = 0, b = 0;
// a 表示合数的各位数字之和
// b 表示所有质因数的各数字之和
while (t) { a += t % 10, t /= 10; }
t = i;
for (int j = 2; j <= i; j++) {
while (t % j == 0) {
t /= j;
int tt = j;
while (tt) { b += tt % 10, tt /= 10; }
}
}
if (a == b) {
printf("%d ", i);
cnt++; // 记录输出个数,每 5个换行
if (cnt % 5 == 0) puts("");
}
}
}
return 0;
}
p86多项式求和
题目 输入一个正整数n,求1!−2!+3!−4!+……+n! 的结果
输入 一个正整数你
输出 一个整数,运算结果
#include <stdio.h>
int main() {
int n, i, a = 1;
int sn = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
a *= i;
if (i % 2 == 0) { // 判断是否为偶数
sn -= a; // 偶数阶乘是负的
} else {
sn += a;
} // 奇数阶乘是正的
}
printf("%d", sn);
return 0;
}
p94不定方程求解
题目 给定正整数a,b,c,求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数
输入 一行,包含三个正整数a,b,c,每个数均不大于1000(空格隔开)
输出 一个整数,不定方程的非负整数解组数
#include <stdio.h>
int main() {
int a, b, c, x, p = 0, y;
scanf("%d %d %d", &a, &b, &c);
for (x = 0; x <= 1000; x++) { // 题目中x<=1000
y = (c - a * x) / b; // y是整型,若从浮点型转化为整型,精度会缺失
if (a * x + b * y == c && y >= 0) {
p = p + 1;
}
}
printf("%d", p);
return 0;
}
p96菲波那契数
题目 菲波那契数列是指数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数k,要求菲波那契数列中第k个数是多少
输入 一行,包含一个正整数k(1 ≤ k ≤ 46)
输出 一行,包含一个正整数,表示菲波那契数列中第k个数的大小
#include <stdio.h>
int main() {
int k, a = 1, b = 1, c = 2;
scanf("%d", &k);
for (int t = 1; t <= k - 3; t++) { // 是少了3次
a = b; // 顺序不能反
b = c;
c = a + b; // 都往后移动一个
}
printf("%d", c);
return 0;
}
p97分解质因数
题目 把一个合数分解成若干个质因数乘积的形式(即求质因数的过程)叫做分解质因数(只针对合数)输入一个正整数n,将n分解成质因数乘积的形式
输入 一个正整数n
输出 分解成质因数乘积的形式,质因数必须由小到大
#include <stdio.h>
int main() {
int n, i = 2; // i从2开始
scanf("%d", &n);
printf("%d=", n); // 输出表达式的一边
do {
while (n % i == 0) { // i是否是n 的因数
printf("%d", i);
n = n / i;
if (n != 1) {
printf("*");
} // 不要忘记*
}
i++;
} while (n != 1);
return 0;
}
p98质因数分解
题目 已知正整数n是两个不同的质数的乘积,试求出较大的那个质数
输入 只有一行,包含一个正整数 n
输出 只有一行,包含一个正整数 p,即较大的那个质数
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for (int i = 2; i <= n; i++) // 从2开始
if (n % i == 0) {
printf("%d", n / i);
break;
}
return 0;
}
p100牛顿迭代法
题目 求根号n,牛顿迭代的基本想法是:先假定一个解x0=n,那么可以得到另外一个解x1=n/x0,其中 x0*x1=n。
再取两个解的平均值作为新解,再按照同样的方式继续推导满足误差的解.
于是得到迭代公式:x=(x+n/x)/2
输入 一个实数n
输出 n,结果保留三位小数
#include <math.h> //fabs()函数在其中
#include <stdio.h>
int main() {
double n;
scanf("%lf", &n);
double x = n;
while (fabs(x - n / x) > 1e-5) { // fabs(x-n/x)是求(x-n/x)的绝对值
x = (x + n / x) / 2;
}
printf("%.3lf\n", x); // 保留三位小数
return 0;
}