C语言经典100题11-15

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

题目来源为比特鹏哥精选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);
  1. 判断 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,其中字符串中包含空格(不使用字符串函数)

题目解析

  1. 对于每个字符,我们检查它是⼤写字⺟、⼩写字⺟还是其他字符。
  2. 如果它是⼤写字⺟,我们将其转换为⼩写字⺟;
  3. 如果它是⼩写字⺟,我们将其转换为⼤写字⺟;
  4. 如果它是其他字符,则不需要进⾏任何转换

解法

#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个整数的交换。
在这里插入图片描述

题目解析

  1. 定义⼀个函数 Swap ,参数是两个整型指针,表⽰需要交换值的两个整数变量的地址。
  2. 在函数中,使⽤⼀个临时变量来存储第⼀个整数变量的值。
  3. 将第⼆个整数变量的值赋给第⼀个整数变量。
  4. 将临时变量的值赋给第⼆个整数变量。
  5. 在调⽤函数时,将需要交换值的两个整数变量的地址作为参数传递给函数,可以使⽤ & 运算符来获取变量的地址。

解法

#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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值