ACM小组内部预定函数
Ver 2.0 by IcyFenix
数学问题: |
|
|
|
2.精度计算——乘法(大数乘小数) | |||
一、数学问题
语法:int result=factorial(int n); | |
参数: | |
n: | n 的阶乘 |
返回值: | 阶乘结果的位数 |
注意: |
|
| 本程序直接输出n!的结果,需要返回结果请保留long a[] |
| 需要 math.h |
源程序: |
|
| int factorial(int n) a[0]=1; |
语法:mult(char c[],char t[],int m); | |
参数: | |
c[]: | 被乘数,用字符串表示,位数不限 |
t[]: | 结果,用字符串表示 |
m: | 乘数,限定10以内 |
返回值: | null |
注意: |
|
| 需要 string.h |
源程序: |
|
| void mult(char c[],char t[],int m) for (i=0;i<l;i++) for (i=0;i<l;i++) |
语法:mult(char a[],char b[],char s[]); | |
参数: | |
a[]: | 被乘数,用字符串表示,位数不限 |
b[]: | 乘数,用字符串表示,位数不限 |
t[]: | 结果,用字符串表示 |
返回值: | null |
注意: |
|
| 空间复杂度为 o(n^2) |
| 需要 string.h |
源程序: |
|
| void mult(char a[],char b[],char s[]) for (i=0;i<alen;i++) for (i=alen-1;i>=0;i--) for (i=blen-2;i>=0;i--) for (i=0;i<k;i++) result[i]+='0'; while(1) |
语法:add(char a[],char b[],char s[]); | |
参数: | |
a[]: | 被乘数,用字符串表示,位数不限 |
b[]: | 乘数,用字符串表示,位数不限 |
t[]: | 结果,用字符串表示 |
返回值: | null |
注意: |
|
| 空间复杂度为 o(n^2) |
| 需要 string.h |
源程序: |
|
| void add(char a[],char b[],char back[]) |
语法:sub(char s1[],char s2[],char t[]); | |
参数: | |
s1[]: | 被减数,用字符串表示,位数不限 |
s2[]: | 减数,用字符串表示,位数不限 |
t[]: | 结果,用字符串表示 |
返回值: | null |
注意: |
|
| 默认s1>=s2,程序未处理负数情况 |
| 需要 string.h |
源程序: |
|
| void sub(char s1[],char s2[],char t[]) |
语法:conversion(char s1[],char s2[],long d1,long d2); | |
参数: | |
s[]: | 原进制数字,用字符串表示 |
s2[]: | 转换结果,用字符串表示 |
d1: | 原进制数 |
d2: | 需要转换到的进制数 |
返回值: | null |
注意: |
|
| 高于9的位数用大写'A'~'Z'表示,2~16位进制通过验证 |
源程序: |
|
| void conversion(char s[],char s2[],long d1,long d2) |
语法:resulet=hcf(int a,int b)、result=lcd(int a,int b) | |
参数: | |
a: | int a,求最大公约数或最小公倍数 |
b: | int b,求最大公约数或最小公倍数 |
返回值: | 返回最大公约数(hcf)或最小公倍数(lcd) |
注意: |
|
| lcd 需要连同 hcf 使用 |
源程序: |
|
| int hcf(int a,int b) lcd(int u,int v,int h) |
语法:m_of_n(int m, int n1, int m1, int* a, int head) | |
参数: | |
m: | 组合数C的上参数 |
n1: | 组合数C的下参数 |
m1: | 组合数C的上参数,递归之用 |
*a: | 1~n的整数序列数组 |
head: | 头指针 |
返回值: | null |
注意: |
|
| *a需要自行产生 |
| 初始调用时,m=m1、head=0 |
| 调用例子:求C(m,n)序列:m_of_n(m,n,m,a,0); |
源程序: |
|
| void m_of_n(int m, int n1, int m1, int* a, int head) if(m1==n1) |
语法:kkfft(double pr[],double pi[],int n,int k,double fr[],double fi[],int l,int il); | |
参数: | |
pr[n]: | 输入的实部 |
pi[n]: | 数入的虚部 |
n,k: | 满足n=2^k |
fr[n]: | 输出的实部 |
fi[n]: | 输出的虚部 |
l: | 逻辑开关,0 FFT,1 ifFT |
il: | 逻辑开关,0 输出按实部/虚部;1 输出按模/幅角 |
返回值: | null |
注意: |
|
| 需要 math.h |
源程序: |
|
| void kkfft(pr,pi,n,k,fr,fi,l,il) |
语法:result=integral(double a,double b); | |
参数: | |
a: | 积分上限 |
b: | 积分下限 |
function f: | 积分函数 |
返回值: | f在(a,b)之间的积分值 |
注意: |
|
| function f(x)需要自行修改,程序中用的是sina(x)/x |
| 需要 math.h |
| 默认精度要求是1e-5 |
源程序: |
|
| double f(double x) |
语法:result=js(int s[][],int n) | |
参数: | |
s[][]: | 行列式存储数组 |
n: | 行列式维数,递归用 |
返回值: | 行列式值 |
注意: |
|
| 函数中常数N为行列式维度,需自行定义 |
源程序: |
|
| int js(s,n) |
语法:result=P(long n,long m); / result=long C(long n,long m); | |
参数: | |
m: | 排列组合的上系数 |
n: | 排列组合的下系数 |
返回值: | 排列组合数 |
注意: |
|
| 符合数学规则:m<=n |
源程序: |
|
| long P(long n,long m) long C(long n,long m) |