提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
题目来源为比特鹏哥精选100题,如果有错误或者有更好的解法,欢迎评论区留言💕😊
题11:自幂数
题目描述
写⼀个代码打印1~100000之间的所有的⾃幂数,中间⽤空格分隔。
题目解析
自幂数
自幂数指一个n位数,其每个位上的数字的n次幂之和等于它本身。例如:
153 = 1³ + 5³ + 3³(3位数)
9474 = 9⁴ + 4⁴ + 7⁴ + 4⁴(4位数)
1也是自幂数
1. 计算 i 的位数 n
注意,必须初始化n=1;否则i的位数将会减少一位
int n = 1;
int tmp = i;
while (tmp/10)
{
n++;
tmp /= 10;
}
或者循环后补n++
int n = 0;
while (tmp / 10) {
n++;
tmp /= 10;
}
n++; // 补上最后一位
2. 计算 i 的每⼀位的 n 次⽅之和 sum
tmp = i; // 将输入的数字 i 赋值给 tmp
int sum = 0; // 初始化求和变量 sum
while (tmp) { // 当 tmp 不为 0 时循环
sum += (int)pow(tmp % 10, n); // 取 tmp 的最后一位,计算其 n 次幂并累加到 sum
tmp /= 10; // 去掉 tmp 的最后一位
}

pow函数
pow函数是C语言标准库中用于计算幂运算的函数,位于头文件math.h中。其功能是计算x的y次方,即返回x^y的值
函数原型
double pow(double x, double y);
- 判断 sum 与 i 是否相等,相等则 i 是⾃幂数。
解法
#include <stdio.h>
#include <math.h>
int main() {
int i = 0;
for (i = 1;i <= 100000;i++) {
int tmp = i;
int n = 1;
while (tmp / 10) {
n++;
tmp /= 10;
}
int sum = 0;
tmp = i;//不可省,判断位数改变了tmp的值
while (tmp) {
sum += (int)pow(tmp % 10, n);
tmp /= 10;
}
if (sum == i) {
printf("%d ", i);
}
}
return 0;
}
题12:打印菱形
题目描述
输⼊⼀个整数n,打印对应2*n-1⾏的菱形图案,⽐如,输⼊7,输出如下图案,图案总共13⾏

题目解析
上半部分
for (i = 0; i < n; i++) {
// 打印空格
for (j = 0; j < n - 1 - i; j++) {
printf(" ");
}
// 打印 *
for (j = 0; j < 2 * i + 1; j++) {
printf("*");
}
printf("\n");
}
外层循环 i 控制行数(从 0 到 n-1,共 n 行)。
空格部分:每行的空格数 = n - 1 - i,随着行数增加,空格数减少。
例如 n=3 时:
第 0 行(i=0):空格数 = 3-1-0 = 2(打印 " ")
第 1 行(i=1):空格数 = 3-1-1 = 1(打印 " ")
第 2 行(i=2):空格数 = 3-1-2 = 0(不打印空格)
星号部分:每行的星号数 = 2 * i + 1,随着行数增加,星号数递增。
例如 n=3 时:
第 0 行(i=0):星号数 = 20 + 1 = 1(打印 "")
第 1 行(i=1):星号数 = 21 + 1 = 3(打印 "**")
第 2 行(i=2):星号数 = 2*2 + 1 = 5(打印 “*****”)
下半部分
for (i = 0; i < n; i++) {
// 打印空格
for (j = 0; j <= i; j++) {
printf(" ");
}
// 打印 *
for (j = 0; j < 2 * (n - 1 - i) - 1; j++) {
printf("*");
}
printf("\n");
}
外层循环 i 仍然控制行数(从 0 到 n-1)。
空格部分:每行的空格数 = i + 1,随着行数增加,空格数增加。
例如 n=3 时:
第 0 行(i=0):空格数 = 0 + 1 = 1(打印 " ")
第 1 行(i=1):空格数 = 1 + 1 = 2(打印 " ")
第 2 行(i=2):空格数 = 2 + 1 = 3(打印 " ")
星号部分:每行的星号数 = 2 * (n - 1 - i) - 1,随着行数增加,星号数递减。
例如 n=3 时:
第 0 行(i=0):星号数 = 2*(3-1-0)-1 = 3(打印 “***”)
第 1 行(i=1):星号数 = 2*(3-1-1)-1 = 1(打印 “*”)
第 2 行(i=2):星号数 = 2*(3-1-2)-1 = -1(不打印,但循环条件 j < -1 不成立,所以不执行)
解法
#include <stdio.h>
int main() {
int n=0;
int i, j;
scanf_s("%d", &n);
for (i = 0;i < n;i++) {
//打印空格
j = 0;
for (j = 0;j < n - 1 - i;j++) {
printf(" ");
}
//打印*
for (j = 0;j < 2 * i + 1;j++) {
printf("*");
}
printf("\n");
}
for (i = 0; i < n; i++)
{
//打印空格
int j = 0;
for (j = 0; j <= i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * (n - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}

题目13:喝多少瓶汽水
题目描述
⽔已知1瓶汽⽔1元,2个空瓶可以换⼀瓶汽⽔,输⼊整数n(n>=0),表⽰n元钱,计算总共可以喝多少汽⽔,请编程实现。
题目解析
1.尽可能用空瓶换汽水
2.⾸先将 n 元钱全部⽤来购买汽⽔,计算出汽⽔的数量 total。
3. 每次将剩余的空瓶⼦ empty 除以 2,表⽰可以换取的汽⽔数量,将这些汽⽔数量加到 total 中。
4. 将剩余的空瓶⼦ empty 除以 2 向上取整,表⽰剩余的空瓶⼦买了汽⽔后喝完剩下的空瓶⼦数量。
5. 重复步骤 2 和 3,直到剩余的空瓶⼦数量不⾜以再换取⼀瓶汽⽔为⽌。
解法
#include <stdio.h>
int main()
{
int n = 0;
int total = 0;//表⽰总共能喝多少汽⽔
int empty = 0;//表⽰⼿⾥的空瓶数
scanf("%d", &n);
//买n瓶汽⽔,并且喝完后剩余n个空瓶
total += n;
empty += n;
//重复⽤空瓶⼦购买汽⽔直⾄空瓶不够2个
while (empty >= 2)
{
total += empty / 2;
empty = empty / 2 + empty % 2;
// 新空瓶 = 兑换的汽水数 + 剩余未兑换的空瓶
}
printf("%d\n", total);
return 0;
}


题目14:字符转换
题目描述
输⼊⼀个字符串,将字符串中⼤写字⺟全部转为⼩写字⺟,⼩写字⺟转成⼤写字⺟,其他字符保持不变。注:字符串的⻓度⼩于等于30,其中字符串中包含空格(不使用字符串函数)
题目解析
- 对于每个字符,我们检查它是⼤写字⺟、⼩写字⺟还是其他字符。
- 如果它是⼤写字⺟,我们将其转换为⼩写字⺟;
- 如果它是⼩写字⺟,我们将其转换为⼤写字⺟;
- 如果它是其他字符,则不需要进⾏任何转换
解法
#include <stdio.h>
int main() {
char buf[31] = { 0 };
fgets(buf, sizeof(buf), stdin);
// 使用 for 循环遍历字符串
for (int i = 0; buf[i] != '\0'; i++) {
if (buf[i] >= 'a' && buf[i] <= 'z') {
buf[i] -= 'a' - 'A'; // 小写转大写
}
else if (buf[i] >= 'A' && buf[i] <= 'Z') {
buf[i] += 'a' - 'A'; // 大写转小写
}
}
puts(buf);
return 0;
}

也可以使用while循环
while (buf[i])
{
//判断当前字符是否为⼩写字⺟
if (buf[i] >= 'a' && buf[i] <= 'z')
buf[i] -= 32;
//判读那当前字符是否为⼤写字⺟
else if (buf[i] >= 'A' && buf[i] <= 'Z')
buf[i] += 32;
i++;
}
题目15:交换两个数
题目描述
写⼀个函数Swap,可以交换两个整数的内容。注意必须实现成函数完成。
输⼊2个整数,调⽤⾃定义函数Swap,完成2个整数的交换。

题目解析
- 定义⼀个函数 Swap ,参数是两个整型指针,表⽰需要交换值的两个整数变量的地址。
- 在函数中,使⽤⼀个临时变量来存储第⼀个整数变量的值。
- 将第⼆个整数变量的值赋给第⼀个整数变量。
- 将临时变量的值赋给第⼆个整数变量。
- 在调⽤函数时,将需要交换值的两个整数变量的地址作为参数传递给函数,可以使⽤ & 运算符来获取变量的地址。
解法
#include <stdio.h>
//传⼊两个整型指针参数,进⾏交换
void Swap(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 0;
int b = 0;
//输⼊
scanf_s("%d %d", &a, &b);
//将需要交换值的两个整数变量的地址作为参数传递给函数,进⾏交换
Swap(&a, &b);
//输出
printf("%d %d\n", a, b);
return 0;
}


被折叠的 条评论
为什么被折叠?



