- 鄙人今年备考,主要目的在于记录学习历程,望道友们勿喷~
- 希望能做到每日一题~
- 开始炼丹~
上篇链接:西安交大计算机考研软件工程编程题库(二十三)
下篇链接:西安交大计算机考研软件工程编程题库(二十五)
设计下面两个函数:
- 函数
readoctal()
,读入八进制序列,转换成十进制正整数;- 函数
writeoctal()
,将十进制正整数转换成相应的八进制数字序列,并打印出来。
分析一波,本题的第二问可参考西安交大计算机考研软件工程编程题库(十八)这道题的实现方式。
- 对于第一问八进制转十进制,先回忆一下数学上的计算方式,假设一个八进制数123,若想转换为十进制,只需要做计算1x82+2x81+3x80=83。
- 为实现上式,需要完成的步骤有:数据拆分&乘以相应的8的n-1次幂,不知道看到数据拆分是否让道友们想到上一题递归拆分数据,这里可以继续套用上一题。
话不多说,实现一下。
Ps:不出意外鄙人的此系列文章都会用C实现,其他语言的道友见谅~。
代码如下:
#include<stdio.h> #include<math.h> //递归实现十进制转八进制 void readoctal(int n, unsigned int radix){ n = (unsigned int)n; if(n/radix){ readoctal(n/radix, radix); } putchar('0' + n%radix); } //递归实现八进制转十进制 void writeoctal(int n, int result, int i){ if(n/10 == 0){ printf("%d", result+=(n*pow(8, i))); } else{ result+=((n%10)*pow(8, i)); writeoctal(n/10, result, ++i); } } int main(){ int n8, n10; //用于输入 int result = 0, flag = 0; //result用来存放结果,flag用于标记个位十位百位等(形参偷懒写成i了) //测试第一问 printf("——————————第一问——————————\n"); printf("请输入一个十进制数:\n"); scanf("%d", &n10); printf("原始十进制数据为:%d\n", n10); printf("输出八进制数据为:"); readoctal(n10, 8); //测试第二问 printf("\n——————————第二问——————————\n"); printf("请输入一个八进制数:\n"); scanf("%d", &n8); printf("原始八进制数据为:%d\n", n8); printf("输出十进制数据为:"); writeoctal(n8, result, flag); return 0; }
本题如果没有之前一些题目的铺垫,可能会实现起来有一定难度,但经过前面的铺垫,写起来会轻松很多。本题鄙人写的有些随意,结果是没问题,但对于第二问的写法,个人认为不是特别满意,道友们适当借鉴,自行斟酌~
Ps:
一个小小的建议,如果写这道题的时候发现前面写过的一些经典方法产生了遗忘,建议适当回顾一下~