将非负十进制整数n转换成b进制

1.题目分析
题目要求将非负十进制数转化成b进制,分析此题目主要有以下几点
(1)转化的思路为转化为几进制数就用原来的十进制数除以要转换的进制数求余数。
(2)如果是十进制以上就涉及到最后表示的时候要用字符代替数字,实现方式可以这样
if (n%d >= 10)
{
printf("%c", (char)((n%d - 10) + ‘A’));
}
(3)如果余数小于10,就直接输出。
实现递归函数出口为:
if (n%d >= 10)
{
printf("%c", (char)((n%d - 10) + ‘A’));
}
else//如果余数小于10,则直接输出
printf("%d", n%d);
实现递归函数结构体为:
void decimalToAny(int n, int d)//10进制转换成任意进制
{
if (n == 0)
return;
else
{
decimalToAny(n / d, d);
if (d >= 10)//如果是10进制以上
{
if (n%d >= 10)
{
printf("%c", (char)((n%d - 10) + ‘A’));
}
else//如果余数小于10,则直接输出
printf("%d", n%d);
}
//如果进制小于10,不会有字母的问题
else
printf("%d", n%d);
}
}
2.画出递归树或者递归栈的调用过程。
例:将13转化成4进制
在这里插入图片描述
递归法源代码

#include<stdio.h>
void decimalToAny(int n, int d)//10进制转换成任意进制
{
	if (n == 0)
		return;
	else
	{
		decimalToAny(n / d, d);
		if (d >= 10)//如果是10进制以上
		{
			if (n%d >= 10)
			{
				printf("%c", (char)((n%d - 10) + 'A'));
			}
			else//如果余数小于10,则直接输出
				printf("%d", n%d);
		}
		//如果进制小于10,不会有字母的问题
		else
			printf("%d", n%d);
	}
}

int main()
{
	int n, d;
	char again = 'y';
	while (again == 'y' || again == 'Y')
	{

		printf("请输入十进制数:");
		scanf("%d", &n);
		printf("请输入要转换成几进制:");
		scanf("%d", &d);
		if (n == 0)
		{
			printf("转换完成:0");
			continue;
		}
		printf("转换完成:");
		decimalToAny(n, d);
		printf("\n");
		printf("---------继续[y/n]?:");
		scanf("%s", &again);
	}
	return 0;
}

3.实现非递归方法。

#include<stdio.h>
#include<string.h>
int main()
{
    int n,r,i;
    while(scanf("%d %d",&n,&r)!=EOF)
    {
        if(n<0)
        {
            printf("-");n=-n;
        }
        if(n==0){printf("0\n");continue;}
        int c=0,a[100];
        while(n)
        {
            a[c]=(n%r);
            c++;
            n/=r;
        }
        for(i=c-1;i>=0;i--)
        {
            if(a[i]>=10)
            {
                printf("%c",'A'+a[i]-10);
            }
            else printf("%d",a[i]);
        }
        printf("\n");
    }
}

4.运行结果及调试展示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
非递归运行展示:
在这里插入图片描述
5.总结归纳
在本次实验中,最大的收获就是了解到了递归函数的执行过程,借助了堆栈的概念,明白递归的执行过程其实和栈的概念差不多,递归是后调用的先返回,栈是后进先出,我们可以借助堆栈图,对递归的理解更加具体化。不过在实际运用中递归方法还是很巧妙的,方便于理解但是不容易想到,所以平时应该将递归与非递归方法结合,更好的完成题目。
通过对非递归方法的实践对堆栈有了更深的理解,从字面意思理解使用堆栈思想感觉自己能懂,但实际运用的时候就又是另一回事了,在学数据结构时觉得这些算法很实用,但也没真正实践过,今天需要进制转换时,就是使用堆栈的一个很好的例子,在实践的过程中深深的体会到了多动手练代码的重要性,要不然就只能想的来,写不出来。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您可以按照以下步骤执行: 1. 将非负十进制整数存储到队列中,可以使用链式队列实现。 2. 从队列头部取出整数,进行八进制转换,将八进制数字存储到另一个队列中。 3. 重复步骤2,直到原队列为空。 4. 依次从八进制结果队列中取出数字,输出即可。 下面是一个简单的示例代码,仅供参考: ```python # 定义链式队列节点 class Node: def __init__(self, data=None, next=None): self.data = data self.next = next # 定义链式队列 class Queue: def __init__(self): self.head = None self.tail = None def is_empty(self): return self.head is None def enqueue(self, data): node = Node(data) if self.tail is None: self.head = node self.tail = node else: self.tail.next = node self.tail = node def dequeue(self): if self.is_empty(): return None else: node = self.head self.head = node.next if self.head is None: self.tail = None return node.data # 将非负十进制整数转换成进制数 def decimal_to_octal(decimal): octal = '' while decimal > 0: octal = str(decimal % 8) + octal decimal //= 8 return octal if octal else '0' # 将非负十进制整数转换成进制数并输出 def convert_and_output(decimal): q1 = Queue() # 存储非负十进制整数 q2 = Queue() # 存储八进制数 q1.enqueue(decimal) while not q1.is_empty(): num = q1.dequeue() octal = decimal_to_octal(num) q2.enqueue(octal) while not q2.is_empty(): octal = q2.dequeue() print(octal, end=' ') # 测试 convert_and_output(12345) # 输出: 30071 ``` 希望能帮到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值