首页 > 其他分享 >负进制

负进制

时间:2024-11-13 20:32:14浏览次数:1  
标签:10 进制 负数 余数 被除数 除数

以前我们常做的进制转换题进制通常都是正整数,那么如果进制为负数该如何转换呢?

首先,来了解一下进制转换的本质,以十进制向r进制转换为例:

例:(123)10如何转换成r进制的数?

采用的方法为除r取余法:假如r为2

除数 被除数   余数

2 | 123      

2 | 61        1

2 | 30        1

2 | 15        0

2 | 7         1

2 | 3         1

2 | 1         1

2 | 0         1

即(123)10=(1111011)2

那么如果进制为负数该如何处理呢?方法同上,以(-15)10转换为-2进制为例:

除数 被除数   余数

-2  | -15      

-2  |  7      -1   //此处余数为-1,显然不可以,余数只能是正数,该如何处理才能使//得余数为正呢?方法是商+1,余数为余数-除数,所以更新为右边所//示

-2  |  8      1

-2  |  -4     0

-2  |  2      0

-2  |  -1     0

 

-2  |  0     -1  //此时余数又为负数,处理方法同上

 

 -2  |  1      1

 -2  |  0      1

 

即(-15)10=(110001)-2

总结:十进制数转换为负进制的方法依然是除r取余法,只是在遇到余数为负数的情况下,需做下面两个处理:

           1、商+1

      2、余数-除数

证明如下:

对于任何进制而言,都有:被除数=商*除数+余数,

当我们把商+1,用余数-除数(余数的绝对值一定小于除数),就能把余数由负数转换成正数。

         (商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数

 

参考代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[50];
int main()
{
    int n, r, k = 0;
    cin >> n >> r;
    cout << n << "=";
    if(n == 0) cout << 0;
    else 
	{
	    while (n)
		{
	        a[++k] = n % r;
	        n /= r;
	        if (a[k] < 0) a[k] -= r, n++;//商+1,余数-除数 
	    }
	    for (int i = k; i >= 1; i--) 
		{
	        if (a[i] < 10) cout << a[i];
	        else cout << char(a[i] - 10 + 'A');
	    }
  	}
    return 0;
}

  

标签:10,进制,负数,余数,被除数,除数
From: https://www.cnblogs.com/jwg2732/p/18544729

相关文章

  • Linux二进制安装 MySQL 5.7.44
    1.下载MySQL5.7.44的二进制文件首先,访问MySQL官网下载页面,选择适合你操作系统架构(如x86_64)的二进制安装包。访问官网:MySQLDownloads在页面中选择适合你系统的版本(比如Linux的 tar 包)。下载Mysql  https://download.csdn.net/download/m0_58223765/89975252例......
  • PTA-C语言-数组-字符串转换成十进制整数
    题目:输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。输入格式:输入在一行中给出一个以#结束的非空字符串。输出格式:......
  • C语言字符串和十六进制的相互转换方式
    C语言字符串和十六进制的相互转换方式-我就叫宋帅呀-博客园C语言的字符串操作并不像java,Csharp那样提供直接的方法,简单粗暴。所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以......
  • 二进制和格雷码转换
    二进制和格雷码转换二进制转为格雷码//根据二进制转换成格雷码的法则,可以得到以下的代码:staticunsignedintDecimaltoGray(unsignedintx){returnx^(x>>1);}//以上代码实现了unsignedint型数据到格雷码的转换,最高可转换32位自然二进制码,超出32位将溢出。sta......
  • spdlog一个非常好用的C++日志库(十): 十六进制输出spdlog::to_hex
    目录1.引言2.spdlog::to_hex用法3.spdlog::to_hex实现原理4.总结1.引言    在平时调试网络程序时,多数都会用到wireshark抓包工具,在查看某个包的数据都是按照下面这样格式显示的:那么它是怎么做到的呢?其实spdlog的to_hex也能做到这一点,下面就来介绍它的用法和原......
  • Vue3 - 详细实现将多个文件批量导出为ZIP压缩包格式并下载功能,vue3将文件批量下载打包
    前言Vue2版本,请访问这篇文章。在vue3|nuxt3项目开发中,详解实现把多个文件组合成一个ZIP压缩包格式下载到用户本地,将文件批量下载打包成zip格式并自定义压缩包命名名称,vue3批量下载文件并导出为压缩包的功能,如何将后端返回的二进制文件流打包成zip格式,支持任意文件......
  • 进制与二进制及相关转换
    阅读学习:1、图解二进制,带你揭开二进制的神秘面纱!2、一文读懂“二进制基础”及“位运算”学习视频:V1V2V3V4......
  • centos7环境下二进制编译安装ffmpeg
    yuminstallautoconfautomakebzip2cmakefreetype-develgccgcc-c++gitlibtoolmakemercurialpkgconfigzlib-develyuminstall-yautomakelibtoolautoconfgccgcc-c++makeautomakecmakeopensslopenssl-devel​​mkdir-p/usr/local/src/ffmpeg_sourcescd/u......
  • byte数组转16进制,二进制字符串
    1)16进制字符串a)c#内置apibyte[]bytes=BitConverter.GetBytes(123);varhexStr=BitConverter.ToString(bytes); b)实现1///返回低字节顺序十六进制字符串(低字节在左侧)publicstaticstringToHexString(byte[]bytes){char[]hexChars="012345678......
  • Ubuntu 24.04 二进制安装 MySQL 8.0.20
    相关资料操作系统:Ubuntu24.04数据库下载地址:https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz部署#安装必要的依赖apt-yinstallnumactllibaio1t64-yln-sv/usr/lib/x86_64-linux-gnu/libtinfo.so.6.4/usr/lib/x86_64-li......