思路如标题所说采用模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进制均可)的更多相关文章

  1. SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0

    最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...

  2. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accep ...

  3. PTA 哈希查找 除留取余法

    PTA 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...

  4. matlab取模与取余

    mod函数采用floor,rem函数采用fix函数.那么什么是floor和fix? fix(x):截尾取整.如: >> fix([3.4 , -3.4]) ans = 3 -3 floor ...

  5. Java之取余操作 "%"

    取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2. ...

  6. cogs 2170. 大整数取模

    2170. 大整数取模 ★   输入文件:bigint.in   输出文件:bigint.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 输入正整数n和m,输出n mo ...

  7. poj2305-Basic remains(进制转换 + 大整数取模)

    进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串-&g ...

  8. 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】

    3751: [NOIP2014]解方程 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4856  Solved: 983[Submit][Status ...

  9. C语言fmod()函数:对浮点数取模(求余)

    头文件:#include <math.h> fmod() 用来对浮点数进行取模(求余),其原型为:    double fmod (double x); 设返回值为 ret,那么 x = ...

  10. java 取模运算% 实则取余 简述 例子 应用在数据库分库分表

    java 取模运算%  实则取余 简述 例子 应用在数据库分库分表 取模运算 求模运算与求余运算不同.“模”是“Mod”的音译,模运算多应用于程序编写中. Mod的含义为求余.模运算在数论和程序设计中 ...

随机推荐

  1. Java 散列表HashTable

    什么是散列表hash table和使用场景 什么是散列表 散列表(Hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来 ...

  2. Java 中的泛型 集合(List,Set) Map

    泛型 集合(List,Set) Map 泛型 泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性 泛型的具体定义与作用 定义:泛型是一种在编译阶段进行类型检查 ...

  3. 「Pygors跨平台GUI」2:安装MinGW-w64、MSYS2还是WSL2

    「Pygors系列」一句话导读: MinGW-w64只有编译器,MSYS2带着更新环境,WSL2实用性比较高 历史与渊源   Windows平台 Linux平台 二进制兼容 WSL2:运行Linux程 ...

  4. js需要同时发起百条接口请求怎么办?--通过Promise实现分批处理接口请求

    如何通过 Promise 实现百条接口请求? 实际项目中遇到需要发起上百条Promise接口请求怎么办? 前言 不知你项目中有没有遇到过这样的情况,反正我的实际工作项目中真的遇到了这种玩意,一个接口获 ...

  5. 数据仓库建模工具之一——Hive学习第四天

    Hive的基本操作 1.3HIve的表操作(接着昨天的继续学习) 1.3.2 显示表 show tables; show tables like 'u*'; desc t_person; desc f ...

  6. 手把手帮助你搭建属于自己的个人博客,使用cervel部署,无需后端

    1.项目简介 项目使用了vue+elementUI技术栈,通过读取本地md文件实现博客文章的展示,使用vercel实现自动化部署,纯前端项目,无需后端 第一步:下载源码 仓库地址: github:ht ...

  7. 从DDPM到DDIM(四) 预测噪声与后处理

    从DDPM到DDIM(四) 预测噪声与后处理 前情回顾 下图展示了DDPM的双向马尔可夫模型. 训练目标.最大化证据下界等价于最小化以下损失函数: \[\boldsymbol{\theta}^*=\u ...

  8. 使用 $fetch 进行 HTTP 请求

    title: 使用 $fetch 进行 HTTP 请求 date: 2024/8/2 updated: 2024/8/2 author: cmdragon excerpt: 摘要:文章介绍了Nuxt3 ...

  9. 【Java】Input,Output,Stream I/O流 01 概述 & 4个基础流

    Input,Output,Stream IO流 I/O Input/Output缩写.I/O技术用于处理设备之间的数据传输,读写文件,网络通讯 Java程序对于数据的操作以Stream流的形式进行 i ...

  10. 【C】Re08 内存

    一.概述 程序运行之后,所有的数据加载到内存上 内存会被操作系统进行分区处理, 划分的区域主要分为4个: [1.代码文本区 text] 存放开发者编写的代码文本,二进制内容形式 [2.静态全局区 St ...