模N取余法实现大整数进制转换 ——C语言版(2-16进制均可)
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。
个人推荐先到这篇博客学习一下,大佬的思路就是不一样:大数除法——超详细讲解
我所做的就是在上面博文代码的基础上增加了循环,用一个字符数组逆序存储余数,最后再逆序输出就得到了正确结果。具体代码及注释如下,目前我本人测试无误,能够正确运行。如果有的朋友准备拿这份代码在Leetcode之类的网站进行提交的话,希望可以再优化一下(这个执行效率不算太理想)。有什么看不懂的地方或者代码里出现错误,欢迎在评论区留言,我会及时回复的。
#include<stdio.h>
#include<string.h> /*
* 整体思路就是模n取余,每次做完除法得到的商再次除以n,直到商小于除数
*/
char a[100],b[100],z[100],m[100];//要转换的数 进制 商 进制转换后的表示数 int x[100],y[100];//被除数 除数 int digit; //大数的位数 void sub(int x[],int y[],int len1,int len2)//大数减法
{
int i;
for(i=0;i<len1;i++)
{
if(x[i]<y[i])//当前位不够减,借位
{
x[i]=x[i]+10-y[i];
x[i+1]--;
}
else//够减,无需借位
x[i]=x[i]-y[i];
}
for(i=len1-1;i>=0;i--)//判断减法结束之后,被除数的位数
{
if(x[i])
{
digit=i+1;
break;
}
}
} int judge(int x[],int y[],int len1,int len2)
{//比较x,y数组长度的函数
int i;
if(len1<len2)
return -1;
if(len1==len2)//若两个数位数相等
{
for(i=len1-1;i>=0;i--)
{
if(x[i]==y[i])//对应位的数相等
continue;
if(x[i]>y[i])//被除数 大于 除数,返回值为1
return 1;
if(x[i]<y[i])//被除数 小于 除数,返回值为-1
return -1;
}
return 0;//被除数 等于 除数,返回值为0
}
} int changeBase(int len1, int len2)
{//进制转换
int i,j=0,k,in=0,temp;//数组下标和变量 int len;//len两个大数位数的差值 while(len1>1||a[0]!='0')//只要被除数仍然大于'0',那就继续做除法
{
//将字符串中各个元素倒序储存在数组中
for(i=len1-1,j=0;i>=0;i--)
{
x[j++]=a[i]-'0';
}
for(i=len2-1,k=0;i>=0;i--)
{
y[k++]=b[i]-'0';
} if(len1<len2)
{ //当被除数位数 小于 除数位数时
int rest=0;//变量,保存余数的值 for(i=len1;i>0;i--)
{//跳过前导0
if(x[i]) break;
}
//算出余数并将余数转换为16进制
for(;i>=0;i--)
rest=rest*10+x[i];
if(rest<10)//字符0的ASCII码值为48,存储余数小于10数字时要加48
m[in++]=rest+48;
else//字符A的ASCII码值为65,存储余数对应的大于等于10的数字时要加55,即’A‘,'B'……
m[in++]=rest+55;
break;
}
else //当被除数位数 大于或者等于 除数位数时
{
len=len1-len2;//两个大数位数的差值
for(i=len1-1;i>=0;i--)//将除数后补零,使得两个大数位数相同。
{
if(i>=len)
y[i]=y[i-len];
else
y[i]=0; }
len2=len1;//将两个大数数位相同 digit=len1; //将原被除数位数赋值给digit for(j=0;j<=len;j++)
{
z[len-j]='0'; while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数的大小以及被除数位数与除数原位数的关系
{
sub(x,y,len1,len2); //大数减法函数 z[len-j]++;//储存商的每一位 len1=digit;//重新修改被除数的长度 if(len1<len2&&y[len2-1]==0)
len2=len1; //将len1长度赋给len2;
} if(temp<0)//若被除数 小于 除数,除数减小一位。
{
for(i=1;i<len2;i++)
y[i-1]=y[i];
y[i-1]=0;
if(len1<len2)
len2--;
}
} for(i=len;i>0;i--)//跳过前导0
{
if(z[i]!='0') break;
}
int t=0,rest=0; for(;i>=0;i--,t++)//把商复制给 a数组,继续做被除数
a[t]=z[i];
a[t]='\0'; for(i=len1;i>0;i--)//跳过前导0
{
if(x[i]) break;
}
//算出余数并将余数转换为16进制
for(;i>=0;i--)
rest=rest*10+x[i];
if(rest<10)
m[in++]=rest+48;
else
m[in++]=rest+55;
len1=strlen(a);//重新计算被除数位数
len2=strlen(b);//重新计算除数位数
}
}
return in;//返回m数组的长度
} int main()
{
int l1,l2,k;
printf("请依次输入要转换的数和对应进制:\n");
scanf("%s %s",a,b);//a表示要转换的大整数,b代表要转换的进制
l1=strlen(a);//被除数位数
l2=strlen(b);//除数位数
//进行进制转换
k=changeBase(l1,l2);
printf("转换之后对应的数为:\n");
for(k-=1;k>-1;k--)//输出转换后的进制数
printf("%c",m[k]);
return 0;
}
使用示范(以转换为16进制为例):

模N取余法实现大整数进制转换 ——C语言版(2-16进制均可)的更多相关文章
- SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0
最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...
- poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 30529 Accep ...
- PTA 哈希查找 除留取余法
PTA 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...
- matlab取模与取余
mod函数采用floor,rem函数采用fix函数.那么什么是floor和fix? fix(x):截尾取整.如: >> fix([3.4 , -3.4]) ans = 3 -3 floor ...
- Java之取余操作 "%"
取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2. ...
- cogs 2170. 大整数取模
2170. 大整数取模 ★ 输入文件:bigint.in 输出文件:bigint.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 输入正整数n和m,输出n mo ...
- poj2305-Basic remains(进制转换 + 大整数取模)
进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串-&g ...
- 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】
3751: [NOIP2014]解方程 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4856 Solved: 983[Submit][Status ...
- C语言fmod()函数:对浮点数取模(求余)
头文件:#include <math.h> fmod() 用来对浮点数进行取模(求余),其原型为: double fmod (double x); 设返回值为 ret,那么 x = ...
- java 取模运算% 实则取余 简述 例子 应用在数据库分库分表
java 取模运算% 实则取余 简述 例子 应用在数据库分库分表 取模运算 求模运算与求余运算不同.“模”是“Mod”的音译,模运算多应用于程序编写中. Mod的含义为求余.模运算在数论和程序设计中 ...
随机推荐
- Java 散列表HashTable
什么是散列表hash table和使用场景 什么是散列表 散列表(Hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来 ...
- Java 中的泛型 集合(List,Set) Map
泛型 集合(List,Set) Map 泛型 泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性 泛型的具体定义与作用 定义:泛型是一种在编译阶段进行类型检查 ...
- 「Pygors跨平台GUI」2:安装MinGW-w64、MSYS2还是WSL2
「Pygors系列」一句话导读: MinGW-w64只有编译器,MSYS2带着更新环境,WSL2实用性比较高 历史与渊源 Windows平台 Linux平台 二进制兼容 WSL2:运行Linux程 ...
- js需要同时发起百条接口请求怎么办?--通过Promise实现分批处理接口请求
如何通过 Promise 实现百条接口请求? 实际项目中遇到需要发起上百条Promise接口请求怎么办? 前言 不知你项目中有没有遇到过这样的情况,反正我的实际工作项目中真的遇到了这种玩意,一个接口获 ...
- 数据仓库建模工具之一——Hive学习第四天
Hive的基本操作 1.3HIve的表操作(接着昨天的继续学习) 1.3.2 显示表 show tables; show tables like 'u*'; desc t_person; desc f ...
- 手把手帮助你搭建属于自己的个人博客,使用cervel部署,无需后端
1.项目简介 项目使用了vue+elementUI技术栈,通过读取本地md文件实现博客文章的展示,使用vercel实现自动化部署,纯前端项目,无需后端 第一步:下载源码 仓库地址: github:ht ...
- 从DDPM到DDIM(四) 预测噪声与后处理
从DDPM到DDIM(四) 预测噪声与后处理 前情回顾 下图展示了DDPM的双向马尔可夫模型. 训练目标.最大化证据下界等价于最小化以下损失函数: \[\boldsymbol{\theta}^*=\u ...
- 使用 $fetch 进行 HTTP 请求
title: 使用 $fetch 进行 HTTP 请求 date: 2024/8/2 updated: 2024/8/2 author: cmdragon excerpt: 摘要:文章介绍了Nuxt3 ...
- 【Java】Input,Output,Stream I/O流 01 概述 & 4个基础流
Input,Output,Stream IO流 I/O Input/Output缩写.I/O技术用于处理设备之间的数据传输,读写文件,网络通讯 Java程序对于数据的操作以Stream流的形式进行 i ...
- 【C】Re08 内存
一.概述 程序运行之后,所有的数据加载到内存上 内存会被操作系统进行分区处理, 划分的区域主要分为4个: [1.代码文本区 text] 存放开发者编写的代码文本,二进制内容形式 [2.静态全局区 St ...