当前位置:网站首页>Large number operation (capable of square root, power, permutation and combination, logarithm and trigonometric value)
Large number operation (capable of square root, power, permutation and combination, logarithm and trigonometric value)
2022-06-25 05:13:00 【qq_ forty-six million one hundred and nine thousand and forty-n】
I want to use it during the winter vacation C Write a program to simulate the motion of stars , The data for finding stars is too large , So I began to write the program of large number operation .
I'm a freshman now , Some mistakes are inevitable , Please also point out .
#include<math.h>
#include<string>
#include<iostream>
#define pi asin(1)*2
#define lon 21// Data accuracy
#define d 1000// Data length
/* A large number indicates a demonstration :
* 12 345 678.123 456 7->long a[lon]={2,12,345,678,123,456,700}
* The conversion of negative numbers is different , Such as -123 456->{1,-124,544} namely -124000+544=123456
* Let's put the array a A number in becomes a section , Such as : The first 0 section ->2, The first 1 section ->12
* Array a The number represented A It can be expressed in this way :
*{
* int A=0,i=0;
* for(i=0;i<lon;i++)A+=a[i+1]*pow(d,*a-i);
* }
* Define functions with b and n To represent large numbers (big num) And ordinary numbers (num)
* When defining function parameters, use n and num Represents large numbers and ordinary numbers
*/
long bn0[lon] = { 0 };//0 Large number
long bn1[lon] = { 1,11,110 };
long bn2[lon] = { 2 ,-1,-2,-3,-4 };
long bpi[lon] = { 0,3,141,592,653,589,793,115,997,963,468,544,185,161,590,576,171,875 };
long be[lon] = { 0,02,718,281,828,459,45,073,32,29,904,425,144,195,556,640,625 };
// 4,5,965000
// A paragraph means 3 digit
// Copy large numbers ,X Used to store the return value
void copyb(long* n, long X[]) {
int i ;
for (i=0;i<lon;X[i]=n[i++]);
}
// Copy a segment of a large number ,st->start,fi->finish
void copybb(long* n, long X[],int st=1,int fi=lon) {
st = st <= 0 ? 1 : st;
st = st > lon ? lon - 1 : st;
long n2[lon] = { 0 };int i, j;
for (i = st;i < fi;i++)n2[i - st + 1] = n[i];
*n2 = *n - st + 1;
copyb(n2, X);
}
// Large numbers return to zero
void zerob(long* n) {
copyb(bn0, n);
}
// The pronunciation of Ping , Arrange large numbers to make them conform to the format , There is also the function of copying large numbers
void ping(long* n,long X[]=0) {
int k, i, f, num = n[1];
if (X == 0)X = n;
for (k = 1;k < lon && !n[k];k++);k--;// Query header 0 Where
if (k == lon - 1) { copyb(n,X);return; };// If the head 0 stay lon-1 It is 〇 Large number
for (i = 1;i < lon - k;i++)n[i] = n[i + k];// Remove head 0
*n = *n - k;
num = n[1];
for (f = 0;num /= d;f++);f;num = n[1];// Check whether the head exceeds d
for (i = lon - 1;i > f;i--)n[i] = n[i - f];*n = *n + f;
for (i = f + 1;i >= 1;i--) { n[i] = num % d; num /= d; }
for (i = lon - 1;i >= 2;i--) {
if (n[i] >= d)
{
n[i - 1]++; n[i] -= d;
}
if (n[i] < 0) { n[i - 1]--; n[i] += d; }
}
if (!n[1] || abs(n[1]) >= d) ping(n,X);
for (i = 2;i < lon;i++)
if (abs(n[i]) >= d || n[i] < 0)ping(n, n);
{copyb(n, X);return;}
}
// And the following prnum(print num) Matching , repair 〇
void seentzer(long n) {
int i = 2;
(n /= 10) ? i-- : 0;(n /= 10) ? i-- : 0;
(n /= 10) ? i-- : 0;
for (;i>0;i--)printf("0");
}
// Print large numbers
void prnum(long* n,std::string str1="\n", std::string str2 = "\n") {
std::cout << str1;
int i = n[0];
printf("[%d]", n[0]);
if (-1 == *n)printf("0.");
for (i = 0;i < lon-1;i++) {
seentzer(n[i+1]);
printf("%d,", n[i+1]);
if (i == *n)printf(".");
}
std::cout << str2;
}
// Add large numbers
void addbb(long* n1, long* n2,long X[]=0) {//1
ping(n1,n1);ping(n2,n2);
if (X == 0)X = n2;
long in[lon * 2] = { 0 }, * a;
int i, j;
if (*n1 < *n2) { a = n1;n1 = n2;n2 = a; }
*in = *n1;
for (i = 1;i < lon ;i++) {//2
if (i >*n1 - *n2 && i < lon) { in[i] = n1[i] + n2[i - *n1 + *n2]; }
if (i <= *n1 - *n2)in[i] = n1[i];
if (i >= lon)
in[i] = n2[i + *n2 - *n1];
}//2
ping(in, X);
}//1
// Large numbers plus ordinary numbers
void addnb(long* n1, long double num,long X[]=0) {
if (X == 0)X = n1;
long a[lon] = { 0 }, * n2;
int in, i, f = 1;long double fl;
in = (int)num;
fl = num;
a[0] = 0;
a[1] = in;
//0.123,456,789,1
for(i=2;i<lon;i++){fl = (fl-a[i-1])*d;a[i] = (int)fl; }
ping(n1,n1);ping(a,a);
addbb(n1, a, X);
}
// Ordinary number plus ordinary number
void addnn(long double num1, long double num2, long X[]) {
long n[lon] = { 0 };
addnb(bn0, num1, n);
addnb(n, num2, X);
}
// Large numbers are negative (minus sign)
void musgb(long* n,long X[]=0) {
if (X == 0)X = n;
int i = 1;long* n1 = n;
X[0] = n[0];
for (i = 1;i < lon;i++) {
X[i] = -n[i];
}
}
// Subtracting the (minus),n=1 Express n1-n2,n=0 Express n2-n1
void mnsbb(long* n1, long* n2,long X[]=0,int n=1) {
if (X == 0)X = n2;
long n3[lon * 2] = { 0 },*a;
if (n) { musgb(n2, n3), a = n1; }
else { musgb(n1, n3);a = n2; }
ping(a,a);ping(n3,n3);
addbb(a, n3, n3);ping(n3, X);
}
// Subtracting the ,n=1 Express n1-num;n=0 Express num-n1
void mnsnb(long* n1, long double num, long X[]=0, int n = 1) {
if (X == 0)X = n1;
ping(n1, n1);
if (n) { addnb(n1, -num, X);return; }
else { long n3[lon * 2] = { 0 };musgb(n1, n3);
addnb(n3, num, X);
}
}
// Multiply (multiply)head Express d Of head The next power
void mtpnb(long* n1,long double num,long X[]=0,int head=0) {
if (X == 0)X = n1;
int in=(int)num;long double fl = num - in;
int i,j;
long sum[lon*2] = { 0 };
long n2[lon] = { 0 };
ping(n1, n2);
*n2 += head;
*sum = *n2;
for (i = 1;i < lon;i++)sum[i] =n2[i]*in;
ping(sum, sum);
//addbb(sum, n2, sum);
for (j = 1;j<lon;j++) {
copyb(n1, n2);n2[0] = *n2-j+head;
fl *= d;
for (i = 1;i < lon;i++) { n2[i] *=(int)fl; }
addbb(sum, n2, sum);
fl = (fl-(int)fl) ;
}
ping(sum, X);
}
void mtpbb(long* n1, long* n2, long X[]=0) {
float cmpnb(long* n1, long double num);
if (X == 0)X = n2;
long n3[lon]={0},sum[lon]={0};
long n4[lon] = { 0 };
int i, j;ping(n1, n4);
for (i = 1;i < lon;i++) {
;n4[0] =*n1+ 1-i;
mtpnb(n4, n2[i], n3);
addbb(n3, sum, sum);
}
ping(sum, X);
}
void mtpnn(long double num1, long double num2, long X[]) {
long n[lon] = { 0,1 };
mtpnb(n, num1, n);
mtpnb(n, num2, X);
}
// be divided by (divide)
void dvdbb(long* n1, long* n2, long x[]=0, int n = 1) {
float cmpnb(long* n1, long double num);
long X[lon] = {0};
long sum[lon] = { 0 }, n3[lon] = { 0 }, n4[lon] = { 0 };
int i,j;ping(n1, n4);ping(n2, n3);
int f=1;
if (cmpnb(n3, 0) < 0) { musgb(n3, n3); f *= -1; }
if (cmpnb(n4, 0) < 0) { musgb(n4, n4); f *= -1; }
X[0] = *n1 - *n2;
*n4 = 0;*n3 = 0;
for (j = 1;j < lon;j++) {
for (i = 1;i < d;i++) {
mnsbb(n4, n3, n4);
ping(n4, n4);
if (n4[1] < 0||i>=d) { i-=1;break; }}
addbb(n4, n3, n4);
n3[0] -= 1;
X[j] = i; }
if(x)mtpnb(X,f,x);
else mtpnb(X, f, n2);
}
void dvdnn(long double num1, long double num, long X[], int n = 1) {
long sto;int i,j,k;
long n1[lon] = { 0 }, n2[lon] = { 0 };
if (!n) { num1 += num;num = num1 - num;num1 -= num; }
addnb(bn0, num1,n1);addnb(bn0, num, n2);
dvdbb(n1, n2, X);
}
void dvdnb(long *n1,long double num,long X[]=0,int n=1) {
if (X == 0)X = n1;
int i;long sum[lon] = { 0 },n2[lon]={0},n3[lon]={0};
addnb(bn0, num, n2);
if (n) { dvdbb(n1, n2, X); }
else { dvdbb(n2, n1, X); }
}
long double mysqr(long double a, int m) {
long double x = 1;int i,j = 300;
for (;j--;printf("\n iteration %d Time ->%.36f\n", j, x))
for (i = j, x = 1;i--;)
// x = (a * (m - 1) / x + pow(x, m -1)) / m;
x = ( a *pow(x, 1 - m) +(m - 1) * x) / m;
return x;
}
// Integer power ( namely num by int type ) square ,n be equal to 0 The function of has not been designed yet
void powin(long* n1, int num, long X[] = 0, int n = 1) {
if (X == 0)X = n1;long n2[lon] = { 0 }, x[lon] = { 0 };
if (num < 0) { num *= -1;dvdnb(n1, 1, n2, 0); }
else ping(n1, n2);
if (n) {
if (num == 0) { zerob(X);addnb(X, 1, X);return; }
for (ping(n2, x);--num;)mtpbb(n2, x, x);
}
else {
long n2[lon] = { 0 };ping(n1, n2);
for (;;)mtpnb(X, num, X);
}ping(x, X);
}
// Integer power ( namely num by int type ) square
void sqrin(long* n1, int num, long X[] = 0) {
int i, j = 100;long x[lon] = {0,1}, re[4][lon] = {0};
if (X == 0)X = n1;
for (;j--;)
{// x = ( a *pow(x, 1 - m) +(m - 1) * x) / m;
powin(x, 1 - num, re[1]);//2
mtpbb(re[1], n1, re[1]);//3
mtpnb(x, num - 1, re[2]);//4
addbb(re[1], re[2], re[3]);//5
dvdnb(re[3], num, x);//6
}
ping(x, X);
}
// It is easy to blow up large numbers by examining power, resulting in low accuracy , And not very often , Therefore, decimal power and square root are not written
// Take the remainder (remainder)
void rmdbb(long* n1, long *n2, long X[] = 0,int n=1) {
long *n3,*n4,re[lon]={0};
if (n) { n3 = n1;n4 = n2; }
else { n3 = n2;n4 = n1; }
ping(n3, n3);ping(n4, n4);
dvdbb(n3, n4, re);
copybb(re,re,re[0]+2);
mtpbb(re, n4, re);
// mnsbb(n3, re, re);
ping(re, X);
}
void rmdnb(long* n1, long double num, long X[] = 0, int n = 1) {
long n2[lon] = { 0 };
addnb(bn0, num, n2);
rmdbb(n1, n2, X, n);
}
// Compare the size
float cmpbb(long* n1, long* n2) {
ping(n1, n1);ping(n2, n2);
int f, i;
for (i = 0;i < lon;i++) if (n1[i] != n2[i]) {
if (n1[i] > n2[i])return i + 0.1;
else return -i - 0.1;
}
return 0;
}
float cmpnb(long* n1, long double num) {
long n2[lon] = { 0 };
addnb(bn0, num, n2);
return cmpbb(n1, n2);
}
// Large number to ordinary number (big to num)
long double bg2nu(long *n) {
long double n1=0;
int i;
for (i = 1;i < lon;i++) { n1 += n[i]*pow(d,*n-i+1); }
return n1;
}
//sin
long double sinb(long* n, long X[]=0) {
long double n1 = 0;long n2[lon] = { 0 };
mtpnb(bpi, 2, n2);
rmdbb(n, n2, n2);
n1 = sin(bg2nu(n2));
if(X)addnb(bn0, sin(bg2nu(n2)), X);
return n1;
}
long double cosb(long* n, long X[] = 0) {
long double n1 = 0;long n2[lon] = { 0 };
mtpnb(bpi, 2, n2);
rmdbb(n, n2, n2);
n1 = cos(bg2nu(n2));
if (X)addnb(bn0, cos(bg2nu(n2)), X);
return n1;
}
long double tanb(long* n, long X[] = 0) {
long double n1 = 0;long n2[lon] = { 0 };
// mtpnb(bpi, 2, n2);
rmdbb(n, bpi, n2);
n1 = tan(bg2nu(n2));
if (X)addnb(bn0, tan(bg2nu(n2)), X);
return n1;
}
long double atanb(long* n, long X[] = 0) {
long double num;
if (cmpnb(n, pow(10, 18)) > 0) { if (X)ping(bpi, X);return bg2nu(bpi) / 2; }
num = atan(bg2nu(n));
if (X) addnb(bn0, num, X);
return num;
}
// Incomplete arrangement A(n1,n2)n1>n2
void Abb(long* n1, long* n2, long X[], int n = 1) {
long* n3, * n4, re[lon] = { 0 ,1 };
long n5[lon] = { 0 };
int f = 1;
if (n) { n3 = n1;n4 = n2; }
else { n3 = n2;n4 = n1; }
if (cmpbb(n3, n4) < 0) {copybb(bn0, X);return; }
if (cmpnb(n3, 0) < 0) { musgb(n3, n3); f *= -1; }
if (cmpnb(n4, 0) < 0) { musgb(n4, n4); f *= -1; }
mnsbb(n3, n4, n5);addnb(n5, 1, n5);
prnum(n5, "n5->");
ping(n3, n3);ping(n4, n4);
for (;cmpbb(n5,n3)<=0;addnb(n5, 1, n5)) {
prnum(re, "re->");
mtpbb(re, n5, re);
}
mtpnb(re,f, X);
}
// Full Permutation (full permutation)
void fpmtb(long*n1,long X[]) {
Abb(n1, n1, X);
}
void Cbb(long* n1, long* n2, long X[], int n = 1) {
long* n3, * n4, re[3][lon] = { 0 };
long n5[lon] = { 0 };
int f = 1;
if (n) { n3 = n1;n4 = n2; }
else { n3 = n2;n4 = n1; }
Abb(n1, n2, re[0]);
fpmtb(n2, re[1]);
dvdbb(re[0], re[1], X);
}
void lnb(long* n1, long X[]) {
long n3[lon]={0}, re[lon] = {1 ,1};
long double num3,num4;
ping(n1, n3);
mtpnn(3*log(10), *n3, re);
*n3 = 0 ;
addnb(re, log(bg2nu(n3)),X);
}
// With 10 Log base
long double lg(long double num) {
return(log(num) / log(10));
}
void lgb(long* n1, long X[]) {
long n3[lon] = { 0 }, re[lon] = { 1 ,1 };
long double num3, num4;
ping(n1, n3);
mtpnn(3 * lg(10), *n3, re);
*n3 = 0;
addnb(re, lg(bg2nu(n3)), X);
}
long double lognn(long double num1, long double num2, int n = 1,long X[]=0) {
long double num3;
num3=n? log(num1) / log(num2):log(num2) / log(num1);
addnn(0, num3, X);
return num3;
}
void lognb(long* n1, long double num, long X[], int n = 1) {
long n2[lon] = { 0 };
lnb(n1, n2);
if(n)dvdnb(n2, log(num), X);
else dvdnb(n2, log(num), X,0);
}
void logbb(long* n1, long* n2, long X[], int n = 1) {
long n4[lon] = { 0 },n3[lon] = { 0 };
lnb(n1, n3);lnb(n2, n4);
if (n)dvdbb(n3, n4, X);
else dvdbb(n4, n3, X);
}边栏推荐
- Laravel's little knowledge
- The article is on the list. Welcome to learn
- JS verification code input number auto skip
- What if win11 Bluetooth fails to connect? Solution of win11 Bluetooth unable to connect
- Get to know the drawing component of flutter - custompaint
- Web3 DAPP user experience best practices
- HR took the initiative to raise the salary of the test lady. How did she do it?
- Baidu ueeditor set toolbar initial value
- XSS (cross site script attack) summary (II)
- Object creation and invocation code example
猜你喜欢

2021-03-23

Activereportsjs V3.0 comes on stage

Five simple data types of JS

In Net 6 using dotnet format formatting code

Ranorex Studio 10.1 Crack

How to install the blue lake plug-in to support Photoshop CC 2017

hr竟主动给这位测试小姐姐涨工资,她是怎么做到的?

Detailed summary of position positioning

How do the defi protocols perform under this round of stress test?

A review of small sample learning
随机推荐
电子协会 C语言 1级 28 、字符菱形
Cookie & session & JSP (XII)
Array: force deduction dichotomy
Can bus extended frame
Everything is an object
CopyPlugin Invalid Options options should be array ValidationError: CopyPlugin Invalid Options
A brief talk on media inquiry
Penetration test - right raising topic
Matlab notes
Handwritten promise all
The construction and usage of wampserver framework
XSS (cross site script attack) summary (II)
Electric store stores data
TeeChart Pro ActiveX 2022.1
SQL lab range explanation
Introduction to the hardest core PWN in the whole network_ Graphic analysis
ASEMI三相整流桥的工作原理
Penetration information collection steps (simplified version)
CTFHub-rce
Get to know the drawing component of flutter - custompaint