一,问题:输入一个十进制整数decnum,让其转化成八进制的数octnum
二,思路:利用转“二进制”的“倒除法”,不断求出每一次的余数即可,如下图所展示的一样:
(1)输入一个十进制的整数decnum,先将该整数以为正数处理,而负数就只是加个“-”就可以了;
int decnum;
printf("请输入一个decnum:");
scanf_s("%d", &decnum);
int i;
(2)申明一个数组arr,方便接下来将每一次求余后的余数存放在数组的每一个地址中;因为在VS中,难定义一个自由长度的数组,所以在赋予存储空间时,尽量大一点,防止溢出;
int arr[100] = { 0 };
(3)接下来就是利用循环将余数存放与数组arr中了
1.申明变量a,用于暂时存储decnum对8的余数
2.在求完一次余数后,就要求一次decnum对8的商,用于下一次循环的求余;
3.注意:这里的decnum申明时是整型变量,故decnum如果是小数的话,会强制舍弃小数部分转化成整数;
4.将每一次的余数都存进arr这个数组中,方便后面打印;
5.之所以decnum会变成0,是因为0.00..会自动变成0;
6.当decnum==0时,上面已经求过余了,所以便跳出循环
for (i = 0; i < 100; i++)
{
//申明变量a,用于暂时存储decnum对8的余数
int a = decnum % 8;
//在求完一次余数后,就要求一次decnum对8的商,用于下一次循环的求余;
//注意:这里的decnum申明时是整型变量,故decnum如果是小数的话,会强制舍弃小数部分转化成整数;
decnum = decnum / 8;
//将每一次的余数都存进arr这个数组中,方便后面打印;
arr[i] = a;
//之所以decnum会变成0,是因为0.00..会自动变成0;
//当decnum==0时,上面已经求过余了,所以便跳出循环
if (decnum == 0)
{
break;
}
}
(4)但此时的arr是逆序的,所以要倒序输出;
int octnum = 0;
printf("该decnum转化成octnum为:");
for (int j = i; j >= 0; j--)
{
printf("%d", arr[j]);
}
三,代码加运行
#include<stdio.h>
int main()
{
int decnum;
printf("请输入一个decnum:");
scanf_s("%d", &decnum);
int i;
int arr[100] = { 0 };
for (i = 0; i < 100; i++)
{
int a = decnum % 8;
decnum = decnum / 8;
arr[i] = a;
if (decnum == 0)
{
break;
}
}
int octnum = 0;
printf("该decnum转化成octnum为:");
for (int j = i; j >= 0; j--)
{
printf("%d", arr[j]);
}
return 0;
}