模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的含义为求余.模运算在数论和程序设计中 ...
随机推荐
- PS工具的基本使用
常见的图片格式: 切片工具的使用 1.用切片选中图片 2.导出切片 3.切片悬着工具 可以选择指定 切片框 删除. 点击图层 切图 清除切片 基于参考线的切片 切图插件Cutterman
- flutter 一直卡在Running Gradle task 'assembleDebug'...运行不起来
大概率只有一个原因:gradle下载不完整! 要想办法让他下载完整! 解决方法: 方法一:修改远程maven仓库地址(2024.7.9下列地址可用) repositories{ maven{ url' ...
- c 语言学习第六天
数组 语法: 类型 数组名[元素个数]; int a[6]; // 4*6 字节 char b[24]; // 1*24 字节 double c[2]; // 2*8 字节 访问数组中的元素 语法: ...
- oeasy教您玩转vim - 25 - 更多颜色
更多颜色 回忆上节课内容 我们上次深入了配色方案 定义了自己的配色方案 oeasy 建立了自己的配色 oeasy 在状态栏应用了自己的配色 明确能用的颜色 先胡乱地尝试一下修改颜色代码 hi ...
- CF1204A 题解
洛谷链接&CF 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定一个二进制字符串 \(S\),求这个二进制数包含 \(4 ^ k\) 的个数. 特殊的:若 ...
- OpenGL 4.0中数据缓冲VBO,VAO,EBO的使用总结
Opengl是大家常用的一个API,我们用它绘制数据的时候需要使用vao,vbo,ebo等对象,绘制方式分为 vao绘制,ebo绘制等.使用不同api还能分为普通调用以及Instance绘制. 首先申 ...
- 胜未来:国内大模型+Agent应用案例精选,以及主流Agent框架开源项目推荐
智胜未来:国内大模型+Agent应用案例精选,以及主流Agent框架开源项目推荐 Agent是以大模型为核心的智能体,通过与用户对话的形式,来完成各种任务,它很像一个"人".如果和 ...
- Jmeter函数助手18-machineIP
machineIP函数用于获取本地IP地址. 存储结果的变量名(可选) 1.本地ip可以在cmd运行界面输入命令"ipconfig"查看,Jmeter则使用函数获取${__mach ...
- 【Java】利用反射更改String的字符
问题: 在不改变s变量引用的String对象的情况下,输出打印"abcd" /*** * * @param args * @return void * @author cloud9 ...
- 【SVN】提交失败报错
SVN提交失败: 最后信息是提示 请输入日志消息,至少需要20个字符,提交终止 问题原因是: 提交的时候不要把提交信息换行来写,SVN只会读取第一行内容 如果消息没有问题还提交失败,可能是文件因为提交 ...