免费.net网站空间,科技素材,望牛墩仿做网站,旅游网站的长图是怎么做的呀高精度运算模板 基础版 代码“借鉴”的文章#xff1a;oi.wiki : 高精度 基础版
#include iostream
#include cstring
using namespace std;
const int LEN 1e45; //根据实际情况调整#xff0c;表示最高位
char s[LEN];//用于读取的字符串//初始化一个数… 高精度运算模板 基础版 代码“借鉴”的文章oi.wiki : 高精度 基础版
#include iostream
#include cstring
using namespace std;
const int LEN 1e45; //根据实际情况调整表示最高位
char s[LEN];//用于读取的字符串//初始化一个数为0
void clear(int n[])
{memset(n,0,LEN*sizeof(int));
}//判断a大还是b大
int compareTwo(int a[],int b[])
{int i;for (i LEN-1; i 0; i--){if(a[i]0 b[i]0)return 1;else if(b[i]0 a[i]0)return -1;else if(a[i]0 b[i]0)break;}for (; i 0; i--){if(a[i] b[i])continue;else if(a[i]b[i])return 1;elsereturn -1;}return 0;
}//此函数用来判断除法是否应该跳到下一位去除
//减少重复判断a以dg位减去b是否能保持非负,len为b的长度
bool greater_eq(int a[],int b[],int dg,int len)
{if(a[dglen] ! 0)//dg位来看a的部分远大于b,一定能减return true;for (int i len-1; i 0; i--)//从高位向低位判断{if(a[dgi] b[i]) return true;else if(a[dgi] b[i]) return false;}
}//读取正整数倒着存入数组个位在左向右为高位也方便进位操作得到的 n 数组 ---{ 个位 , 十位 , 百位 ……}
void read(int n[])
{int len;clear(n);scanf(%s,s);len strlen(s);for (int i 0; i len; i){n[len-i-1] s[i]-0;}
}//正整数相加
void add(int a[],int b[],int res[])
{clear(res);for (int i 0; i LEN-1 ; i){res[i] a[i] b[i];if(res[i]10){res[i1] 1;res[i] - 10;}}
}//正整数减法要求 ab
void sub(int a[],int b[],int res[])
{clear(res);for (int i 0; i LEN-1 ; i){res[i] a[i] - b[i];if(res[i] 0){res[i1] - 1;res[i] 10;}}
}//输出正整数
void print(int n[])
{int i LEN-1;for (; i 1; i--)if(n[i]!0) break;for (; i 0 ; i--){printf(%d,n[i]);}printf(\n);
}//高精度正整数相乘注意对于位数限制为 LEN 的数相乘后最高位为 2*LEN
void mul(int a[], int b[], int res[]) {clear(res);for (int i 0; i LEN-1; i){for (int j 0; j i; j) {res[i] a[j] * b[i - j];}//完成第i位的所有运算如个位就先只算a[0]*b[0]十位就计算a[1]*b[0]a[0]*b[1]if (res[i] 10) {res[i 1] res[i] / 10;res[i] % 10;}}
}//高精度除法被除数应大于等于除数
void div(int a[],int b[],int res[],int rest[])
{clear(res);clear(rest);//求得两数长度int len_a,len_b;for (len_a LEN; len_a 0; len_a--)if(a[len_a-1] ! 0) break;for (len_b LEN; len_b 0; len_b--)if(b[len_b-1] ! 0) break;if(len_b0) return;//除数不为0memcpy(rest , a , LEN*sizeof(int) );//复制出余数for (int dg len_a-len_b ; dg 0 ; dg--)//当前运算位为a的dg{while(greater_eq(rest,b,dg,len_b)){//高精度将余数rest减去一个 dg 位上的 bfor (int i 0; i len_b; i){rest[dgi]-b[i];if(rest[dgi]0){rest[dgi] 10;rest[dgi1] - 1;}}//商在dg位上多1res[dg];}}
}int main()
{int a[LEN];int b[LEN];int res[LEN];//结果和、差、商、积int rest[LEN];//余数read(a);read(b);//add(a,b,res);print(res);//-if(compareTwo(a,b)0){sub(b,a,res);printf(-);}elsesub(a,b,res);print(res);//*mul(a,b,res);print(res);///div(a,b,res,rest);print(res);print(rest);
}