高精度模板( 加,减,乘低精高精,除低精高精(有余数),高精阶乘(200000以内) ) (C语言实现)(注释多多)

今天老师讲了如何用C语言来做大数与大数的运算
废话少说,下面是正文


#源代码+注释

//高精度合集(我把它做成了一个小程序,大家复制下来运行) 
#include <stdio.h>    //标准输入输出头文件 
#include <string.h>   //字符串头文件 
#include <math.h>     //数学函数 
#include <stdlib.h>
char s[10001],ss[10001];   //定义全局变量供下面的程序使用 
int a[10001],b[10001],c[10001];
char arr[1000000],cha[1000000];
int d,len;

int Compare(char a[],char b[])     //比较字符串的大小,方法不同于strcmp函数,类似于整型常量的比较
{
   
	
	int lena,lenb,i;
	lena=strlen(a);         //a的长度 
	lenb=strlen(b);         //b的长度 
	if(lena<lenb) 
		return -1;      //如果a的长度比b小,返回-1 
	else if(lena>lenb) 
		return 1;       //不是,返回1 
	else
	{
   
		if(strcmp(a,b)==0)     
			return 0;
		else
		{
    
			for(i=0;i<lena;i++)
			{
    
				if(a[i]>b[i]) 
					return 1;
				if(a[i]<b[i]) 
					return -1;
			}
			return 0;
		}
	}
}

int Judge(char ch[])         //判断字符串ch是否全为0,若全为0,返回1,否则返回0
{
   
	int i,k;
	k=strlen(ch);
	for(i=0;i<k;i++) 
		if(ch[i]!='0') 
			return 0;
		return 1;
}

/*-------------高精度加法--------------*/
void jia()     //自定义函数"jia"(名字low了一点(好像不是一点,但容易理解不是吗)) 
{
   
	int l1 = strlen(s);     //"strlen"是一个计算字符串长度的函数 
	int l2 = strlen(ss);    //将输入的两个字符串的长度赋值给l1,l2
	if (l1 > l2) 
		len = l1;      //将len赋值为l1,l2中大的那个 
	else 
		len = l2;
//		for (int i = 0 ; i <= len ; i++)  //清零(这里for循环和下面三句memset都为将字符串清零 ) 
//			a[i] = b[i] = c[i] = 0;
	memset(a,0,sizeof(a));    //清零too(只能清零,不能干别的) 
	memset(b,0,sizeof(b));    //这是清零函数(字符串)
	                                       //两个for循环是将输入的两个字符串倒过来
	for (int i = l1 - 1 ; i >= 0 ; i--)    //再将字符串里的字符转换为数字赋值给a,b整型数组 
		a[l1 - i - 1] = s[i] - '0';        //但为什么大数要用字符串存呢?
	for (int i = l2 - 1 ; i >= 0 ; i--)    //因为大数太大,用任何整型变量都存不下 
		b[l2 - i - 1] = ss[i] - '0';       //为什么要把字符串倒过来赋值呢? 
	                                //因为大数与大数是一位一位运算的,还要涉及进位等 
	for (int i = 0 ; i < len ; i++)
	{
   
		a[i] = a[i] + b[i];    //运算 
		a[i+1]+= a[i] / 10;    //如有进位,在后一位上加上 
		a[i] = a[i] % 10;      //原来那一位减掉进位了的 
	}
	if (a[len] != 0) 
		len++;    //如果有进位就多显示一位(这句话很重要)
	printf("结果:\n");
	printf("%s + %s = ",s,ss); 
	for (int i = len - 1 ;i >= 0 ;i--)  //输出结果 
		printf("%d",a[i]);
	printf("\n");
}                              //高精度加法你懂了吗? 


/*-------------高精度减法--------------*/	
void jian()
{
   
	int l1 = strlen(s);    //字符串长度 
	int l2 = strlen(ss);
	int flag = 0;         //一个记录正负的变量(后面就知道啦) 
	
	memset(a,0,sizeof(a));       
	memset(b,0,sizeof(b));		
	
	if ( l1 < l2 || (strcmp(s,ss) < 0 && l1 == l2) )    //这个比较重要是来判断前后两数的大小的  
	{
                                              //不然一个小的数减一个大的数是大于零的就尴尬了
		flag = 1; //这里是把正负记录下来  
		for (int i = l2 - 1 ; i >= 0 ; i--)    //倒过来输入 
			a[l2 - i - 1] = ss[i] - '0';      //将字符串里的字符转换为数字 
		for (int i = l1 - 1 ; i >= 0 ; i--)
			b[l1 - i - 1] = s[i] - '0';
	}
	else
	{
   
		
  • 29
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值