[SinGuLaRiTy] 高精度算法代码库
【SinGuLaRiTy-1001】 Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved.
加法:
#include<stdio.h>
#include<string.h>
char a[],b[];
char c[];
int i;
void swap(char a[])
{
char tmp;
for(int i=;i<strlen(a)/;i++)
{
tmp=a[i];
a[i]=a[strlen(a)--i];
a[strlen(a)--i]=tmp;
}
}
void add(char a[],char b[])
{
for(i=;i<strlen(a)&&i<strlen(b);i++)
{
c[i]+=a[i]+b[i]-'';
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(strlen(a)==strlen(b))
if(c[i]==)
c[i]='';
if(strlen(a)>strlen(b))
{
if(c[i]==)
{
for(;i<strlen(a);i++)
{
c[i]+=a[i];
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(c[i-]=='')
c[i]='';
}
else
for(;i<strlen(a);i++)
c[i]=a[i];
}
if(strlen(b)>strlen(a))
{
if(c[i]==)
{
for(;i<strlen(b);i++)
{
c[i]+=b[i];
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(c[i]==)
c[i]='';
}
else
for(;i<strlen(b);i++)
c[i]=b[i];
}
}
int main()
{
scanf("%s",a);
scanf("%s",b);
swap(a);
swap(b);
add(a,b);
swap(c);
printf("%s",c);
return ;
}
减法:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[],b[];
int a1[],b1[];
int c[];
int i,j,al,bl,l;
int main()
{
scanf("%s",a);
scanf("%s",b);
al=strlen(a);
bl=strlen(b);
l=al>bl?al:bl;
for(i=;i<al;i++)
a1[al-i-]=a[i];
for(i=;i<bl;i++)
b1[bl-i-]=b[i];
for(i=l-;i>=;i--)
{
if(al>bl || a1[i]>b1[i])
{
for(j=;j<l;j++){
c[j]=a1[j]-b1[j]+'';
if(b1[j]==)
c[j]-='';
}
for(j=;j<l-;j++)
if(c[j]<'')
{
c[j]+=;
c[j+]--;
}
while(c[l-]==''&&l!=)
l--;
for(j=l-;j>=;j--)
printf("%c",c[j]);
break;
}
if(al<bl||a1[i]<b1[i])
{
for(j=;j<l;j++)
{
c[j]=b1[j]-a1[j]+'';
if(a1[j]==)
c[j]-='';
}
for(j=;j<l-;j++)
if(c[j]<'')
{
c[j]+=;
c[j+]--;
if(c[j+]==''&&j+==l-)
l--;
}
while(c[l-]==''&&l!=)
l--;
printf("-");
for(j=l-;j>=;j--)
printf("%c",c[j]);
break;
}
}
return ;
}
乘法:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int jw,sum,ac,bc,k;
int a,b,ans[];
string A;
string B;
int main()
{
cin>>A>>B;
ac=A.size()-;
bc=B.size()-;
for(int i=;i<=ac;i++)
{
a=A[ac-i]-'';
for(int j=;j<=bc;j++)
{
k=i+j;
b=B[bc-j]-'';
ans[k]+=a*b;
if(ans[k]>=)
{
ans[k+]+=ans[k]/;
ans[k]%=;
}
}
}
if(ans[k+]>)
k++;
for(int i=k;i>=;i--)
cout<<ans[i];
return ;
} Square 【开方】:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
int l;
int work(int o,char *O,int I)
{
char c,*D=O ;
if(o>)
{
for(l=;D[l];D[l++]-=)
{
D[l++]-=;
D[l]-=;
while(!work(,O,l))
D[l]+=;
putchar((D[l]+)/);
}
putchar();
}
else
{
c=o+(D[I]+)%-(I>l/)*(D[I-l+I]+)/-;
D[I]+=I< ? : !(o=work(c/,O,I-))*((c+)%-(D[I]+)%);
}
return o;
}
int main()
{
char s[];
s[]='';
scanf("%s",s+);
if(strlen(s)%==)
work(,s+,);
else
work(,s,);
return ;
}
整数除法:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
char s1[],s2[];
int a1[],a2[],a3[],a4[],len1,len2,len3,i,j;
int bi(int a3[],int a4[])
{
if(a3[]<a4[])
return ;
if(a3[]>a4[])
return ;
for(int i=a3[];i>;i--)
{
if(a3[i]<a4[i])
return ;
if(a3[i]>a4[i])
return ;
}
return ;
}
int jian(int a3[],int a4[])
{
for(int i=;i<=a3[];i++)
{
if(a3[i]<a4[i])
{
a3[i]+=;
a3[i+]--;
}
a3[i]-=a4[i];
}
for(;a3[a3[]]==&&a3[]>;a3[]--);
}
int main()
{
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
for(i=;i<len1;i++)
a1[len1-i]=s1[i]-'';
for(i=;i<len2;i++)
a2[len2-i]=s2[i]-'';
a1[]=len1;
a2[]=len2;
a4[]=a1[]-a2[]+;
for(i=a4[];i>;i--)
{
memset(a3,,sizeof(a3));
for(j=;j<=a2[];j++)
a3[j+i-]=a2[j];
a3[]=a2[]+i-;
for(;bi(a1,a3);)
{
a4[i]++;
jian(a1,a3);
}
}
for(;a4[a4[]]==&&a4[]>;a4[]--);
for(i=a4[];i>;i--)
printf("%d",a4[i]);
return ;
}
高精度非整除求余数除法:
#include<iostream>
#include<cstring>
using namespace std;
int a[],b[],c[];
int d,i;
void init(int a[])
{
string s;
cin>>s;
a[]=s.length();
for(i=;i<=a[];i++)
{
a[i]=s[a[]-i]-'';
}
}
void print(int a[])
{
int i;
if(a[]==)
{
cout<<<<endl;
return;
}
for(i=a[];i>;i--)
{
cout<<a[i];
}
cout<<endl;
return;
}
int compare(int a[],int b[])
{
int i;
if(a[]>b[])
return ;
if(a[]<b[])
return -;
for(i=a[];i>;i--)
{
if(a[i]>b[i])
return ;
if(a[i]<b[i])
return -;
}
return ;
}
void subtraction(int a[],int b[])
{
int flag,i;
flag=compare(a,b);
if(flag==)
{
a[]=;
return;
}
if(flag==)
{
for(i=;i<=a[];i++)
{
if(a[i]<b[i])
{
a[i+]--;
a[i]+=;
}
a[i]-=b[i];
}
while(a[]>&&a[a[]]==)
a[]--;
return;
}
}
void numcpy(int p[],int q[],int det)
{
for(int i=;i<=p[];i++)
{
q[i+det-]=p[i];
}
q[]=p[]+det-;
}
void Division(int a[],int b[],int c[])
{
int i,tmp[];
c[]=a[]-b[]+;
for(i=c[];i>;i--)
{
memset(tmp,,sizeof(tmp));
numcpy(b,tmp,i);
while(compare(a,tmp)>=)
{
c[i]++;
subtraction(a,tmp);
}
}
while(c[]>&&c[c[]]==)
c[]--;
return;
}
int main()
{
memset(a,,sizeof(a));
memset(b,,sizeof(a));
memset(c,,sizeof(a));
init(a);
init(b);
Division(a,b,c);
print(c);
print(a);
return ;
}
*四则高精度混合运算:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1000
struct hp{
int a[MAXN+];
hp(){
memset(a,,sizeof a);
a[]=;
}
hp(int n){
memset(a,,sizeof a);
a[]=;
while(n){
a[++a[]]=n%;
n/=;
}
if(!a[])
a[]=;
}
hp(char *s){
memset(a,,sizeof a);
int len=strlen(s);
for(int i=;i<=len;i++)
a[i]=s[len-i]-'';
a[]=len;
}
hp operator*(const hp &b)const{
hp c;
int i,j,len=a[]+b.a[];
for(i=;i<=a[];i++)
for(j=;j<=b.a[];j++)
c.a[i+j-]+=a[i]*b.a[j];
for(i=;i<len;i++){
c.a[i+]+=c.a[i]/;
c.a[i]%=;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator/(int b)const{
hp c;
int d=,i,len=a[];
for(i=a[];i;i--){
d=d*+a[i];
c.a[i]=d/b;
d%=b;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator+(const hp &b)const{
hp c;
int len=max(a[],b.a[]),i;
for(i=;i<=len;i++){
c.a[i]+=a[i]+b.a[i];
c.a[i+]=c.a[i]/;
c.a[i]%=;
}
len++;
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator-(const hp &b)const{
hp c;
int i,len=a[];
for(i=;i<=len;i++){
c.a[i]+=a[i]-b.a[i];
if(c.a[i]<)
c.a[i]+=,c.a[i+]--;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
void operator*=(const hp &x){
*this=*this*x;
}
void operator/=(const int &x){
*this=*this/x;
}
void operator+=(const hp &x){
*this=*this+x;
}
void operator-=(const hp &x){
*this=*this-x;
}
void print(){
for(int i=a[];i;i--)
printf("%d",a[i]);
}
bool operator>(const hp&b)const{
if(a[]>b.a[])
return ;
if(a[]<b.a[])
return ;
for(int i=a[];i;i--)
if(a[i]>b.a[i])
return ;
else if(a[i]<b.a[i])
return ;
return ;
}
bool operator<(const hp&b)const{
if(a[]<b.a[])
return ;
if(a[]>b.a[])
return ;
for(int i=a[];i;i--)
if(a[i]<b.a[i])
return ;
else if(a[i]>b.a[i])
return ;
return ;
}
bool operator<=(const hp&b)const{
return !(*this>b);
}
hp operator/(const hp&b)const{
hp l(),r(*this),mid;
while(l<r){
mid=(l+r+)/;
if(mid*b<=*this)
l=mid;
else
r=mid-;
}
return l;
}
void operator/=(const hp&b){
*this=*this/b;
}
}a,b,c;
char s[MAXN+];
void read(){
scanf("%s",s);
a=s;
scanf("%s",s);
b=s;
}
int main()
{
read();
c=a/b;
c.print();
puts("");
a-=c*b;
a.print();
}
Time:2017-01-28
[SinGuLaRiTy] 高精度算法代码库的更多相关文章
- 圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单
圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单 //// CircleCore.h// Quartz//// Created by 仙人掌 on 12 ...
- c++减法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...
- c++加法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...
- 算法代码[置顶] 机器学习实战之KNN算法详解
改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...
- Android 设计模式实战之关于封装计费代码库的策略模式详谈
写在之前 这周生活上出现了很多的不如意,从周一开始就觉得哪里出现了问题,然后就是各种烦躁的情绪,后来事情还真是如预感的那样发生了,很是心痛,但也无可奈何,希望大家都好好珍惜自己身边的人:友人,亲人,家 ...
- 资源帖:CV代码库搜集
2013计算机视觉代码合集一: 原文链接:http://www.yuanyong.org/blog/cv/cv-code-one 切记:一定要看原文链接 原文链接: http://blog.csdn. ...
- 高精度算法(C/C++)
高精度算法 (C/C++) 做ACM题的时候,经常遇到大数的加减乘除,乘幂,阶乘的计算,这时给定的数据类型往往不够表示最后结果,这时就需要用到高精度算法.高精度算法的本质是把大数拆成若干固定长度的块, ...
- #AcWing系列课程Level-2笔记——5.高精度“+”算法
高精度"+"算法 编写高精度"+",记住下面的过程,代码也就游刃有余了! 1.首先我们要明白大整数是如何存储的? 2.其次存储完,如何运算? 高精度" ...
- LeetCode43,一题让你学会高精度算法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实 ...
随机推荐
- js加载XML文件
// XML文件 <?xml version="1.0" encoding="gb2312"?> <root> <father n ...
- tomcat基础应用
1. Tomcat版本和支持的API和JDK版本 Apache Tomcat Servlet API JSP API JDK 7.0 3.0 2.2 1.6 6.0 2.5 2.1 1.5 5.5 2 ...
- android学习7——canvas.concat(Matrix matrix)作用
canvas.concat的作用可以理解成对matrix的变换应用到canvas上的所有对象. 看下面的代码. public class ConcatMatrixActivity extends Ac ...
- WebApi接口传参不再困惑:传参详解
原文出处: 懒得安分 前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望 ...
- Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口
Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口 >>>>>>>>>& ...
- linux 下maven安装
版本要求maven3.2.3 软件下载 wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.2.3/binaries/apache-maven-3 ...
- Easyui _treegrid 动态加载子节点
<table id="dg" class="easyui-treegrid" title="数据字典列表" data-options= ...
- selenium 运行之后错误提示Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output
错误提示: org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port ...
- mongoDB & Nodejs 访问mongoDB (一)
最近的毕设需要用到mongoDB数据库,又把它拿出来再学一学,下盘并不是很稳,所以做一些笔记,不然又忘啦. 安装 mongoDB & mongoVUE mongoDB: https://www ...
- Python开发【第十八篇】Web框架之Django【基础篇】
一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...