大数的阶乘(n!)

合集下载

n的阶乘的计算公式

n的阶乘的计算公式

n的阶乘的计算公式摘要:I.引言A.介绍n的阶乘概念B.给出n的阶乘计算公式II.n的阶乘计算方法A.递归算法1.计算n! = n × (n-1) × (n-2) × ...× 2 × 12.通过不断调用自身计算连乘积B.循环算法1.使用for循环计算连乘积2.计算n! = n × (n-1) × (n-2) × ...× 2 × 1III.算法效率比较A.递归算法与循环算法的效率差异B.实际应用中选择合适算法的依据IV.结论A.总结n的阶乘计算方法B.强调根据需求选择合适算法的重要性正文:I.引言A.n的阶乘是数学中的一个概念,表示将n连乘以所有小于等于n的自然数B.n的阶乘计算公式为n! = n × (n-1) × (n-2) × ...× 2 × 1II.n的阶乘计算方法A.递归算法1.计算n! = n × (n-1) × (n-2) × ...× 2 × 12.通过不断调用自身计算连乘积,直到n = 1时返回1B.循环算法1.使用for循环从n到2,再从2到1计算连乘积2.计算n! = n × (n-1) × (n-2) × ...× 2 × 1III.算法效率比较A.递归算法的效率较低,因为存在大量的重复计算B.循环算法的效率较高,避免了重复计算IV.结论A.n的阶乘计算方法包括递归算法和循环算法B.在实际应用中,可以根据需求和场景选择合适的算法C.总结n的阶乘计算方法和算法效率差异,强调选择合适算法的重要性。

striling公式

striling公式

Stirling公式是以苏格兰数学家詹姆斯·斯特灵命名的一种近似公式,它用于估计一个大数的阶乘。

该公式在数学和科学计算中经常用于涉及大数阶乘的问题。

Stirling公式表达式如下:
n! ≈√(2πn) * (n/e)^n
其中:
- n! 表示非负整数n 的阶乘,即从1 到n 的所有正整数的乘积。

- π是数学常数π,约等于3.14159。

- e 是自然对数的底数,约等于2.71828。

- √(2πn) 表示2πn的平方根。

Stirling公式是一种渐近近似公式,随着n 增大,逼近精度越高。

它在计算大数阶乘时特别有用,因为直接计算大数阶乘可能导致溢出或计算困难。

例如,我们使用Stirling公式来近似计算10 的阶乘:
n = 10
10! ≈√(2π* 10) * (10/2.71828)^10
10! ≈√(62.831853) * (3.678794)^10
10! ≈3598695.618741
实际的10! 的值为3,628,800。

从结果中可以看出,使用Stirling公式得到的近似值与实际值相当接近,特别是当n 增大时。

然而,需要记住Stirling公式仍然是一个近似值,在处理非常小的n 或需要高精度计算时可能不够准确。

python计算阶乘inf

python计算阶乘inf

Python计算阶乘inf一、引言阶乘是数学中的一个基本概念,通常表示为n!,定义为所有小于等于n的正整数的乘积。

在Python中,我们可以使用递归或循环来计算阶乘。

然而,当n的值非常大时,我们可能会遇到内存溢出或性能问题。

为了解决这个问题,我们可以使用Python的内置模块`math`和`sympy`来计算大数的阶乘。

二、阶乘的计算方法1. 递归法递归是一种编程技巧,它允许一个函数调用自身。

我们可以使用递归来计算阶乘。

以下是使用递归计算阶乘的Python代码:def factorial_recursive(n):if n == 0 or n == 1:return 1else:return n * factorial_recursive(n - 1)2. 循环法除了递归,我们还可以使用循环来计算阶乘。

以下是使用循环计算阶乘的Python 代码:def factorial_loop(n):result = 1for i in range(1, n + 1):result *= ireturn result三、计算大数阶乘当n的值非常大时,上述两种方法可能会导致内存溢出或性能问题。

为了解决这个问题,我们可以使用Python的内置模块`math`和`sympy`来计算大数的阶乘。

1. 使用math模块Python的`math`模块提供了一个名为`factorial`的函数,可以用来计算阶乘。

这个函数可以处理较大的数值,但仍然有限制。

以下是使用`math`模块计算阶乘的示例代码:import mathdef factorial_math(n):return math.factorial(n)2. 使用sympy模块`sympy`是一个用于符号计算的Python库。

它可以处理非常大的数值,并且可以计算无穷大的阶乘。

以下是使用`sympy`模块计算阶乘的示例代码:from sympy import symbols, factorial as sympy_factorialdef factorial_sympy(n):x = symbols('x')return sympy_factorial(x).subs(x, n)四、总结本文介绍了如何使用Python计算阶乘,包括递归法、循环法以及使用`math`和`sympy`模块计算大数阶乘。

大数的认识奥数题

大数的认识奥数题

大数的认识奥数题导语在奥数竞赛中,大数问题常常是让学生们感到头疼的一类题目。

这些问题涉及到了对大数的认识和运算技巧。

本文将解析几个经典的大数题目,帮助读者更好地理解和应对这类题目。

一、问题一:最大的n位数问题描述:给定一个正整数n,要求输出由n个9组成的最大的整数。

解析:这道题目很简单,只需要将n个9连接起来即可得到最大的n位数。

解答:假设n=3,最大的3位数就是999;假设n=5,最大的5位数就是99999。

可以用一个循环来实现这个问题。

二、问题二:大整数相加问题描述:给定两个正整数a和b,要求计算它们的和。

解析:这道题目考察了大整数的相加运算,需要注意的是两个整数的位数可能不相等。

解答:可以使用数组来存储大整数,并且从末位开始逐位相加,将结果保存在另一个数组中。

需要注意的是,如果相加的结果超过了9,就需要进位。

具体步骤如下:1. 将两个大整数拆分成数组,并对齐使其位数相等,不足位的用0填充。

2. 从最后一位开始相加,将结果保存在结果数组中,并判断是否需要进位。

3. 将结果数组转化为字符串即为最终答案。

三、问题三:大整数相乘问题描述:给定两个非负整数a和b,求其乘积。

解析:这道题目是大数运算中比较经典的问题,需要注意的是乘法的进位问题。

解答:同样可以使用数组来存储大整数,在计算过程中进行逐位相乘,并将结果保存在结果数组中。

需要注意的是,乘法的进位规律。

具体步骤如下:1. 将两个大整数分解成数组,并定义一个结果数组,数组长度为a的位数+b的位数。

2. 从后向前遍历乘法计算,每次计算两个位上的乘积,并将结果保存在对应的位置上。

3. 遍历结果数组,将每个位置上的数字都进行进位处理。

4. 将结果数组转化为字符串即为最终答案。

四、问题四:大数的阶乘问题描述:给定一个正整数n,求n的阶乘。

解析:阶乘的计算涉及到大数的乘法运算,需要考虑进位问题。

解答:可以通过逐位乘法来计算阶乘。

将每个乘积的结果保存在数组中,并在遍历过程中将进位处理。

10000的阶乘的算法

10000的阶乘的算法

10000的阶乘的算法(大数的阶乘)很多天没有更新自己的Blog了,前几天拿到一个题目.就是写一段程序计算10000的阶乘.当时我还以为这题目非常简单,没想到还是需要动点大脑的.花了将近半个小时才搞定,拿出来分享一下.为什么不能用普通的方法来写呢,比如说递归?在我的教科书上可是用的是递归呀?不知道你注意没有,如果是100的阶乘的话,其结果肯定是非常大的,以我们现有语言的数据类型肯定是没法使用的,就拿C来说,long型能存的下100的阶乘吗?未必.所以我就使用数组来存储结果的每一位,然后输出每一位不就是结果吗.那么具体怎样去做?首先确定结果的位数?如何确定呢?请看下面.2!=1*2<=10*103!=1*2*3<=10*10*10.......所以我们可以得出一个结论n!<=10n所以n!的位数可以这样计算:两边取对数,即log10n!<=log1010n两边n>=Log101+Log102+Log10 3+....Log10 n这样n!的位数肯定等于小于Log101+Log102+Log10 3+....Log10 n.以上是错误的正确的推断如下:可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有 =log10^n!即:M = log10^1+log10^2+log10^3...+log10^n循环求和,就能算得M值,该M是n!的精确位数。

位数的确定解决之后,就看看如何计算了.看看如下代码:1 int index=0;2 long carrier=0;3 double bitCount = 1;4 int begin = 0;56 for(index=2; index<=n; ++index)7 {8 long multiValue = 0;9 bitCount += log10((long double)index);10 if(arrValue[begin] == 0)11 begin++;1213 for(int j=begin; j<int(bitCount); ++j)14 {15 multiValue += (index*arrValue[j]);16 arrValue[j] = char(multiValue % 10);17 multiValue /= 10;18 }19 }这里就是计算的关键了.注意一下进位问题即可.所有代码如下:12/**///////////////////////////////////////////////////////////////// //////////3// Date created: 2005/07/124// Author: Confach Zhang5// Purpose: 计算n!的值6/**///////////////////////////////////////////////////////////////// //////////789using namespace std;10#include "StdAfx.h"11#include <iostream.h>12#include <conio.h>13#include <stdlib.h>14#include <math.h>15#include <stdio.h>16#include <iomanip.h>1718int GetNumber(); //输入 n19int GetBitLength(int n); //求n!的位数20char* Initialize(int); //初始化存储结果的值21void PrintValue(char *a,int size); //打印值到屏幕22void PrintValue(char *a,int size,char* fileName); //打印值到文件23char* GetValue(int val); //计算24char* SubGetValue(char* ,int);252627int main()28{29 int value=GetNumber();30 char fileName[16];31 int size=GetBitLength(value);32 char *pa = Initialize(size);34 //pa=GetValue();35 pa=GetValue(value);3637 PrintValue(pa,size);3839 //sprintf(fileName,"%s","10000!.txt");40 sprintf(fileName,"%d!.txt",value);4142 PrintValue(pa,size,fileName);43 delete []pa; //note:44 return 1;45}46//函数GetValue47// 求得计算结果48//返回结果49//History:50//1)char* GetValue()51//2)GetValue(int val)52// 参数:val 计算阶乘的值53char* GetValue(int val)54{55 //定义一个数组存储阶乘的值56 //首先得到10000!阶乘的位数57 int VALUE=val;58 int length=GetBitLength(VALUE);59 char *arrValue = new char[length];60 if(!arrValue) {61 cout <<"申请内存失败!" << endl;62 exit(1);63 }64 arrValue[0] = 1;65 for(int i=1; i<length; i++)66 arrValue[i] = 0;67 arrValue=SubGetValue(arrValue,VALUE);68 return arrValue;69}7071char* SubGetValue(char* arrValue,int n)72{73 int index=0;74 long carrier=0;75 double bitCount = 1;76 int begin = 0;78 for(index=2; index<=n; ++index)79 {80 long multiValue = 0;81 bitCount += log10((long double)index);82 if(arrValue[begin] == 0)83 begin++;8485 for(int j=begin; j<int(bitCount); ++j)86 {87 multiValue += (index*arrValue[j]);88 arrValue[j] = char(multiValue % 10);89 multiValue /= 10;90 }91 }92 return arrValue;93}9495//得到计算阶乘的值,此函数为新增96int GetNumber()97{98 int n;99 cout << "请输入要计算阶乘的n值: ";100 cin >> n;101 while(n < 0) {102 cout << "输入错误,请重新输入: ";103 cin >> n;104 }105 if(n == 0)106 exit(1);107 return n;108}109110//函数GetBitLength111// 求得计算结果的位数,本函数为新增加112//参数113// n 需要计算的阶乘的数114//返回结果的位数115int GetBitLength(int n)116{117 double sum = 1.0;118 for(int i=1; i<=n; i++)119 sum += log10((long double)i);120 return int(sum);122//-----------123//函数:Initialize124// 初始化存储结果的数组125//参数:126// size 数组的长度127//返回值128// 初始化后的数组129//-------------130char * Initialize(int size)131{132 char *arrValue = new char[size];133 if(!arrValue) {134 cout << size<<"太大,申请内存失败!" << endl; 135 exit(1);136 }137 arrValue[0] = 1;138 for(int i=1; i<size; i++)139 arrValue[i] = 0;140 return arrValue;141}142143//-----------144//函数:PrintValue145// 将结果输入到屏幕上146//参数:147// buff 存储结果的数组148// buffLen 数组的长度149// fileName 文件名150//-------------151void PrintValue(char *buff, int buffLen)152{153 int bit = 0;154 int nCol=0;155 for(int i=buffLen-1; i>=0; i--) {156 if(bit % 10 == 0)157 {158 cout << " " ;159 nCol++;160 if(nCol==10)cout<<endl;161 }162 cout << int (buff[i]);163 bit++;164 }165 cout << endl;166167}168//-----------169//函数:PrintValue170// 将结果输入到一个文件中171//参数:172// buff 存储结果的数组173// buffLen 数组的长度174// fileName 文件名175//-------------176177void PrintValue(char *buff,int buffLen,char *fileName) 178{179 int bit = 0;180 int nCol=0;181182 FILE *fp=NULL;183 //-----------------------------184185 if (fileName==NULL) return ;186 fp=fopen(fileName,"wt");187 if (fp==NULL)188 {189 printf("不能创建文件%s",fileName);190 return ;191 }192193 for(int i=buffLen-1; i>=0; i--)194 {195 fprintf(fp,"%d",int(buff[i]));196197 if(bit % 9 == 0)198 {199 fprintf(fp,"%s"," ");200 nCol++;201 if(nCol==8)202 {203 fprintf(fp,"%s","\n");204 nCol=0;205 }206 }207 bit++;208209 }210 fprintf(fp,"\n"); 211 fclose(fp);212}213好了,不说了.算法通过将输入的两个数,先进行反串,然后用指针分别置数的最低位,进行乘法,然后将余数保存到结构中,将进位暂先放到一个变量中,然后将被乘数往高位移动一个数字,再将其与乘数的最低位相乘,加上上一轮中的进位,即为该轮的值,按照同样的方法,可以将其进位、低位保存。

阶乘认识阶乘的概念和计算方法

阶乘认识阶乘的概念和计算方法

阶乘认识阶乘的概念和计算方法阶乘是数学中的一个概念,用于描述一个正整数与小于它的所有正整数的乘积。

在数学中,阶乘用叹号符号表示,比如n!表示n的阶乘。

阶乘的计算方法有很多,下面将介绍几种常用的计算方法。

1.递归法:递归是一种自我调用的方法,计算阶乘可以利用递归思想。

具体算法如下:定义递归函数factorial(n),当n为0或1时,返回1;当n大于1时,返回n乘以factorial(n-1)的结果。

利用递归调用的思想,可以简洁地计算阶乘。

2.循环法:循环是另一种计算阶乘的常用方法。

具体算法如下:定义一个变量result,初始值为1。

然后从1循环到n,每次将当前循环变量的值乘以result,并将结果赋给result。

循环结束后,result的值即为n的阶乘。

3.递推法:递推法是一种基于已知阶乘的值推导出新值的方法。

具体算法如下:定义一个数组或列表factorial,初始时只包含1。

然后从2开始循环到n,每次将当前循环变量的值乘以factorial中最后一个元素,并将结果添加到factorial中。

循环结束后,factorial中最后一个元素即为n的阶乘。

阶乘的概念和计算方法对于数学的学习和问题求解都很重要。

在组合数学、概率论、统计学等领域,阶乘常常用于计算排列数和组合数。

在计算机科学中,阶乘的概念和计算方法也经常用于算法设计和计算复杂性分析。

总结一下,阶乘是数学中的一个重要概念,用于描述一个正整数与小于它的所有正整数的乘积。

计算阶乘的方法有递归法、循环法和递推法等。

掌握这些计算方法,对于数学学习和问题求解都有很大的帮助。

希望通过本文的介绍,读者对阶乘的概念和计算方法有更深入的认识。

高中二年级数学阶乘公式总结公式总结

高中二年级数学阶乘公式总结公式总结

高中二年级数学阶乘公式总结公式总结进入高二年级要求背诵的公式也逐渐增多,为此整理了数学阶乘公式,请同学们参考。

正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。

例如所要求的数是4,则阶乘式是1234,得到的积是24,24就是4的阶乘。

例如所要求的数是6,则阶乘式是1236,得到的积是720,720就是6的阶乘。

例如所要求的数是n,则阶乘式是123n,设得到的积是_,_就是n的阶乘。

任何大于1的自然数n阶乘表示方法:n!=123n或n!=n(n-1)!n的双阶乘:当n为奇数时表示不大于n的所有奇数的乘积如:7!!=1357当n为偶数时表示不大于n的所有偶数的乘积(除0外)如:8!!=2468小于0的整数-n的阶乘表示:(-n)!= 1 / (n+1)!以下列出0至20的阶乘:0!=1,注意(0的阶乘是存在的)1!=1,2!=2,3!=6,4!=24,5!=120,6!=720,7!=5,040,8!=40,3209!=362,88010!=3,628,80011!=39,916,80012!=479,001,60013!=6,227,020,80014!=87,178,291,20015!=1,307,674,368,00016!=20,922,789,888,00017!=355,687,428,096,00018!=6,402,373,705,728,00019!=121,645,100,408,832,00020!=2,432,902,008,176,640,000另外,数学家定义,0!=1,所以0!=1!以上是数学阶乘公式的所有内容,请同学们好好记忆并学会运用。

大数的阶乘

大数的阶乘

大数的阶乘众所周知,阶乘的定义就是n! = (n-1)!*n,但是有基本的初始条件的,即0! = 1因此1! = 1*0! = 1 * 1 = 1;2! = 2*1! = 2 * 1 = 2;依次类推,但是当n足够大时,整型根本无法装下n的阶乘,如果用C语言来实现的话,根本不可能,那怎么办呢?其实阶乘也无非是乘法和加法罢了,如4!= 24;我们可以用数组来存各位,结舌数组的起始长度是1哈,每当遇到超过长度时,就自加1,不过这里要稍微处理下的,我们可以倒过来存,以便做乘法的,可以这样来存。

4! 4 25! = 5 * 4!,可以用5去乘以4,如果大于10则需向高位进位,下一位的结果就等于下一位乘以5然后加上刚才的进位,当然也要取余数哈,然后继续看有没进位哈,知道遍乘数组每一位哈。

给个能求1000!的例子,用C语言实现的,供大家参考,以便交流学习哈。

#include <iostream>using namespace std;#define N 1000 // 所需求的N的阶乘static int a[N*3]; // 保存阶乘的各位int main(){int i,j; //临时变量int len = 1;int tem,carry;a[1] = 1; //1的阶乘for (i = 2;i<=N;i++) //求阶乘的方法{carry = 0;for (j=1;j<=len;j++){tem = a[j]*i +carry;a[j] = tem%10;carry = tem/10;if (j==len&&carry!=0){len++;}}}for (i = len;i>=1;i--) //输出各位{cout<<a[i];}cout<<endl;return 0;}我们也可以用Python来实现的哈,很简单两句话,就好啦Import mathMath.factorial(1000)就OK了,爽把!不过3.x以上的版本才有此函数哈。

大数阶乘算法

大数阶乘算法

*************************************(1)************************************ ****************假如需要计算n+16的阶乘,n+16接近10000,已经求得n!(共有m个单元),(每个单元用一个long数表示,表示1-100000000)第一种算法(传统算法)计算(n+1)! 需要m次乘法,m次加法(加法速度较快,可以不予考虑,下同),m次求余(求本位),m次除法(求进位),结果为m+1的单元计算(n+2)! 需要m+1次乘法,m+1次求余,m+1次除法, 结果为m+1个单元计算(n+3)! 需要m+1次乘法,m+1次求余,m+1次除法,结果为m+2个单元计算(n+4)! 需要m+2次乘法,m+2次求余,m+2次除法,结果为m+2个单元计算(n+5)! 需要m+2次乘法,m+2次求余,m+2次除法,结果为m+3个单元计算(n+6)! ...计算(n+7)! ...计算(n+8)! ...计算(n+9)! ...计算(n+10)! ...计算(n+11)! ...计算(n+12)! ...计算(n+13)! ...计算(n+14)! 需要m+7次乘法,m+7次求余,m+7次除法,结果为m+7个单元计算(n+15)! 需要m+7次乘法,m+7次求余,m+7次除法,结果为m+8个单元计算(n+16)! 需要m+8次乘法,m+8次求余,m+8次除法,结果为m+8个单元该算法的复杂度:共需:m+(m+8)+(m+1+m+7)*7=16m+64次乘法,16m+64次求余,16m+64次除法第二种算法:1.将n+1 与n+2 相乘,将n+3 与n+4 相乘,将n+5 与n+6...n+15与n+16,得到8个数,仍然叫做n1,n2,n3,n4,n5,n6,n7,n82. n1 与n2相乘,结果叫做p2,结果为2个单元,需要1次乘法。

求阶乘的计算

求阶乘的计算

求阶乘的计算阶乘是数学中常用的概念,表示一个正整数 n 与小于等于它的所有正整数的乘积。

阶乘的计算在数学、计算机科学和统计学等领域都有广泛的应用。

本文将介绍阶乘的定义、计算方法以及其应用。

首先,我们来定义阶乘。

阶乘可以用数学符号 n! 来表示,其中 n 为一个正整数。

n! 表示从 1 到 n 的所有正整数的乘积。

比如,5! = 5 * 4 * 3 * 2 * 1 = 120。

阶乘的计算方法有多种。

其中一种常用的方法是通过递归实现。

递归是一种方法,其中函数在其定义中调用自身。

在阶乘计算中,可以定义一个函数 factorial(n),用于计算 n 的阶乘。

这个函数会不断调用自身,并将问题分解为更小的子问题,直到问题的规模变为最简单的情况。

最后,所有子问题的解将会被合并,得到最终的结果。

下面是使用递归计算阶乘的示例代码:'''def factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)'''这段代码中,函数 factorial(n) 首先检查 n 的值是否为 0 或者 1。

如果是,则返回 1,因为 0 的阶乘和 1 的阶乘都是 1。

如果 n 大于 1,则函数会调用自身,并将结果与 n 相乘,得到 n 的阶乘。

除了递归计算,还有其他方法可以计算阶乘。

例如,可以使用循环来实现阶乘。

循环是一种重复执行一段代码的结构,直到满足某个条件时停止。

在阶乘计算中,可以从 1 开始循环,将每个数字乘到一个变量中,直到达到 n。

下面是使用循环计算阶乘的示例代码:'''def factorial(n):result = 1for i in range(1, n+1):result *= ireturn result'''这段代码中,循环从 1 开始,乘到 n,每次将 i 乘到 result 变量中。

阶乘放缩常用方法

阶乘放缩常用方法

阶乘放缩常用方法
常用的阶乘放缩方法有以下几种:
1. Stirling近似公式:Stirling近似公式可以用来估计大数的阶乘。

对于非负整数n,Stirling近似公式为:n! ≈ √(2πn) *
(n/e)^n ,其中e是自然对数的底数2.71828…,π是圆周率。

2. 高斯放缩法:高斯放缩法是一种通过找到n!中因子2和5的个数来估计阶乘的方法。

阶乘中的因子2的个数肯定大于因子
5的个数,所以实际上只需要估计因子5的个数。

假设n! =
2^a * 5^b * k,其中k不包含因子2和5,那么n!中因子5的
个数b就是阶乘放缩的结果。

3. 对数放缩法:对数放缩法是一种将阶乘转为对数求和的方法。

对于非负整数n,它的阶乘可以表示为ln(n!) = ln(1) + ln(2)
+ … + ln(n)。

然后可以利用对数恒等式ln(a*b) = ln(a) + ln(b)来简化计算。

此外,对数放缩法还可以用来求阶乘的末尾0的个数。

根据公式n!中因子2的个数肯定大于因子5的个数,所以阶乘的末尾0的个数就等于因子5的个数。

这些阶乘放缩方法可根据具体情况选择使用,以提高计算效率。

ACM常用代码

ACM常用代码

一、数学问题1.精度计算——大数阶乘语法:int result=factorial(int n);参数:n: n 的阶乘返回值:阶乘结果的位数注意:本程序直接输出n!的结果,需要返回结果请保留long a[]需要 math.h源程序:int factorial(int n){long a[10000];int i,j,l,c,m=0,w;a[0]=1;for(i=1;i<=n;i++){c=0;for(j=0;j<=m;j++){a[j]=a[j]*i+c;c=a[j]/10000;a[j]=a[j]%10000;}if(c>0) {m++;a[m]=c;}}w=m*4+log10(a[m])+1;printf("\n%ld",a[m]);for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);return w;}2.精度计算——乘法(大数乘小数)语法:mult(char c[],char t[],int m);参数:c[]:被乘数,用字符串表示,位数不限t[]:结果,用字符串表示m:乘数,限定10以内返回值: null注意:需要 string.h源程序:void mult(char c[],char t[],int m){int i,l,k,flag,add=0;char s[100];l=strlen(c);for (i=0;i<l;i++)s[l-i-1]=c[i]-'0';for (i=0;i<l;i++){k=s[i]*m+add;if (k>=10){s[i]=k%10;add=k/10;flag=1;} else {s[i]=k;flag=0;add=0;}}if (flag) {l=i+1;s[i]=add;} else l=i;for (i=0;i<l;i++)t[l-1-i]=s[i]+'0';t[l]='\0';}3.精度计算——乘法(大数乘大数)语法:mult(char a[],char b[],char s[]);参数:a[]:被乘数,用字符串表示,位数不限b[]:乘数,用字符串表示,位数不限t[]:结果,用字符串表示返回值: null注意:空间复杂度为 o(n^2)需要 string.h源程序:void mult(char a[],char b[],char s[]){inti,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;char result[65];alen=strlen(a);blen=strlen(b);for (i=0;i<alen;i++)for (j=0;j<blen;j++)res[i][j]=(a[i]-'0')*(b[j]-'0');for (i=alen-1;i>=0;i--){for (j=blen-1;j>=0;j--)sum=sum+res[i+blen-j-1][j];result[k]=sum%10;k=k+1;sum=sum/10;}for (i=blen-2;i>=0;i--){for (j=0;j<=i;j++)sum=sum+res[i-j][j];result[k]=sum%10;k=k+1;sum=sum/10;}if (sum!=0) {result[k]=sum;k=k+1;}for (i=0;i<k;i++) result[i]+='0';for (i=k-1;i>=0;i--) s[i]=result[k-1-i];s[k]='\0';while(1){if (strlen(s)!=strlen(a)&&s[0]=='0')strcpy(s,s+1);elsebreak;}}4.精度计算——加法语法:add(char a[],char b[],char s[]);参数:a[]:被乘数,用字符串表示,位数不限b[]:乘数,用字符串表示,位数不限t[]:结果,用字符串表示返回值: null注意:空间复杂度为 o(n^2)需要 string.h源程序:void add(char a[],char b[],char back[]){int i,j,k,up,x,y,z,l;char *c;if (strlen(a)>strlen(b)) l=strlen(a)+2; elsel=strlen(b)+2;c=(char *) malloc(l*sizeof(char));i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i>=0||j>=0){if(i<0) x='0'; else x=a[i];if(j<0) y='0'; else y=b[j];z=x-'0'+y-'0';if(up) z+=1;if(z>9) {up=1;z%=10;} else up=0;c[k++]=z+'0';i--;j--;}if(up) c[k++]='1';i=0;c[k]='\0';for(k-=1;k>=0;k--)back[i++]=c[k];back[i]='\0';}5.精度计算——减法语法:sub(char s1[],char s2[],char t[]);参数:s1[]:被减数,用字符串表示,位数不限s2[]:减数,用字符串表示,位数不限t[]:结果,用字符串表示返回值: null注意:默认s1>=s2,程序未处理负数情况需要 string.h源程序:void sub(char s1[],char s2[],char t[]){int i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);t[l1]='\0';l1--;for (i=l2-1;i>=0;i--,l1--){if (s1[l1]-s2[i]>=0)t[l1]=s1[l1]-s2[i]+'0';else{t[l1]=10+s1[l1]-s2[i]+'0';s1[l1-1]=s1[l1-1]-1;}}k=l1;while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}while(l1>=0) {t[l1]=s1[l1];l1--;}loop:if (t[0]=='0'){l1=strlen(s1);for (i=0;i<l1-1;i++) t[i]=t[i+1];t[l1-1]='\0';goto loop;}if (strlen(t)==0) {t[0]='0';t[1]='\0';}}6.任意进制转换语法: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){long i,j,t,num;char c;num=0;for (i=0;s[i]!='\0';i++){if (s[i]<='9'&&s[i]>='0') t=s[i]-'0';else t=s[i]-'A'+10;num=num*d1+t;}i=0;while(1){t=num%d2;if (t<=9) s2[i]=t+'0'; elses2[i]=t+'A'-10;num/=d2;if (num==0) break;i++;}for (j=0;j<i/2;j++){c=s2[j];s2[j]=s[i-j];s2[i-j]=c;}s2[i+1]='\0';}7.最大公约数、最小公倍数语法: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){int r=0;while(b!=0){r=a%b;a=b;b=r;}return(a);}lcd(int u,int v,int h){return(u*v/h);}8.组合序列语法: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){int i,t;if(m1<0 || m1>n1) return;if(m1==n1){for(i=0;i<m;i++) cout<<a[i]<<' '; // 输出序列cout<<'\n';return;}m_of_n(m,n1-1,m1,a,head); // 递归调用t=a[head];a[head]=a[n1-1+head];a[n1-1+head]=t;m_of_n(m,n1-1,m1-1,a,head+1); // 再次递归调用t=a[head];a[head]=a[n1-1+head];a[n1-1+head]=t;}9.快速傅立叶变换(FFT)语法:kkfft(double pr[],double pi[],int n,int k,double fr[],doublefi[],int l,int il);参数:pr[n]输入的实部:pi[n]数入的虚部:n,k:满足n=2^kfr[n]输出的实部:fi[n]输出的虚部:l:逻辑开关,0 FFT,1 ifFTil:逻辑开关,0 输出按实部/虚部;1 输出按模/幅角返回null值:注意:需要 math.h源程序:void kkfft(pr,pi,n,k,fr,fi,l,il)int n,k,l,il;double pr[],pi[],fr[],fi[];{int it,m,is,i,j,nv,l0;double p,q,s,vr,vi,poddr,poddi;for (it=0; it<=n-1; it++){m=it; is=0;for (i=0; i<=k-1; i++){j=m/2; is=2*is+(m-2*j); m=j;}fr[it]=pr[is]; fi[it]=pi[is];}pr[0]=1.0; pi[0]=0.0;p=6.283185306/(1.0*n);pr[1]=cos(p); pi[1]=-sin(p);if (l!=0) pi[1]=-pi[1];for (i=2; i<=n-1; i++){p=pr[i-1]*pr[1];q=pi[i-1]*pi[1];s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);pr[i]=p-q; pi[i]=s-p-q;}for (it=0; it<=n-2; it=it+2){vr=fr[it]; vi=fi[it];fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];fr[it+1]=vr-fr[it+1];fi[it+1]=vi-fi[it+1];}m=n/2; nv=2;for (l0=k-2; l0>=0; l0--){m=m/2; nv=2*nv;for (it=0; it<=(m-1)*nv; it=it+nv)for (j=0; j<=(nv/2)-1; j++){p=pr[m*j]*fr[it+j+nv/2];q=pi[m*j]*fi[it+j+nv/2];s=pr[m*j]+pi[m*j];s=s*(fr[it+j+nv/2]+fi[it+j +nv/2]);poddr=p-q; poddi=s-p-q;fr[it+j+nv/2]=fr[it+j]-pod dr;fi[it+j+nv/2]=fi[it+j]-pod di;fr[it+j]=fr[it+j]+poddr;fi[it+j]=fi[it+j]+poddi;}}if (l!=0)for (i=0; i<=n-1; i++){fr[i]=fr[i]/(1.0*n);fi[i]=fi[i]/(1.0*n);}if (il!=0)for (i=0; i<=n-1; i++){pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);if(fabs(fr[i])<0.000001*fabs(fi[i])){if ((fi[i]*fr[i])>0)pi[i]=90.0;else pi[i]=-90.0;}elsepi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;}return;}10.Ronberg算法计算积分语法: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){return sin(x)/x; //在这里插入被积函数}double integral(double a,double b){double h=b-a;double t1=(1+f(b))*h/2.0;int k=1;double r1,r2,s1,s2,c1,c2,t2;loop:double s=0.0;double x=a+h/2.0;while(x<b){s+=f(x);x+=h;}t2=(t1+h*s)/2.0;s2=t2+(t2-t1)/3.0;if(k==1){k++;h/=2.0;t1=t2;s1=s2;goto loop;}c2=s2+(s2-s1)/15.0;if(k==2){c1=c2;k++;h/=2.0;t1=t2;s1=s2;goto loop;}r2=c2+(c2-c1)/63.0;if(k==3){r1=r2; c1=c2;k++;h/=2.0;t1=t2;s1=s2;goto loop;}while(fabs(1-r1/r2)>1e-5){r1=r2;c1=c2;k++;h/=2.0;t1=t2;s1=s2;goto loop;}return r2;}11.行列式计算语法:result=js(int s[][],int n)参数:s[][]:行列式存储数组n:行列式维数,递归用返回值:行列式值注意:函数中常数N为行列式维度,需自行定义源程序:int js(s,n)int s[][N],n;{int z,j,k,r,total=0;int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/if(n>2){for(z=0;z<n;z++){for(j=0;j<n-1;j++)for(k=0;k<n-1;k++)if(k>=z) b[j][k]=s[j+1][k+1]; else b[j][k]=s[j+1][k];if(z%2==0) r=s[0][z]*js(b,n-1);/*递归调用*/else r=(-1)*s[0][z]*js(b,n-1);total=total+r;}}else if(n==2)total=s[0][0]*s[1][1]-s[0][1]*s[1][0];return total;}12.求排列组合数语法:result=P(long n,long m); / result=long C(long n,long m);参数:m:排列组合的上系数n:排列组合的下系数返回值:排列组合数注意:符合数学规则:m<=n源程序:long P(long n,long m){long p=1;while(m!=0){p*=n;n--;m--;}return p;}long C(long n,long m){long i,c=1;i=m;while(i!=0){c*=n;n--;i--;}while(m!=0){c/=m;m--;}return c;}二、字符串处理1.字符串替换语法:replace(char str[],char key[],char swap[]);参数:str[]:在此源字符串进行替换操作key[]:被替换的字符串,不能为空串swap[]:替换的字符串,可以为空串,为空串表示在源字符中删除key[]返回值: null注意:默认str[]长度小于1000,如否,重新设定设定tmp大小需要 string.h源程序:void replace(char str[],char key[],char swap[]){int l1,l2,l3,i,j,flag;char tmp[1000];l1=strlen(str);l2=strlen(key);l3=strlen(swap);for (i=0;i<=l1-l2;i++){flag=1;for (j=0;j<l2;j++)if (str[i+j]!=key[j]){flag=0;break;}if (flag){strcpy(tmp,str);strcpy(&tmp[i],swap);strcpy(&tmp[i+l3],&str[i+l2]);strcpy(str,tmp);i+=l3-1;l1=strlen(str);}}}2.字符串查找语法:result=strfind(char str[],char key[]);参数:str[]:在此源字符串进行查找操作key[]:被查找的字符串,不能为空串返回值:如果查找成功,返回key在str中第一次出现的位置,否则返回-1注意:需要 string.h源程序:int strfind(char str[],char key[]){int l1,l2,i,j,flag;l1=strlen(str);l2=strlen(key);for (i=0;i<=l1-l2;i++){flag=1;for (j=0;j<l2;j++)if (str[i+j]!=key[j]){flag=0;break;}if (flag) return i;}return -1;}3.字符串截取语法:mid(char str[],int start,int len,char strback[])参数:str[]:操作的目标字符串start:从第start个字符串开始,截取长度为len的字符len:从第start个字符串开始,截取长度为len的字符strback[]截取的到的字符:返回值: 0:超出字符串长度,截取失败;1:截取成功注意:需要 string.h源程序:int mid(char str[],int start,int len,char strback[]){int l,i,k=0;l=strlen(str);if (start+len>l) return 0;for (i=start;i<start+len;i++)strback[k++]=str[i];strback[k]='\0';return 1;}三、计算几何1.叉乘法求任意多边形面积语法:result=polygonarea(Point *polygon,int N);参数:*polygon多变形顶点数组:N:多边形顶点数目返回值:多边形面积注意:支持任意多边形,凹、凸皆可多边形顶点输入时按顺时针顺序排列源程序:typedef struct {double x,y;} Point;double polygonarea(Point *polygon,int N){int i,j;double area = 0;for (i=0;i<N;i++) {j = (i + 1) % N;area += polygon[i].x * polygon[j].y;area -= polygon[i].y * polygon[j].x;}area /= 2;return(area < 0 ? -area : area);}2.求三角形面积语法:result=area3(float x1,float y1,float x2,float y2,floatx3,float y3);参数:x1~3:三角形3个顶点x坐标y1~3:三角形3个顶点y坐标返回值:三角形面积注意:需要 math.h源程序:float area3(float x1,float y1,float x2,float y2,floatx3,float y3){float a,b,c,p,s;a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));c=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));return s;}3.两矢量间角度语法:result=angle(double x1, double y1, double x2, double y2);参数:x/y1~2两矢量的坐标:返回值:两的角度矢量注意:返回角度为弧度制,并且以逆时针方向为正方向需要 math.h源程序:#define PI 3.1415926double angle(double x1, double y1, double x2, double y2){double dtheta,theta1,theta2;theta1 = atan2(y1,x1);theta2 = atan2(y2,x2);dtheta = theta2 - theta1;while (dtheta > PI)dtheta -= PI*2;while (dtheta < -PI)dtheta += PI*2;return(dtheta);}4.两点距离(2D、3D)语法:result=distance_2d(float x1,float x2,float y1,float y2);参数:x/y/z1各点的x、y、z坐标~2:返回值两点之间的距离:注意:需要 math.h源程序:float distance_2d(float x1,float x2,float y1,float y2){return(sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));}float distance_3d(float x1,float x2,float y1,float y2,float z1,floatz2){return(sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2 )));}5.射向法判断点是否在多边形内部语法:result=insidepolygon(Point *polygon,int N,Point p);参数:*polygon多边形顶点数组:N:多边形顶点个数p:被判断点返回值: 0:点在多边形内部;1:点在多边形外部注意:若p点在多边形顶点或者边上,返回值不确定,需另行判断需要 math.h源程序:#define MIN(x,y) (x < y ? x : y)#define MAX(x,y) (x > y ? x : y)typedef struct {double x,y;} Point;int insidepolygon(Point *polygon,int N,Point p){int counter = 0;int i;double xinters;Point p1,p2;p1 = polygon[0];for (i=1;i<=N;i++) {p2 = polygon[i % N];if (p.y > MIN(p1.y,p2.y)) {if (p.y <= MAX(p1.y,p2.y)) {if (p.x <=MAX(p1.x,p2.x)) {if (p1.y != p2.y) {xinters = (p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;if (p1.x == p2.x || p.x <= xinters)counter++;}}}}p1 = p2;}if (counter % 2 == 0)return(OUTSIDE);elsereturn(INSIDE);}6.判断点是否在线段上语法:result=Pointonline(Point p1,Point p2,Point p);参数:p1、p2:线段的两个端点p:被判断点返回值: 0:点在不在线段上;1:点在线段上注意:若p线段端点上返回1需要 math.h源程序:#define MIN(x,y) (x < y ? x : y)#define MAX(x,y) (x > y ? x : y)typedef struct {double x,y;} Point;int FC(double x1,double x2){if (x1-x2<0.000002&&x1-x2>-0.000002) return 1;else return 0;}int Pointonline(Point p1,Point p2,Point p){double x1,y1,x2,y2;x1=p.x-p1.x;x2=p2.x-p1.x;y1=p.y-p1.y;y2=p2.y-p1.y;if (FC(x1*y2-x2*y1,0)==0) return 0;if ((MIN(p1.x,p2.x)<=p.x&&p.x<=MAX(p1.x,p2.x))&&(MIN(p1.y,p2.y)<=p.y&&p.y<=MAX(p1.y,p2.y)))return 1; else return 0;}7.判断两线段是否相交语法:result=sectintersect(Point p1,Point p2,Point p3,Point p4);参数:p1两条线段的四个端点~4:返回0:两线段不相交;1:两线段相交;2两线段首尾相接值:注意:p1!=p2;p3!=p4;源程序:#define MIN(x,y) (x < y ? x : y)#define MAX(x,y) (x > y ? x : y)typedef struct {double x,y;} Point;int lineintersect(Point p1,Point p2,Point p3,Point p4){Point tp1,tp2,tp3;if((p1.x==p3.x&&p1.y==p3.y)||(p1.x==p4.x&&p1.y==p4.y)||(p2.x==p3.x&&p2.y==p3.y)| |(p2.x==p4.x&&p2.y==p4.y))return 2;//快速排斥试验if((MIN(p1.x,p2.x)<p3.x&&p3.x<MAX(p1.x,p2.x)&&MIN(p1.y,p2.y)<p3.y<MAX(p1.y,p2.y) )||(MIN(p1.x,p2.x)<p4.x&&p3.x<MAX(p1.x,p2.x)&&MIN(p1.y,p2 .y)<p3.y<MAX(p1.y,p2.y)));else return 0;//跨立试验tp1.x=p1.x-p3.x;tp1.y=p1.y-p3.y;tp2.x=p4.x-p3.x;tp2.y=p4.y-p3.y;tp3.x=p2.x-p3.x;tp3.y=p2.y-p3.y;if ((tp1.x*tp2.y-tp1.y*tp2.x)*(tp2.x*tp3.y-tp2.y*tp3.x)>=0) return 1;else return 0;}8.判断线段与直线是否相交语法:result=lineintersect(Point p1,Point p2,Point p3,Point p4);参数:p1、p2:线段的两个端点p3、p4:直线上的两个点返回值: 0:线段直线不相交;1:线段和直线相交注意:如线段在直线上,返回 1源程序:typedef struct {double x,y;} Point;int lineintersect(Point p1,Point p2,Point p3,Point p4){Point tp1,tp2,tp3;tp1.x=p1.x-p3.x;tp1.y=p1.y-p3.y;tp2.x=p4.x-p3.x;tp2.y=p4.y-p3.y;tp3.x=p2.x-p3.x;tp3.y=p2.y-p3.y;if((tp1.x*tp2.y-tp1.y*tp2.x)*(tp2.x*tp3.y-tp2.y*tp3.x)>=0)return 1; else return 0;}9.点到线段最短距离语法:result=mindistance(Point p1,Point p2,Point q);参数:p1、线段的两个端点p2:q判断点:回点q到线段p1p2的距离值:注意:需要 math.h源程序:#define MIN(x,y) (x < y ? x : y)#define MAX(x,y) (x > y ? x : y)typedef struct {double x,y;} Point;double mindistance(Point p1,Point p2,Point q){int flag=1;double k;Point s;if (p1.x==p2.x) {s.x=p1.x;s.y=q.y;flag=0;}if (p1.y==p2.y) {s.x=q.x;s.y=p1.y;flag=0;}if (flag){k=(p2.y-p1.y)/(p2.x-p1.x);s.x=(k*k*p1.x+k*(q.y-p1.y)+q.x)/(k*k+1);s.y=k*(s.x-p1.x)+p1.y;}if (MIN(p1.x,p2.x)<=s.x&&s.x<=MAX(p1.x,p2.x))return sqrt((q.x-s.x)*(q.x-s.x)+(q.y-s.y)*(q.y-s.y));elsereturnMIN(sqrt((q.x-p1.x)*(q.x-p1.x)+(q.y-p1.y)*(q.y-p1.y)),sqrt((q.x-p2.x)*(q.x-p2.x)+(q.y-p2.y)*(q.y-p2.y)));}10.求两直线的交点语法:result=mindistance(Point p1,Point p2,Point q);参数:p1~直线上不相同的两点p4:*通过指针返回结果p返回1:两直线相交;2:两直线平行值:注意:如需要判断两线段交点,检验k和对应k1(注释中)的值是否在0~1之间,用在0~1之间的那个求交点源程序:typedef struct {double x,y;} Point;int linecorss(Point p1,Point p2,Point p3,Point p4,Point *p){double k;//同一直线if ((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x)==0&&(p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x)==0) return 2;//平行,不同一直线if ((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y)==0) return 0;k=((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-( p4.x-p3.x)*(p2.y-p1.y));//k1=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x )-(p4.x-p3.x)*(p2.y-p1.y));(*p).x=p1.x+k*(p2.x-p1.x);(*p).y=p1.y+k*(p2.y-p1.y);return 1;//有交点}11.判断一个封闭图形是凹集还是凸集语法:result=convex(Point *p,int n);参数:*p:封闭曲线顶点数组n:封闭曲线顶点个数返回值: 1:凸集;-1:凹集;0:曲线不符合要求无法计算注意:默认曲线为简单曲线:无交叉、无圈源程序:typedef struct {double x,y;} Point;int convex(Point *p,int n){int i,j,k;int flag = 0;double z;if (n < 3)return(0);for (i=0;i<n;i++) {j = (i + 1) % n;k = (i + 2) % n;z = (p[j].x - p[i].x) * (p[k].y - p[j].y);z -= (p[j].y - p[i].y) * (p[k].x - p[j].x);if (z < 0)flag |= 1;else if (z > 0)flag |= 2;if (flag == 3)return -1; //CONCAVE}if (flag != 0)return 1; //CONVEXelsereturn 0;}12.Graham扫描法寻找凸包语法:Graham_scan(Point PointSet[],Point ch[],int n,int &len);参数:PointSe输入的点集t[]:ch[]:输出的凸包上的点集,按照逆时针方向排列n: PointSet中的点的数目len:输出的凸包上的点的个数返回值: null源程序:struct Point{float x,y;};float multiply(Point p1,Point p2,Point p0){return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));}float distance(Point p1,Point p2){return(sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));}void Graham_scan(Point PointSet[],Point ch[],int n,int &len){int i,j,k=0,top=2;Point tmp;for(i=1;i<n;i++)if((PointSet[i].y<PointSet[k].y)||((PointSet[i].y==PointSet[k].y)&&(PointSet[i].x<PointSet[k].x)))k=i;tmp=PointSet[0];PointSet[0]=PointSet[k];PointSet[k]=tmp;for (i=1;i<n-1;i++){k=i;for (j=i+1;j<n;j++)if ((multiply(PointSet[j],PointSet[k],PointSet[0])>0) ||((multiply(PointSet[j],PointSet[ k],PointSet[0])==0)&&(distance(PointSet[0] ,PointSet[j])<distance(PointSet[0],PointSet[k]))) )k=j;tmp=PointSet[i];PointSet[i]=PointSet[k];PointSet[k]=tmp;}ch[0]=PointSet[0];ch[1]=PointSet[1];ch[2]=PointSet[2];for (i=3;i<n;i++){while (multiply(PointSet[i],ch[top],ch[top-1])>=0) top--;ch[++top]=PointSet[i];}len=top+1;}四、数论1.x的二进制长度语法:result=BitLength(int x);参数:x:测长的x返回值: x的二进制长度源程序:int BitLength(int x){int d = 0;while (x > 0) {x >>= 1;d++;}return d;}2.返回x的二进制表示中从低到高的第i位语法:result=BitAt(int x, int i);参数:x:十进制 xi:要求二进制的第i位返回值:返回x的二进制表示中从低到高的第i位注意:最低位为第一位源程序:int BitAt(int x, int i){return ( x & (1 << (i-1)) );}3.模取幂运算语法:result=Modular_Expoent(int a,int b,int n);参数:a、b、na^b mod n 的对应参数:返回值: a^b mod n 的值注意:需要BitLength和BitAt源程序:int Modular_Expoent(int a,int b,int n){int i, y=1;for (i = BitLength(b); i > 0; i--){y = (y*y)%n;if (BitAt(b,i) > 0)y = (y*a)%n;}return y;}4.求解模线性方程语法:result=modular_equation(int a,int b,int n);参数:a、b、nax=b (mod n) 的对应参数:返回值:方程的解源程序:int ext_euclid(int a,int b,int &x,int &y) //求gcd(a,b)=ax+by{int t,d;if (b==0) {x=1;y=0;return a;}d=ext_euclid(b,a %b,x,y);t=x;x=y;y=t-a/b*y;return d;}void modular_equation(int a,int b,int n){int e,i,d;int x,y;d=ext_euclid(a,n,x,y);if (b%d>0)printf("No answer!\n");else{e=(x*(b/d))%n;for (i=0;i<d;i++)printf("The %dth answer is : %ld\n",i+1,(e+i*(n/d))%n);}}5.求解模线性方程组(中国余数定理)语法:result=Modular_Expoent(int a,int b,int n);参数:B[]、W[]a=B[] (mod W[]) 的对应参数:返回值: a 的值注意:其中W[],B[]已知,W[i]>0且W[i]与W[j]互质, 求a 源程序:int ext_euclid(int a,int b,int &x,int &y) //求gcd(a,b)=ax+by{int t,d;if (b==0) {x=1;y=0;return a;}d=ext_euclid(b,a %b,x,y);t=x;x=y;y=t-a/b*y;return d;}int China(int B[],int W[],int k){int i;int d,x,y,a=0,m,n=1;for (i=0;i<k;i++)n*=W[i];for (i=0;i<k;i++){m=n/W[i];d=ext_euclid(W[i],m,x,y);a=(a+y*m*B[i])%n;}if (a>0) return a;else return(a+n);}6.筛法素数产生器语法:result=prime(int a[],int n);参数:a[]:用于返回素数的数组n:产生n以内的素数,按升序放入a[]中返回值: n以内素数的个数注意:其中W[],B[]已知,W[i]>0且W[i]与W[j]互质, 求a 源程序:int prime(int a[],int n){int i,j,k,x,num,*b;n++;n/=2;b=(int *)malloc(sizeof(int)*(n+1)*2);a[0]=2;a[1]=3;num=2;for(i=1;i<=2*n;i++)b[i]=0;for(i=3;i<=n;i+=3)for(j=0;j<2;j++){x=2*(i+j)-1;while(b[x]==0){a[num++]=x;for(k=x;k<=2*n;k+=x)b[k]=1;}}return num;}7.判断一个数是否素数语法:result=comp(int n);参数:n:判断n是否素数返回值:素数返回1,否则返回0源程序:int comp(int n){int i,flag=1;for (i=2;i<=sqrt(n);i++)if (n%i==0) {flag=0;break;}if (flag==1) return 1; else return 0;}五、图论1.Prim算法求最小生成树语法:prim(Graph G,int vcount,int father[]);参数:G:图,用邻接矩阵表示vcount:表示图的顶点个数father[]用来记录每个节点的父节点:返回值: null注意:常数max_vertexes为图最大节点数常数infinity为无穷大源程序:#define infinity 1000000#define max_vertexes 5typedef int Graph[max_vertexes][max_vertexes];void prim(Graph G,int vcount,int father[]){int i,j,k;intlowcost[max_vertexes],closeset[max_vertexes],used[max_vertexes];for (i=0;i<vcount;i++){lowcost[i]=G[0][i];closeset[i]=0;used[i]=0;father[i]=-1;}used[0]=1;for (i=1;i<vcount;i++){j=0;while (used[j]) j++;for (k=0;k<vcount;k++)if ((!used[k])&&(lowcost[k]<lowcost[j])) j=k;father[j]=closeset[j];used[j]=1;for (k=0;k<vcount;k++)if (!used[k]&&(G[j][k]<lowcost[k])){ lowcost[k]=G[j][k];closeset[k]=j; }}}2.Dijkstra算法求单源最短路径语法:result=Dijkstra(Graph G,int n,int s,int t, int path[]);参数:G:图,用邻接矩阵表示n:图的顶点个数s:开始节点t:目标节点path[]:用于返回由开始节点到目标节点的路径返回值:最短路径长度注意:输入的图的权必须非负顶点标号从0开始用如下方法打印路径:i=t;while (i!=s){printf("%d<--",i+1);i=path[i];}printf("%d\n",s+1);源程序:int Dijkstra(Graph G,int n,int s,int t, int path[]){inti,j,w,minc,d[max_vertexes],mark[max_vertexes];for (i=0;i<n;i++) mark[i]=0;for (i=0;i<n;i++){ d[i]=G[s][i];path[i]=s; }mark[s]=1;path[s]=0;d[s]=0;for (i=1;i<n;i++){minc=infinity;w=0;for (j=0;j<n;j++)if ((mark[j]==0)&&(minc>=d[j])) {minc=d[j];w=j;}mark[w]=1;for (j=0;j<n;j++)if((mark[j]==0)&&(G[w][j]!=infinity)&&(d[j]>d[w]+G[w][j])){ d[j]=d[w]+G[w][j];path[j]=w; }}return d[t];}3.Bellman-ford算法求单源最短路径语法:result=Bellman_ford(Graph G,int n,int s,int t,int path[],intsuccess);参数:G:图,用邻接矩阵表示n:图的顶点个数s:开始节点t:目标节点path[]:用于返回由开始节点到目标节点的路径success函数是否执行成功:返回值:最短路径长度注意:输入的图的权可以为负,如果存在一个从源点可达的权为负的回路则success=0顶点标号从0开始用如下方法打印路径:i=t;while (i!=s){printf("%d<--",i+1);i=path[i];}printf("%d\n",s+1);源程序:int Bellman_ford(Graph G,int n,int s,int t,int path[],intsuccess){int i,j,k,d[max_vertexes];for (i=0;i<n;i++) {d[i]=infinity;path[i]=0;}d[s]=0;for (k=1;k<n;k++)for (i=0;i<n;i++)for (j=0;j<n;j++)if (d[j]>d[i]+G[i][j]){d[j]=d[i]+G[i][j];path[j]=i;}success=0;for (i=0;i<n;i++)for (j=0;j<n;j++)if (d[j]>d[i]+G[i][j]) return 0;success=1;return d[t];}4.Floyd-Warshall算法求每对节点间最短路径语法:Floyd_Washall(Graph G,int n,Graph D,Graph P);参数:G:图,用邻接矩阵表示n:图的顶点个数D: D[i,j]表示从i到j的最短距离P: P[i,j]表示从i到j的最短路径上j 的父节点返回值: null源程序:void Floyd_Washall(Graph G,int n,Graph D,Graph P){int i,j,k;for (i=0;i<n;i++)for (j=0;j<n;j++){ D[i][j]=G[i][j];P[i][j]=i; }for (i=0;i<n;i++) { D[i][i]=0;P[i][i]=0; }for (k=0;k<n;k++)for (i=0;i<n;i++)for (j=0;j<n;j++)if(D[i][j]>D[i][k]+D[k][j]){D[i][j]=D[i][k]+D[k][j];P[i][j]= P[k][j]; }}六、排序/查找1.快速排序语法:quicksort(int l,int r,int b[]);参数:l:排序上界,开始时l=0r:排序下界,开始时r=数组元素个数b[]:被排序的元素返回值: null注意:输出升序序列源程序:void quicksort(int l,int r,int b[]){int i,j,x;if(l>=r) return;i=l;j=r;x=b[i];while(i!=j){while(b[j]>x&&j>i) j--;if(i<j){b[i]=b[j];i++;}while(b[i]<x&&j>i)i++;if(i<j){b[j]=b[i];j--;}}b[i]=x;quicksort(l,j-1,b);quicksort(i+1,r,b);}2.希尔排序语法:shellsort(int a[],int n);参数:n:数组元素个数a[]:待排序数组返回值: null注意:输出升序序列源程序:void shellsort(int a[],int n){int i,j,g;int temp,k;g=n/2;while(g!=0){for(i=g+1;i<=n;i++){temp=a[i];j=i-g;while(j>0){k=j+g;if(a[j]<=a[k])j=0;else{temp=a[j];a[j]=a [k];a[k]=temp;}j=j-g;}}g=g/2;}}3.选择法排序语法:sort(int t[],int n);参数:t[]:待排序数组n:数组t[]元素的个数返回值: null注意:输出升序序列小规模排序用源程序:void sort(int t[],int n){int i,j,k,temp;for (i=0;i<n;i++){k=i;for (j=i;j<n;j++) if (t[j]<t[k]) k=j;temp=t[i];t[i]=t[k];t[k]=temp;}}4.二分查找语法:result=search_bin(int *t,int k);参数:t[]:待查找数组k:查找关键字返回值:如果k在t[]中存在,输出i:t[i]=k,否则输出-1注意:要求查找数组是有序升序序列源程序:int search_bin(int *t,int k){int low=1,high=10,mid;while (low<=high){mid=(low+high)/2;if (k==t[mid]) return mid;else if (k<t[mid]) high=mid-1;else low=mid+1;}return -1;}七、数据结构1.顺序队列源程序:#define maxsize 100typedef struct{int data[maxsize];int front;int rear;} sqqueue;int sqinit(sqqueue *p) //队列初始化{p->front=0;p->rear=0;return 1;}int enqueue(sqqueue *q, int e) //入队{if((q->rear+1)%maxsize==q->front)return 0;elseq->data[q->rear]=e;q->rear=(q->rear+1)%maxsize;return 1;}int dequeue(sqqueue *q) //出队{int e;if (q->front==q->rear)return 0;e=q->data[q->front];q->front=(q->front+1)%maxsize;return e;}int empty(sqqueue *q) //判空{int v;if (q->front==q->rear)v=1;elsev=0;return v;}int gethead(sqqueue *q) //取得头元素{int e;if (q->front==q->rear)e=-1;elsee=q->data[q->front];return e;}void display(sqqueue *q) //显示所有元素{int s;s=q->front;printf("the sequeue is display:\n");if (q->front==q->rear)printf("the sequeue is empty!");else{while(s<q->rear){printf("->%d", q->data[s]);s=(s+1)%maxsize;}printf("\n");}}main(sqqueue *head) //函数使用样例{。

理解阶乘的概念与计算方法

理解阶乘的概念与计算方法

理解阶乘的概念与计算方法阶乘是数学中一个重要的概念,用于描述一系列连续正整数的乘积。

在数学计算和实际问题中,阶乘的概念和计算方法都有很大的应用。

本文将详细介绍阶乘的概念和计算方法,帮助读者更好地理解和应用阶乘。

一、阶乘的概念阶乘是指从1开始连续的自然数相乘,乘到某个正整数n为止,记作n!,递推式为n!=(n-1)!*n。

阶乘的计算是一个递归过程,即n的阶乘可以通过(n-1)的阶乘来计算得到。

阶乘的定义中规定0的阶乘为1,即0!=1。

阶乘是组合数学、概率统计和计算机科学中常用的概念。

在组合数学中,阶乘用于计算排列和组合的总数。

在概率统计中,阶乘用于计算排列和组合的可能性。

在计算机科学中,阶乘用于算法设计和递归函数的计算。

二、阶乘的计算方法阶乘的计算方法有多种,包括递归法、循环法和数学公式法等。

下面将分别介绍这些计算方法。

1. 递归法递归法是一种常用的计算阶乘的方法。

递归算法是指在计算过程中调用自身来解决问题。

计算n的阶乘时,可以通过调用计算(n-1)的阶乘来求解。

递归法的代码如下:```def factorial(n):if n == 0:return 1else:return n * factorial(n-1)```上述代码首先判断n是否为0,若为0,则返回1,否则通过调用自身来计算(n-1)的阶乘,并乘以n得到结果。

2. 循环法循环法是另一种常用的计算阶乘的方法。

通过使用循环结构,逐步累乘计算得到阶乘的结果。

循环法的代码如下:```def factorial(n):result = 1for i in range(1, n+1):result *= ireturn result```上述代码使用循环结构,从1乘到n,最终得到n的阶乘结果。

3. 数学公式法除了递归法和循环法外,还可以使用数学公式来计算阶乘。

Gamma函数是阶乘的数学扩展,可以用于计算非整数的阶乘。

Gamma函数可以通过数学公式计算得到。

阶乘的相关运算公式

阶乘的相关运算公式

阶乘的相关运算公式阶乘,这个数学概念在我们的学习过程中可有着重要的地位呢!先来说说什么是阶乘。

阶乘用符号“!”表示,比如说 5 的阶乘,写作5! ,它就等于 5×4×3×2×1 。

简单来讲,就是从给定的那个数开始,依次乘以比它小 1 的数,一直乘到 1 为止。

那阶乘的运算公式都有啥呢?首先就是最基本的 n! = n×(n - 1)! 。

这个公式看起来有点绕,咱们来举个例子。

比如说算 6 的阶乘,也就是6! ,根据这个公式, 6! = 6×5! 。

而 5! 呢又等于 5×4×3×2×1 ,这样就能逐步算出 6! 的值啦。

再给大家说个有趣的事儿,我之前教过一个学生,他刚开始接触阶乘的时候,那叫一个迷糊。

有一次做作业,题目是算 4 的阶乘,他居然写成了 4×3×2 ,少乘了个 1 。

我就问他:“你咋把 1 给忘了呢?1 也是有作用的呀!”他挠挠头,不好意思地笑了。

从那以后,他就记住了阶乘的运算可不能少了最后的 1 。

还有一个重要的性质, 0! = 1 。

这可能会让一些同学感到奇怪,为啥 0 的阶乘是 1 呢?其实呀,这是为了让一些数学公式和运算能够更统一、更方便。

阶乘在数学的很多领域都有应用。

比如在排列组合中,要计算从 n 个不同元素中取出 m 个元素的排列数,就会用到阶乘。

另外,阶乘的增长速度是非常快的。

比如说 10! 就已经是 3628800 了。

随着数字越来越大,阶乘的值会变得超级大。

咱们再来说说怎么快速计算阶乘。

对于比较小的数,咱们可以直接一步一步乘。

但如果数字比较大,那可能就得借助一些数学方法或者计算机程序了。

阶乘这个概念虽然有点复杂,但只要咱们多练习、多思考,就一定能掌握它。

就像我那个迷糊的学生,后来不也搞清楚了嘛!总之,阶乘的运算公式虽然看起来有点头疼,但只要咱们耐心琢磨,多做几道题,就能轻松应对啦!希望大家都能在数学的海洋里畅游,把阶乘这个小怪兽给征服!。

大数的运算--阶乘

大数的运算--阶乘
int ans[10002][max_w]; int wei[10002];
int calMulti(int n) { int ci = 0; for(int i = 0; i < wei[n-1]; i++) { int tmp = ans[n-1][i] * n + ci; ci = tmp / base; ans[n][i] = tmp % base; } wei[n] = wei[n-1]; if(ci != 0) { ans[n][wei[n]] = ci; wei[n]++; }
memset(ans, 0, sizeof(ans)); memset(wei, 0, sizeof(wei)); ans[0][0] = 1; ans[1][0] = 1; wei[0] = wei[1] = 1; for(int i = 2; i <= 10000; i++) {
calMulti(i); } int n; while(scanf("%d",&n) != EOF) {
因为int的范围大致是9位所以base的最大值是100000000010000100000超过这个值就可能发生溢出的现象
大数的运算 --阶乘
今天复习了一下求阶乘
题பைடு நூலகம்:编写一个程序,可以输出10000内的阶乘
#include <cstdio> #include <cstdlib> #include <cstring> #define max_w 8002 #define base 100000
show(n); printf("%d\n",wei[10000]); } return 0; }

20000阶乘 算法 -回复

20000阶乘 算法 -回复

20000阶乘算法-回复"20000阶乘算法"的计算方式大约是这样的:1. 首先,我们需要明确什么是阶乘。

阶乘是指从1连乘到某个正整数n的乘积,用n!表示。

例如,5! = 5 * 4 * 3 * 2 * 1 = 120。

2. 当计算较小的阶乘时,可以通过直接遍历计算得到结果。

但是,当计算较大的阶乘时,直接遍历计算效率很低,甚至超出计算机的表示范围。

3. 其中一种常见的算法是使用递归的方式计算阶乘。

递归算法的思想是将大问题划分为较小的子问题,并不断递归地解决子问题,最终得到结果。

对于阶乘的计算,可以将问题划分为先计算n-1的阶乘,然后将结果乘以n,从而得到n的阶乘。

这个过程可以一直递归下去,直到计算到1的阶乘,即1! = 1。

4. 虽然递归算法是一种较为简单直观的思路,但是当计算大整数的阶乘时,由于递归的层次太多,容易导致栈溢出。

因此,我们需要考虑如何对递归算法进行优化。

5. 优化递归算法的一个常见方式是使用尾递归。

尾递归是指递归函数的最后一步是递归调用的情况。

在尾递归中,计算会立即返回递归函数的结果,而不需要再进行额外的计算步骤。

这样可以减少递归的层次,从而避免栈溢出的问题。

对于阶乘的计算,我们可以使用一个辅助函数来保存中间结果,并将中间结果作为参数传递给递归函数,从而实现尾递归。

6. 另一种优化递归算法的方式是使用迭代的方法代替递归。

迭代是指通过循环的方式重复执行一段代码,直到满足终止条件为止。

对于阶乘的计算,我们可以使用一个循环来代替递归,不断更新中间结果,最终得到阶乘的结果。

7. 当计算较大的阶乘时,仅仅使用尾递归或迭代还不足以满足需求。

这时,我们需要考虑如何处理大整数的乘法运算。

传统的乘法运算是一位一位进行相乘,再进行进位运算,但这种方法效率低下。

一种常见的优化乘法运算的方法是使用Karatsuba算法,该算法利用了数学上的性质,将大整数的乘法运算转化为较小整数的乘法运算,从而减少运算步骤。

n的阶乘的极限

n的阶乘的极限

n的阶乘的极限
n的阶乘的极限是n趋于无穷大。

具体来说,当n趋于无穷大时,n的阶乘会趋近于无穷大。

这个结论可以通过数学分析中
的阶乘函数的形式来推导出来。

阶乘函数的形式为:n!,表示从1到n的整数之积。

当n=0时,n!=1;当n为正整数时,n!等于n乘以(n-1)!,即:n!=n*(n-1)!;当n为负整数时,n!等于1除以(-1)的n次方,即:n!=1/(-1)^n。

由于阶乘函数n!表示从1到n的整数之积,因此当n趋于无穷大时,n的阶乘会趋近于无穷大。

这个结论也可以通过比较n!
和(n+1)!的大小来证明。

当n足够大时,(n+1)!远远大于n!,
因此n的阶乘在n足够大时会趋近于无穷大。

需要注意的是,在实际应用中,由于计算机的精度限制,当n
过大时,计算机可能会溢出或出现其他错误。

因此,在进行大规模的数值计算时,需要采用高精度计算或使用符号计算等其他方法来避免这些问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息科学与工程学院
编程设计实验文档
题目:较大数的阶乘
一、设计目的:
1.解决一般大数的阶乘问题,可以避免一般算法实行时的数据溢
出的弊端
2.培养自己对算法的理解,提高自身的水平
3.熟练对c语言的操作,加强对c语言的理解
二、设计分析:
实现一般较小的数的阶乘,可以直接利用普通的乘法进行循环
运算即可,即利用s=n*(n-1)的核心算法。

但是,当n比较
大的时候,会造成运算的结果,即s会变得特别大,便会造成
数据溢出。

此时,就需要另一种算法,是结果可以保存,不溢
出。

那么,这个算法就是要解决这个问题,所以,我想到另一
方式用来解决这个问题,即利用数组。

如下:
首先,定义两个整型的数组:
int a[200];//暂且先设定是200位,我称之为“结果数组” int add[200];//我称之为“进位数组”
现在具体说明两个数组的作用:
1.a[200]
比如说,一个数5的阶乘是120,那么我就用这个数组存储它: a[0]=0
a[1]=2
a[2]=1
因此,用这样的数组我们可以放阶乘后是200位的数
2.在介绍add[200]之前,我介绍一下算法的思想,就以6!为
例:
从上面我们知道了5!是怎样存储的。

就在5!的基础上来计算6!,演示如下:
fac[0]=fac[0]*6=0
fac[1]=fac[1]*6=12
fac[2]=fac[2]*6=6
3.现在就用到了我们的:“进位数组”add[1000].
先得说明一下:add[i]就是在第2步中用算出的结果中,第
i位向第i+1位的进位数值。

还是接上例:
add[0]=0;
add[1]=1; // 计算过程:就是 (a[1]+add[0]) % 10=1 add[2]=0; // 计算过程:就是 (a[2]+add[1]) % 10=0
.......
.......
.......
add[i+1] =( a[i+1] + add[i] ) % 10
三、算法流程图
四、主要模块功能及程序说明
本程序主要分为三个模块,第一个模块就是判断输出是否错误,当输入的数据是小于1的时候,程序的输出结果是显示“输入
错误;第二个模块当输入正确时模拟一个乘法的运算,先算出
该数的阶乘是多少兵保存在a[200]这个数组中;第三个模块
根据所得结果位数的判断如何按4个数字一组的输出这个数,
当所得结果为4的倍数时,我选择的是单独输出末尾四个数,
剩下的按“1234,”这样的形式输出,当所得结果不是4的倍
数时,我选择优先输出前面的几个数,把后面的数字按四个一
组“,1234”这样的形式输出。

五、实验结果:
1.当输出的数字小于0的时候
2.当输入的数所得的结果是4的倍数时,如输入11时
3.当输入的数所得的结果不是4的倍数时,如15
附录
A变量及函数功能说明
n是输入的数据
S是输出结果的位数除以4所得的余数
t是输出结果的位数除以4所得的商值
a[200]是用来保存最后结果的数组
temp为阶乘的任一元素与临时结果的某位的乘积结果digit表示所得结果的位数
carry表示进位
B.源程序代码
#include<stdio.h>
int main()
{
int n,s,t;
int a[200];
int carry;
int digit=1;
int temp,i,j;
scanf("%d",&n);
a[0]=1;
if(n<1)
printf("输入错误/n");
else
{
for(i=1;i<=n;++i)
{
for(j=1,carry=0;j<=digit;++j)
{
temp=a[j-1]*i+carry;
a[j-1]=temp%10;
carry=temp/10;
}
while(carry)
{
a[++digit-1]=carry%10;
carry/=10;
}
}
t=digit/4;
s=digit%4;
if(s==0)
{
for(i=t;i>1;i--)
printf("%d%d%d%d,",a[4*i-1],a[4*i-2],a[4*i-3],a[4*i-4]);
printf("%d%d%d%d",a[3],a[2],a[1],a[0]);
}
else
{
for(i=digit-1;i>=digit-s;i--)
printf("%d",a[i]);
for(i=t;i>0;i--)
printf(",%d%d%d%d",a[4*i-1],a[4*i-2],a[4*i-3],a[4*i-4]); }
}
}。

相关文档
最新文档