【个人模板】高精度算法

一、求两个高精度正数的和差积

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 const int MAXN=1000;
 7 char s1[MAXN],s2[MAXN];
 8 int ed1,ed2,n1,n2;
 9 int num1[MAXN];
10 int num2[MAXN];
11 int ans[MAXN];
12
13 void input()
14 {
15     scanf("%s%s",s1,s2);
16     ed1=strlen(s1)-1;
17     ed2=strlen(s2)-1;
18 }
19
20 void switchnum()//把字符转换为数字
21 {
22     memset(num1,0,sizeof(num1));
23     memset(num2,0,sizeof(num2));
24     for (int i=ed1;i>=0;i--) num1[ed1-i]=s1[i]-‘0‘;
25     for (int i=ed2;i>=0;i--) num2[ed2-i]=s2[i]-‘0‘;
26 }
27
28 void add()
29 {
30     memset(ans,0,sizeof(ans));
31     int ed=max(ed1,ed2),carry=0;
32     for (int k=0;k<=ed;k++)
33     {
34         ans[k]=num1[k]+num2[k]+carry;
35         carry=ans[k]/10;
36         ans[k]=ans[k]%10;
37     }
38     if (carry>0)
39     {
40         ed++;
41         ans[ed]=carry;
42     }
43     for (int k=ed;k>=0;k--) cout<<ans[k];cout<<endl;
44 }
45
46 void sub()
47 {
48 /*strcmp是字符串比较函数,作用是比较字符串1和字符串2
49 如:strcmp(str1,str2);
50   strcmp("china","korea");
51 比较的结果由函数带回。
52 (1)如果字符串1=字符串2,函数值为0。
53 (2)如果字符串1〉字符串2,函数值为一正整数
54 (3)如果字符串1<字符串2,函数值为一负整数*/
55     memset(ans,0,sizeof(ans));
56     int ed=max(ed1,ed2),f=strcmp(s1,s2),deco=0;
57     for (int k=0;k<=ed;k++)
58     {
59         if (f>=0) ans[k]+=num1[k]-num2[k];
60         else ans[k]+=num2[k]-num1[k];
61         if (ans[k]<0)
62         {
63             ans[k]+=10;
64             ans[k+1]--;
65         }
66     }
67     if (0==ans[ed]) ed--; //这里不能写成ans[ed]=0,否则会进行赋值
68     for (int k=ed;k>=0;k--) cout<<ans[k];cout<<endl;
69 }
70
71 void mul()
72 {
73     memset(ans,0,sizeof(ans));
74     int ed=ed1+ed2;
75     for (int i=0;i<=ed1;i++)
76         for (int j=0;j<=ed2;j++)
77         {
78             ans[i+j]+=num1[i]*num2[j];
79             if (i+j>0)
80             {
81                 ans[i+j]+=ans[i+j-1]/10;
82                 ans[i+j-1]%=10;
83             }
84         }
85     for (int k=ed;k>=0;k--) cout<<ans[k];cout<<endl;
86 }
87
88 int main()
89 {
90     input();
91     switchnum();
92     add();
93     sub();
94     mul();
95     return 0;
96 } 

二、求一个高精度正数和一个低精度正数的商和余数

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int MAXN=1000;
 6 char a[MAXN];
 7 int num[MAXN];
 8 int b,rem;
 9
10 int main()
11 {
12     scanf("%s%d",a,&b);
13     for (int i=0;i<strlen(a);i++) num[i]=a[i]-‘0‘;
14     rem=0;
15     bool f=false;
16     for (int i=0;i<strlen(a);i++)
17     {
18         rem=rem*10+num[i];
19         if (rem>b) f=true;
20         if (f) cout<<rem/b;
21         rem%=b;
22     }
23     cout<<endl;
24     if (rem!=0) cout<<rem<<endl;
25     return 0;
26 }
时间: 2024-10-25 18:43:04

【个人模板】高精度算法的相关文章

c++加法高精度算法

c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就是把数组编程字符串,然后将字符串像竖式一样加起来: 1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 using namespace std; 5 int main() 6 { 7 char a[

转载:C++之高精度算法

C++之高精度算法 注意:本文转载自http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html,十分感谢原作者:忍者 前言:由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供15~16位的有效数字,即只能精确表达数百万亿的数.因此,在计算

高精度算法

以下标程均为十进制,如改为10n进制可提高n倍速度. 建议不要使用operator对运算符进行重载,虽然用起来很方便,但是NOIP中不一定能用,速度也会慢一些. 高精度数大小比较 function a_dy_b(a,b:arr):boolean; var i:integer; begin i:=a[0]; if a[0]<>b[0] then a_dy_b:=a[0]>b[0] else begin while (a[i]=b[i])and(i>0) do dec(i); a_dy

LeetCode43,一题让你学会高精度算法

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实没什么好说的,以字符串的形式给定两个数字,要求返回这两个数字的乘积.之所以是以字符串的形式给数字是因为这个数字可能会非常大,题目当中给定的范围是110位的数字.对于Python来说这不是问题,但是对于C++和Java等语言来说这么大的数字是无法以int类型存储的,所以必须要使用字符串来接收. 如果你

蓝桥杯 贪心模板 _算法提高 快乐司机

#include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> using namespace std; const int maxn = 10000 + 200; struct Lorry { float weight; float value; float pro; Lorry(float w = 0, float v = 0, float pro = 0) :

HDU 1269 强连通模板 Tarjan算法

求强连通量,为1输出Yes否则No Tarjan算法模板 具体讲解:https://www.byvoid.com/zht/blog/scc-tarjan #include "stdio.h" #include "string.h" struct Edge { int v,next; }edge[100010]; int head[10010],stack[10010],dfn[10010],low[10010]; // stack栈: dfn深搜次序数组:low结点

洛谷P3805 [模板]Manacher算法 [manacher]

题目传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格式: 一个整数表示答案 输入输出样例 输入样例#1: aaa 输出样例#1: 3 说明 字符串长度len <= 11000000 分析:manacher算法模板,算法分析就不具体讲了,five20大佬讲的挺好的,可以参照一下他的博客. Code: 1 //It is made by Ho

[模板]KMP算法

昨天晚上一直在调KMP(模板传送门),因为先学了hash[关于hash的内容会在随后进行更(gu)新(gu)]于是想从1开始读...结果写出来之后一直死循环,最后我还是改回从0读入字符串了. [预先定义被匹配文本串为s1,长度为m:匹配模式串为s2,长度为n] KMP算法在字符串匹配算法中时间复杂度比较优,可以做到在O(m+n)的时间内匹配,相对于无脑暴力匹配的O(m*n)复杂度而言要优很多. KMP算法的思路比较简单,即在匹配前对字符串进行预处理,用空间换时间,通过处理next数组来实现在部分

卡特兰数高精度算法

很多组合题都会用到卡特兰数,增长速度又很快,应该写个高精度尊敬一下~ 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define ML 549 5 using namespace std; 6 int kt[105][550]; 7 int len[105]; 8 int getlen(int ord) 9 { 10 int pos; 11 for(int i=ML;i>=0;i