高精度算法①

实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。对于此类超大数据我们通常采用数组来存储这个数字的每一位数,然后模拟加减乘除的运算法则进行运算。根据难度排序有:
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. Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现
  2. mysql双主使用reset master清除日志要小心
  3. [学习笔记]最小圆覆盖
  4. 调试pcb板子的步骤
  5. JSP完全自学手册图文教程
  6. 组件化的css-module
  7. Linux系统CUDA10.2+CUDNN安装教程
  8. C++:10---再议拷贝构造函数
  9. 每次请求刷新token的时间
  10. torch GPU分布式训练 模型并行
  11. 服务器上安装声卡稳定吗,服务器加装声卡的故障
  12. PMP第六版备考笔记练习题答疑(持续更新)
  13. excel财务案例建模_Pro Excel财务建模:技术创业公司的构建模型
  14. iwork8旗舰版 android,性能彪悍 双面神兽——酷比魔方iwork8旗舰版体验
  15. 关于用指针实现输入字符串以单词为元素反转输出思路
  16. 计算机 睡眠 无法打印,台式机睡眠后打不开怎么办
  17. Windows系统设置定时任务
  18. Jenkins Pipeline 小试牛刀以及引入指定的环境变量
  19. 汽车美容店会员开卡办理html,洗车店会员卡管理系统线下线上会员一体化?
  20. 安搭Share:当色彩与文物碰撞会擦出什么火花

热门文章

  1. 软件测试工程师在职研究生,​运维工程师考在职研究生有什么报考条件?
  2. 【提取新闻主要内容之一】从具体的新闻网页中提取标题和作者信息
  3. unterminated string literal
  4. 今天阿里巴巴让我在线编程
  5. 2011奥斯卡金像奖获奖名单(呵呵,里面的电影还是值得去看的!(*^__^*) )
  6. 带你认识AIOps智能运维
  7. MySql通过身份证号码计算年龄和性别
  8. Java实现pdf文件添加水印,铺满全页。
  9. 大数据常见压缩格式以及性能对比
  10. CSCI 1100 — Computer Science Homework