【蓝桥杯刷题】坑爹的负进制转换

【蓝桥杯刷题】——坑爹的负进制转换

目录

前言:  

 坑爹的负进制转换题目 

题目描述

输入描述

输出描述

 解题思路的分享  

 题目源码的分享

 本菜鸡&总结 
327797c770ae4cef834a1bc8a23c561d.gif

博客昵称:陈大大陈

座右铭:所谓觉悟,就是在漆黑的荒野上开辟出一条理当前进的光明大道。

博主简介:一名热爱C/C++和算法等技术,喜欢运动,爱胡思乱想却胸怀大志的小博主!

博主&唠嗑:早中晚安!各位CSDN的朋友!我是博客新人陈大大陈,希望我的文章能为你带来帮助!欢迎大家在评论区畅所欲言!也希望大家多多为我提出您宝贵的建议!如果觉得我写的不错的话还请点个赞和关注哦~

前言:  

大伙们好!又到了小陈蓝桥杯每日一题的时间了~ 今天也带来了十分有趣的题目!用C语言实现——坑爹的负进制转换,这个题目对我来说很有挑战性,把我折磨的很难受,不过我还是整出来了,我现在迫不及待地要和大家分享~!

 坑爹的负进制转换题目 

题目描述

以前我们做的进制转换大家都忽略了一点,就是进制一定是正整数;今天这道进制转换就坑爹的选择了,额,负整数来做进制。

输入描述

输入由若干行组成,每行有两个整数n(-32765<=n<=32767)和R(-16<=R<=-2)。输入的最后一行只有一个‘#’号,表示输入结束。

输出描述

对于每个输入行,输出n的R进制形式。出现的字母请用大写字母表示!

样例输入

30000 -2
-20000 -2
28800 -16
-25000 -16
#

样例输出

11011010101110000
1111011000100000
19180
7FB8

 解题思路的分享  

  • 我们采用递归的写法来写这道题目。
  • 首先我们要知道,在C语言中,商和余数都符合 被除数=商x除数+余数 这一数学规律。C/C++ 是向零取整(负数向上、正数向下取整)的。也就是说,余数可能是负数。
  • 我们要打印出对应的负二进制,就不能有负数,所以代码中如果余数为负数,要将其变为正数。
  • 说道递归,那就必须要有出口,我们将a==0作为递归出口,当a不停除以对应进制到零,此时递归停止。
  • 当余数小于零时,我们该如何将其变为正数呢?例如-5/-2=2余-1,这个-1没有办法处理。
  • 我们不能改变结果的值,那就需要一个看起来很简单但是想不到的转换公式:
  • (商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数
  • 所以我们要保证商不变的话只要  被除数=被除数+除数,化简一下可以得到商=被除数/除数--->(被除数+除数)/除数=商+1  。
  • 为了实现多组输入,用scanf返回值来判断输入是否正确。

 题目源码的分享

#define _CRT_SECURE_NO_WARNINGS
#include
void JinZhi(int a, int b)
{
	if (a == 0)
		return;//递归的出口
	int m = a % b;
	if (m < 0)
	{
		m -= b; a += b;
	}
	if (m > 10)
	{
		m = m - 10 + 'A';//转化成字符型,方便16进制输出成字符
	}
	else
	{
		m += '0';
	}
	JinZhi(a / b, b);
	printf("%c", m);//注意顺序,不要写到函数的前面,不然就反了
}
int main()
{
	int n[10], m[10],i=0;
	int a, b;
	while (scanf("%d%d", &a, &b) == 2)//用scanf返回值来判断输入是否正确
	{
		n[i] = a;
		m[i] = b;
		i++;
		
	}
	for (int j = 0; j < i; j++)
	{
		JinZhi(n[j], m[j]);
		printf("\n");
	}
	return 0;
}

 本菜鸡&总结 

这是我们学校蓝桥杯选拔赛上面的题目,我觉得很有挑战性写了这篇博客,这种题目比较耐人寻味,哪位大佬有更好的做法,请在评论区不吝赐教哦~如果觉得我写的不错的话还请点个赞和关注哦~我会持续输出编程的知识的! 

【蓝桥杯刷题】坑爹的负进制转换_第1张图片

你可能感兴趣的:(蓝桥杯,职场和发展,c++,算法,c语言)