高精度算法①

实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。对于此类超大数据我们通常采用数组来存储这个数字的每一位数,然后模拟加减乘除的运算法则进行运算。根据难度排序有:
1.高精度除高精度(暂时还不会)
2.高精度减高精度(暂时还不会)
3.高精度乘高精度(这个暂时会,P1303 A*B Problem)
4.高精度加高精度(P1601 A+B Problem)
5.高精度除低精度(P1480 A/B Problem)

目录

1.1我的题解
1.2佬①的题解
1.3佬②的题解
1.4 佬③我修改后的题解
1.5 易犯的错误、需要注意的点
1.6总结

OK进入正题


注意到a,b的取值范围其中a明显是超出数据范围的数据,b恰好是int类型范围内的数据,籍此我们可以判断这是一个高精度除低精度的题目
(顺路复习下数值范围)

:类型名称 字节数 取值范围 备注
signed char 1 -2^7(-128) ~ 2^7-1(127) 10^2
short 2 -2^15(-32 768) ~ 2^15-1(32 767) 10^4
int 4 -2^31(-2 147 483 648) ~ 2^31-1(2 147 483 647) 10^9
long 4 -2^31(-2 147 483 648) ~ 2^31-1(2 147 483 647) 10^9
long long 8 -2^63(-9.2233720368548e+18) ~ 2^63-1(9.2233720368548e+18) 10^18

我の题解 VS 佬的题解

我の题解:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){//定义部分int len1,b,m=0,d=0,flag=1;char a[20000];int c[20000],e[20000];//数据预处理:将超出范围的大整数以字符串形式存入a内,再转化为int类型的数组scanf("%s",a);getchar();scanf("%d",&b);len1=strlen(a);//测出数字的长度方便后续循环处理memset(c,0,sizeof(c));memset(e,0,sizeof(c));//将数组c,e全部置为0for(int i=1;i<=len1;i++){c[i]=a[i-1]-'0';//下标从1开始,将字符形式的数字转化为int类型,//故要减去字符形式的‘0’,此时asc2码的差值即该数字}//算法核心:模拟除式for(int i=1;i<=len1;i++){e[i]=((m*10+c[i])/b);//(上一位被除数的余数乘10加现在这一位被除数)/除数m=(m*10+c[i])%b; //下一位的余数=(上一位被除数的余数乘10加现在这一位被除数)%除数}////输出部分:for(int i=1;i<=len1;i++){while(e[i]==0&&flag==1&&i<len1){if(e[i+1]!=0){flag=0;i++;break;}//去除无用的前缀0i++;}printf("%d",e[i]);}getchar();
}

佬の题解

#include<string>
#include<iostream>
using namespace std;
string a,c;
int b,i,d;
int main()
{cin>>a>>b;   //神奇的读入for (;i<a.length();i++)a[i]-=48;   //字符串转数字for (i=0;i<a.length();i++)c.push_back((d*10+a[i])/b+48),d=(d*10+a[i])%b;  //模拟竖式//佬的这个逗号用的很炫技,省了两个括号的位置for (i=0;c[0]==48;i++)c.erase(c.begin(),c.begin()+1);   //去0cout<<c;   //华丽的输出return 0;     //完美的结束
}

要看懂佬的操作还要有一定的知识储备:

.push_back():在字符串或vector后插入一个字符
.erase(size_type pos=0, size_type n=npos):删除字符:从pos处开始,删除 npos个字符

可以看出思路是一样的,
但是不得不说起码佬的去零方法比我简便多了,佬是利用string的函数将字符串首的0都去除了。
也可以看出我memset了一通没有任何卵用。可以直接把数组开在全局变量中,这样初值为0,局部变量的话会随机赋初值

#### 佬②の题解

#include<bits/stdc++.h>
using namespace std;
long long a,b,f,n,pd=0;
//a:被除数中的某一位数字 ,f:商中的某一位数字 ,n:除法算式中每次剩下来的余数 ,pd:判断是否输出过数字
string p;
int main(){cin>>p>>b;for(int x=0;x<p.size();x++){a=p[x]-48,n=n*10+a,f=n/b,n%=b;if(pd||f)pd=1,cout<<f;}//计算出这一位的商 ,并且判断能否输出return 0;//望管理员通过
}

可以看出佬②并不比佬①朴实多少
把佬②的程序拆解一下

for(int x=0;x<p.size();x++){a=p[x]-48,n=n*10+a,f=n/b,n%=b;
if(pd||f)pd=1,cout<<f;
}

思路还是一样,佬②是每得出一个数就输出
佬②的去前缀0的方法也很高级,pd或f有一个为真,pd即为假,所以截止到f第一次不为0,之前为f=0的时候均不输出。

我修改后的题解:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){//定义部分int b,m=0,d=0,flag=0;char a[20000];int c[20000];scanf("%s",a);getchar();scanf("%d",&b);for(int i=1;i<=strlen(a);i++){c[i]=a[i-1]-'0';e[i]=((m*10+c[i])/b);m=(m*10+c[i])%b; } //输出部分:for(int i=1;i<=len1;i++){if(flag||e[i])flag=1,printf("%d",e[i]);}getchar();
}

所以:我 == 佬!!!

易犯的错误、需要注意的点

  1. 数组要开的足够大,否则RE
  2. 注意去除前缀0
  3. %s读取字符串后记得getchar() 掉 ‘\n’

总结

本题不是很难,注意细节,记得高精度的核心:

用数组存储越界数字的每一位,通过模拟加减乘除来得到运算结果

高精度除低精度核心:

   for(int i=1;i<=len1;i++){e[i]=((m*10+c[i])/b);//(上一位被除数的余数乘10加现在这一位被除数)/除数m=(m*10+c[i])%b; //下一位的余数=(上一位被除数的余数乘10加现在这一位被除数)%除数}

高精度① 洛谷P1480相关推荐

  1. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

  2. 高精度——A+B Problem(洛谷 P1601)

    高精度算法指的是可以计算很大整数的高精度运算的方法 此题选自洛谷P1601 用数组来模拟非常长的整数,这意味着可以用数组的每一位记录那个数字上的每一位. 也就是说,可以用n位数组来记录一个n位数字. ...

  3. 洛谷算法题单:模拟与高精度例题(上)

    一:模拟 想要利用计算机解决现实生活中的一些复杂的问题时,建立模型是解决问题的关键. 举个生活中常见的例子:我们拿到了某次数学考试的成绩单,现在需要知道谁考得最好.当然不能把成绩单对着电脑晃一晃,然后 ...

  4. (快速幂算法+高精度)洛谷P1045 麦森数

    前言   故事的最后,让我们以一道十分经典的题目--<麦森数>来结尾.接受现实吧,总会有我们没准备过的高精度运算出现.我们固然可以提前把高精度的快速幂模板也准备好,但是总会有百密一疏的时候 ...

  5. 递推+高精度——蜜蜂路线(洛谷 P2437)

    题目选自洛谷P2437 思路和斐波那契一样,不过特判a[0][1]=0a[1[1]=1,a[2][1]=1,之后,a[i][j]=a[i-1][j]+a[i-2][j],这是主要公式,为什么开二维数组 ...

  6. python高精度乘法_洛谷P1919--A*B Problem升级版(NTT优化高精度乘法)

    题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a,b,求$ a \times b$. 输入格式 第一行一个正整数,表示 a: ...

  7. 洛谷算法题单:模拟与高精度例题(下)

    接着上篇的例题. 1.洛谷P4924魔法少女小Scarlet 题目描述: Scarlet最近学会了一个数组魔法,她会在n∗n二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90°, 首先,Scarl ...

  8. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  9. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

最新文章

  1. python魔法方法中的__str__和__repr__区别
  2. Redis的设计与实现之整数集合和压缩列表
  3. 在 iOS 或者 Mac OS X 中将 NSDictionary 映射为本地对象的方法
  4. Linux—系统文件和目录介绍
  5. 面试大厂应该注意哪些问题?算法太TM重要了
  6. 【python教程入门学习】python值得学吗,怎么自学?
  7. 请不要“妖魔化”外包岗位!
  8. python3 beautifulsoup4_Python 3.x 安装 BeautifulSoup4 最佳实践
  9. iterator获取当前元素_java集合【5】——— Iterator接口
  10. html 竖排导航条,html 导航栏
  11. Windows窗口命令大全
  12. python竖线_python 读取竖线分隔符的文本方法
  13. EXCEL POI单元格下拉的两种实现方式
  14. 企业电子招投标采购系统源码之电子招标采购是管理复杂供应链和多层供应商的高效方式
  15. 论文阅读学习 - 深度学习网络模型分析对比
  16. Linux Mint + win10 双系统初体验
  17. HC32L136/HC32L176开发之硬件IIC驱动AT24C64
  18. 如何快速设置CorelDRAW中网格
  19. 刚刚,2019年中国信息通信服务交流研讨会盛大召开!
  20. linux samba 实验 Windows无法访问\\ 请检查名称的拼写。否则,网络可能有问题。 就一个小问题!!已解决!!!

热门文章

  1. I’M YOUR DJ(RAP版)铃声 I’M YOUR DJ(RAP版)手机铃声免...
  2. 2019.12.11汇报课反思
  3. fpga板子怎么和电脑连_FPGA通过以太网与PC机通信完整方案-可编程逻辑-与非网
  4. visionPro通过网线连接海康相机踩过的坑
  5. 【常见】HBuilderX 运行模拟器 完整配置教程
  6. 8 - nn.Module源码讲解(下)
  7. 首销日到手价1499元起!全智能手表旗舰OPPO Watch 3系列正式开售
  8. 心理咨询APP开发结合互联网的系统化管理,更好地满足用户需求
  9. 矩阵图的四个算法 - DFS、BFS、Dijkstra、Topological Sort
  10. CMD命令提示符窗口中的快捷键、小技巧和常用命令