当前位置:网站首页>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);
}边栏推荐
- Visual studio 2022 interface beautification tutorial
- Laravel Aurora push
- The article is on the list. Welcome to learn
- EL & JSTL (XIII)
- A brief talk on media inquiry
- Extend the toolbar of quill editor
- HR took the initiative to raise the salary of the test lady. How did she do it?
- Specific operations for uploading pictures in PHP
- Activereportsjs V3.0 comes on stage
- Could not find “store“ in the context of “Connect(homePage)
猜你喜欢

Detailed summary of flex layout

The article is on the list. Welcome to learn

Route parameters to jump to the page and transfer parameters -- > hidden parameter list

Compatible with Internet Explorer

基于SSH实现的学生成绩管理系统

File upload vulnerability (III)

dotnet-exec 0.4.0 released

Detailed summary of position positioning

Extend the toolbar of quill editor

A review of small sample learning
随机推荐
parallel recovery slave next change & parallel recovery push change
UVA816 Abbott’s Revenge
A summary of the experiment of continue and break in C language
Specific operations for uploading pictures in PHP
Cookie & session & JSP (XII)
Swift rapid development
How to use the Magic pig system reinstallation master
2021-10-24
Mysql interactive_ Timeout and wait_ Timeout differences
Could not find “store“ in the context of “Connect(homePage)
XSS (cross site script attack) summary (II)
What is Ethernet and how to connect the computer
Kotlin compose perfect todo project surface rendering background and shadow
SRC platform summary
API interface management setup -eolinker4.0
Even if you are not good at anything, you are growing a little bit [to your 2021 summary]
A review of small sample learning
Visual studio 2022 interface beautification tutorial
Penetration information collection steps (simplified version)
Install pytorch through pip to solve the problem that torch cannot be used in jupyter notebook (modulenotfoundererror:no module named 'Torch').