当前位置: 首页 > backend >正文

C语言三位数倒序输出(两种方法)

1. ​数学分解法​(推荐三位数场景)

原理​:分离百位/十位/个位后重组

#include <stdio.h>
int main() {int num, reverse;printf("输入三位数: ");scanf("%d", &num);if (num >= 100 && num <= 999) { int a = num / 100;       // 百位int b = num / 10 % 10;   // 十位int c = num % 10;        // 个位reverse = c*100 + b*10 + a; // 重组printf("倒序: %d\n", reverse);} else {printf("输入非三位数!\n");}return 0;
}

注意​:仅适用100-999的整数,输入需验证范围

2. ​循环逆序法​(通用任意位数)

原理​:循环取余动态构建逆序数

#include <stdio.h>
int main() {int num, reverse = 0;printf("输入整数: ");scanf("%d", &num);while (num != 0) {int digit = num % 10;       // 取末位reverse = reverse*10 + digit; // 构建逆序num /= 10;                 // 移除末位}printf("倒序: %d\n", reverse);return 0;
}

注意​:

  • 负数需先取绝对值再处理
  • 末尾0会丢失(如120→21)


🔧 二、EXT4日志解析(纯代码实现)

关键数据结构
// 日志块公共头
struct journal_header_s {__be32 h_magic;     // 魔数0xC03B3998__be32 h_blocktype; // 块类型标识__be32 h_sequence;  // 事务序列号
};// 描述符块(可变长度)
typedef struct {journal_header_s base_header;journal_block_tag_t tags[]; // 柔性数组存储块标签
} journal_descriptor_header_t;

重点​:描述符块长度不固定,需动态计算标签数量

解析流程
  1. 定位日志区​:通过超级块获取.journal物理位置
  2. 事务重放​:
void parse_descriptor_block(int dev_fd, uint32_t block_size) {char *block_buf = malloc(block_size);read(dev_fd, block_buf, block_size);journal_descriptor_header_t *desc = (journal_descriptor_header_t*)block_buf;// 计算最大标签数 = (块大小 - 头部大小 - 校验和)/标签大小size_t max_tags = (block_size - sizeof(base_header) - 4) / sizeof(journal_block_tag_t);for (int i=0; i<max_tags; i++) {if (desc->tags[i].t_blocknr == 0) break; // 遇空标签终止recover_block(dev_fd, desc->tags[i].t_blocknr); // 恢复数据块}free(block_buf);
}

技术难点​:

  • 字节序转换(磁盘数据为大端序)
  • 循环队列处理转义块(JBD2_FLAG_ESCAPE

⚙️ 三、队列实现(嵌入式场景)

1. ​数组实现循环队列
typedef struct {int *data;      // 存储数组int head;       // 队首下标int tail;       // 队尾下标int capacity;   // 队列容量
} CircularQueue;void enqueue(CircularQueue *q, int item) {if ((q->tail+1) % q->capacity == q->head) return; // 队满q->data[q->tail] = item;q->tail = (q->tail+1) % q->capacity; // 循环移动
}int dequeue(CircularQueue *q) {if (q->head == q->tail) return -1; // 队空int item = q->data[q->head];q->head = (q->head+1) % q->capacity;return item;
}

优势​:内存连续,访问高效;缺点​:容量固定

2. ​链表实现动态队列
typedef struct Node {int data;struct Node *next;
} QueueNode;typedef struct {QueueNode *front;QueueNode *rear;
} LinkedQueue;void enqueue(LinkedQueue *q, int item) {QueueNode *node = malloc(sizeof(QueueNode));node->data = item;node->next = NULL;if (q->rear == NULL) { // 空队列q->front = q->rear = node;} else {q->rear->next = node;q->rear = node;}
}int dequeue(LinkedQueue *q) {if (q->front == NULL) return -1; // 队空QueueNode *temp = q->front;int item = temp->data;q->front = q->front->next;if (q->front == NULL) q->rear = NULL; // 队列置空free(temp);return item;
}

适用场景​:需动态扩容的场景(如任务调度)


💡 综合复习建议

  1. 重点题型​:
    • 数字倒序:掌握数学分解与循环法的适用场景
    • EXT4日志:理解描述符块动态解析流程
    • 队列编码:能手写循环队列/链表队列的核心操作
  2. 高频考点​:
    • 循环队列的队空/队满判断条件
    • EXT4日志的事务原子性保障机制
    • 倒序算法中的前导零处理
  3. 实战练习​:
// 综合题:用队列实现数字逐位倒序
void reverse_via_queue(int num) {LinkedQueue q;init(&q);while (num) {enqueue(&q, num % 10); // 按位入队num /= 10;}while (!empty(&q)) {printf("%d", dequeue(&q)); // 出队即倒序}
}


【C语言】零基础到项目实战

【C语言/C++】零基础到项目实战

初学者营地:1021486511

http://www.xdnf.cn/news/12419.html

相关文章:

  • 使用xdocreport导出word
  • c++ map与multiset的介绍
  • JUnit​​ 和 ​​Mockito​​ 的详细说明及示例,涵盖核心概念、常用注解、测试场景和实战案例。
  • 集群与分布式与微服务
  • 软件测试:质量保障的基石与未来趋势
  • 计算机网络(6)——局域网
  • leetcode1971. 寻找图中是否存在路径-easy
  • 自托管图书搜索引擎Bookologia
  • EasyRTC嵌入式音视频通信SDK助力物联网/视频物联网音视频打造全场景应用
  • 6.6 day38
  • 现实生活例子[特殊字符] 通俗易懂的解释[特殊字符] JS中的原型和原型链[特殊字符]
  • AC68U刷梅林384/386版本后不能 降级回380,升降级解决办法
  • 一个WebRTC 分辨率动态爬升问题记录与解决过程
  • SQLServer中的存储过程与事务
  • Kafka 快速上手:安装部署与 HelloWorld 实践(二)
  • Kafka 快速上手:安装部署与 HelloWorld 实践(一)
  • uniapp 设置手机不息屏
  • Go 中 map 的双值检测写法详解
  • 从零实现STL哈希容器:unordered_map/unordered_set封装详解
  • Transformer-BiGRU多变量时序预测(Matlab完整源码和数据)
  • Python概率统计可视化——概率分布、假设检验与分子运动模型
  • GNSS终端授时方式-合集:PPS、B码、NTP、PTP、单站授时,共视授时
  • Go 中的 Map 与字符处理指南
  • Transformer架构解析:Encoder与Decoder核心差异、生成式解码技术详解
  • Python读取PDF:文本、图片与文档属性
  • Linux文件系统详解:从入门到精通
  • Chrome书签的导出与导入:步骤图
  • 高温IC设计带来的挑战和问题
  • Java + Spring Boot + Mybatis 实现批量插入
  • 96. 2017年蓝桥杯省赛 - Excel地址(困难)- 进制转换