C语言入门算法——进制转换

题目描述:

我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置为指数,以 10 为底数的幂之和的形式。例如 123 可表示为 1×10^2+2×10^1+3×10^0 这样的形式。

与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置为指数,以 2为底数的幂之和的形式。

一般说来,任何一个正整数 R 或一个负整数 −R 都可以被选来作为一个数制系统的基数。如果是以 R 或 −R 为基数,则需要用到的数码为 0,1,…,R−1。

例如当 R=7 时,所需用到的数码是 0,1,2,3,4,5,6,这与其是 R 或 −R 无关。如果作为基数的数绝对值超过 10,则为了表示这些数码,通常使用英文字母来表示那些大于 9 的数码。例如对 16 进制数来说,用 A 表示 10,用 B 表示 11,用 C 表示 12,以此类推。

在负进制数中是用 −R 作为基数,例如 −15(十进制)相当于 (110001)−2​(−2进制),并且它可以被表示为 2 的幂级数的和数:

(110001)−2=1×(−2)^5+1×(−2)^4+0×(−2)^3+0×(−2)^2+0×(−2)^1+1×(−2)^0

设计一个程序,读入一个十进制数和一个负进制数的基数,并将此十进制数转换为此负进制下的数。

输入格式

输入的每行有两个输入数据。

第一个是十进制数 n。第二个是负进制数的基数 R。

输出格式

输出此负进制数及其基数,若此基数超过 10,则参照 16 进制的方式处理。

题目背景

NOIP2000 提高组 T1

题目来源

P1017 [NOIP2000 提高组] 进制转换

输入输出样例

输入 #1

30000 -2

输出 #1

30000=11011010101110000(base-2)

输入 #2

-20000 -2

输出 #2

-20000=1111011000100000(base-2)

输入 #3

28800 -16

输出 #3

28800=19180(base-16)

输入 #4复制

-25000 -16

输出 #4复制

-25000=7FB8(base-16)

说明/提示

数据范围

对于 100%100% 的数据,−20≤R≤−2,∣n∣≤37336。

思路及部分代码:

1. 平方函数

        按照题目要求,需要一个对基数进行相应平方的函数。

//输入一个数,求其的n次方
int number_pow(int a, int n){
    int b = 1;
    for(int i=0;i<n;i++){
        b = b * a;
    }
    return b;
}

2. 数字转字符

        在输出时会可能出现超过9的数,我们将其按照 16 进制的方式处理。

//将数字转换成字符
char number_char(int n){
    if(n >= 0 && n<=9)
        return '0'+n;
    else if(n >= 10 && n<=20)
        return ('A'+n-10);
}

3. 根据已知位数,递归+遍历扫描

        我们先假设知道了R进制后的位数,然后,从最高位依次尝试。

//k = 当前改变位数
//j = 数字总位数位数
//num = 比较数值
//r = 负进制
int compare(int k, int j, int num, int r){
    int en = 0; //判断是否到达最低位
    
    if(k == 0) en = 1;//到达最低位

    //判断进制正负
    int d_r = r;
    if(r < 0)  d_r = -r;

    for(int d = 0; d < d_r; d++){
        number[k] = d;
        if(en == 0){
            if(compare(k-1, j, num, r) == 1) return 1;
        }
        else{   //en == 1到达最低位
            int sum = 0;
            for(int i = 0; i <= j; i++){
                sum = sum + number[i] * number_pow(r, i);
            }
            if(num == sum) return 1;
            //else    return 0;
        }
    }
    return 0;
}

4. 遍历出R进制后的位数

        尝试从1位开始计算出R进制后的位数,并将compare()函数会保存正确的R进制数。

//返回结果所需的位数
int for_compare(int num, int r){
    for(int i = 0;i <= 100000;i++){
        if(compare(i,i,num,r) == 1) return i;
    }
    return -1;
}

5. 将结果从高位开始打印

    int cnt = for_compare(n,R);
    if(cnt != -1){
        printf("%d=",n);
        for(int i = cnt; i >= 0 ; i--){
            printf("%c",number_char(number[i]));
        }
        printf("(base%d)\r\n",R);        
    }
    else{
        printf("没有结果\r\n");
    }

总代码:

#include <stdio.h>
int n;
int R;
int  number[100000] = {0};
//char number_c[100000];


//输入一个数,求其的n次方
int number_pow(int a, int n){
    int b = 1;
    for(int i=0;i<n;i++){
        b = b * a;
    }
    return b;
}



//将数字转换成字符
char number_char(int n){    
    if(n >= 0 && n<=9)
        return '0'+n;
    else if(n >= 10 && n<=20)
        return ('A'+n-10);
}


//k = 当前改变位数
//j = 数字总位数位数
//num = 比较数值
//r = 负进制
int compare(int k, int j, int num, int r){
    int en = 0; //判断是否到达最低位
    
    if(k == 0) en = 1;//到达最低位

    //判断进制正负
    int d_r = r;
    if(r < 0)  d_r = -r;

    for(int d = 0; d < d_r; d++){
        number[k] = d;
        if(en == 0){
            if(compare(k-1, j, num, r) == 1) return 1;
        }
        else{   //en == 1到达最低位
            int sum = 0;
            for(int i = 0; i <= j; i++){
                sum = sum + number[i] * number_pow(r, i);
            }
            if(num == sum) return 1;
            //else    return 0;
        }
    }
    return 0;
}

//返回结果所需的位数
int for_compare(int num, int r){
    for(int i = 0;i <= 100000;i++){
        if(compare(i,i,num,r) == 1) return i;
    }
    return -1;
}

int main(){
    scanf("%d %d",&n,&R);
    int cnt = for_compare(n,R);
    if(cnt != -1){
        printf("%d=",n);
        for(int i = cnt; i >= 0 ; i--){
            printf("%c",number_char(number[i]));
        }
        printf("(base%d)\r\n",R);        
    }
    else{
        printf("没有结果\r\n");
    }

    return 0;
}

总结:

        这段代码实现了在任意进制下,将一个整数转换为负进制的形式。其核心算法是通过递归和遍历,枚举每一位数字的取值,然后根据负进制的规则计算出对应的负进制数。代码中使用了一些辅助函数,如number_pow用于计算一个数的n次方,number_char用于将数字转换为字符,for_compare用于计算负进制数的位数。

不足之处:

1.在函数number_char中,当输入的数字不在0~20的范围内时,没有返回任何值,这可能会导致未定义行为。

2.在函数for_compare中,循环的终止条件是i <= 100000,但数组number的长度只有100000,因此可能会发生数组越界的错误。

改进建议:

1.在函数number_char中,应该添加一个默认情况,当输入的数字不在0~20的范围内时,返回一个默认值,避免未定义行为。

2.在函数for_compare中,应该将循环的终止条件改为i < 100000,避免数组越界的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/548196.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从AdTech转战Martech,驰骛科技的PaaS之路

中国最早的Adtech公司之一&#xff0c;在被全资收购后&#xff0c;其创始团队又创立了一家Martech公司。赛道的变更也从侧面反映出中国营销技术市场的发展轨迹。 驰骛科技创始团队来自易传媒核心团队&#xff0c;驰骛科技创始人程华奕是易传媒创始人兼CTO&#xff0c;是中国最早…

修改taro-ui-vue3的tabs组件源码增加数字标签

需求&#xff1a;taro-ui-vue3的tabs组件上增加数字标记 步骤一&#xff1a;node_modules文件夹下找到taro-ui-vue3/lib/tabs/index.js 把173行的这一段替换成下面这段&#xff0c;然后写上样式 default: () > item.number ? [h(View, {class: at-tabs__item_in}, {defau…

maven3.9的settings.xml 内容学习

settings.xml 文件介绍 settings.xml 是 Maven 的配置文件&#xff0c;它允许你自定义 Maven 的行为&#xff0c;比如设置仓库、代理、认证信息等。在 Maven 3.9 中&#xff0c;settings.xml 的结构和内容可能与之前的版本相似&#xff0c;但可能会有一些小的改进或变化。下面…

经典文献阅读之--RaLF(激光雷达地图中基于流的全局和度量雷达定位)

0. 简介 激光雷达地图中基于流的全局和度量雷达定位。自主机器人的定位是至关重要的。尽管基于相机和激光雷达的方法已经得到大量研究&#xff0c;但是它们会受到恶劣的光照和天气条件的影响。因此&#xff0c;最近雷达传感器由于其对这种条件固有的鲁棒性而受到关注。在《RaL…

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化) 目录 回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)预测效果基本介绍程序设计参考资料预测效果

linux应急响应基础命令

一、cpu使用率-top top -c -o %CPU -c 显示进程的命令行参数 -o 按照CPU占用从大到小排序二、用户信息 1、查看系统所有用户信息 [rootcentos7 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nol…

FlexLua低代码技术,十分钟搞定4G转LoRa网关设备

在当今物联网时代&#xff0c;无线通信技术的发展日新月异&#xff0c;4G和LoRa作为两种不同的通信技术&#xff0c;各自拥有独特的优势和应用场景。而4G转LoRa网关设备的出现&#xff0c;则将这两种技术有效地结合起来&#xff0c;为物联网应用提供了更多可能性。 4G转LoRa网关…

室内设计师必备的免费3D模型网站,赶紧收藏!

3D模型已经成为室内设计师的重要工具。它们不仅能够帮助设计师更好地理解和呈现他们的设计概念&#xff0c;还能够提高工作效率&#xff0c;减少错误和修改的次数。然而&#xff0c;许多高质量的3D模型都需要付费购买&#xff0c;那么室内设计师必备的免费3D模型网站有哪些? 首…

探索C# 11与.NET 7:入门指南与跨平台开发

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

SpringBoot整合支付宝入门

支付宝支付 对接流程 申请阿里支付官方企业账号配置应用签约产品获取RSAKey&#xff08;非对称加密&#xff09;必须获得两个加密串&#xff1a;一个公钥&#xff0c;一个密钥SDK功能开发业务对接支付回调支付组件 核心所需的参数 APPID商家私钥支付宝公钥支付回调地址网关…

Backend - Django Swagger

目录 一、安装依赖 二、配置环境 三、路由&#xff08;urls&#xff09; 四、swagger UI 界面 &#xff08;一&#xff09;UI 界面 &#xff08;二&#xff09;单引号问题&#xff1a;Expecting property name enclosed in double quotes 1. 原因 2. 解决 五、自定义s…

【技能拾遗】——Markdown+Typora/VSCode与LaTeX的使用

&#x1f4d6; 前言&#xff1a;Markdown 是一种轻量型标记语言&#xff0c;是一种语法. 以 .md 结尾的文本文件就是 Markdown 文件。 相较于 Word&#xff0c;它更加像是 HTML 语言或是 LaTeX \LaTeX LATE​X&#xff0c;并不是最淳朴的那种"所见即所得"。 它处处透…

RTX 腾讯通停止服务,有哪些平滑升级迁移替代方案?

RTX腾讯通&#xff0c;作为腾讯公司于2003年推出的企业即时通讯软件&#xff0c;曾经在政企单位中得到广泛应用。然而&#xff0c;自2015年后&#xff0c;这款软件就未曾更新&#xff0c;近期腾讯将RTX腾讯通官网的域名更改为跳转到企业微信官网&#xff0c;这意味RTX腾讯通正式…

AGI的智力有可能在两年内超过人类水平

特斯拉CEO埃隆马斯克近日与挪威银行投资管理基金CEO坦根的访谈中表示&#xff0c;AGI的智力将在两年内可能超过人类智力&#xff0c;在未来五年内&#xff0c;AI的能力很可能超过所有人类。 马斯克透漏&#xff0c;去年人工智能发展过程中的主要制约因素是缺少高性能芯片&#…

Leetcode-移除链表元素

203. 移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&…

一张图教你看懂亚马逊云科技的超过200个云服务

亚马逊云科技&#xff08;AWS&#xff09;是业界服务种类最全面的☁️厂商&#xff0c;目前有超过200种服务&#xff0c;那这么多服务能否一次性把他们都记住呢&#xff1f; 小李哥给大家带来一张AWS 200项服务列表&#xff0c;大家一眼就能看懂这些服务的使用场景。欢迎大家在…

【HarmonyOS 4+NEXT】开发工具安装指南

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;开发工具安装 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS4NEXT&#xff1a;探索未来智能生态新纪元 文章目录 前言准备工作下载开发工具安装开发工具配置开发环境总结 前言 随着科技的不断进步&#xff0c;智能设…

硬阈值什么意思?

硬阈值是一种非线性函数&#xff0c;常用于信号处理和数据压缩中的阈值处理。具体来说&#xff0c;硬阈值将输入信号中小于或等于给定阈值的值设为零&#xff0c;而大于阈值的值保持不变。数学表示如下&#xff1a; Hard(x, T) { 0, if |x| ≤ T; x, if |x| > T } 其中&a…

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

芯洲SCT55610三相栅极驱动器,打造高效无刷直流电机系统

近年来的&#xff0c;无刷直流电机&#xff08;Brushless DC Motor, BLDC&#xff09;在工业、汽车、家电、医疗器械等各个领域得到广泛应用。相对于传统有刷电机&#xff0c;BLDC电机具有以下优势&#xff1a;高效率、寿命长、低噪音、小型化和精确控制。这些优势使得BLDC电机…