首页 > 其他分享 >高精度运算

高精度运算

时间:2022-11-09 12:37:39浏览次数:39  
标签:lb 运算 210 高精度 int la memset sizeof

高精度运算

高精度加减

1.主要处理高精度加减之流的问题,其思路大致为字符数组读入→ASCII转换→对应位数加减→处理进位,代码如下:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
char sa[210],sb[210];
int la,lb,lc,a[210],b[210],c[210];        //范围自取
int main(){
	scanf("%s",sa);
	scanf("%s",sb);
	la=strlen(sa);
	lb=strlen(sb);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(int i=0;i<la;i++){        //char与int转化
		a[la-i-1]=sa[i]-'0';
	}
	for(int i=0;i<lb;i++){
		b[lb-i-1]=sb[i]-'0';
	}
	lc=la>lb ?la: lb;        //确定结果位数上限
	memset(c,0,sizeof(c));
	for(int i=0;i<lc;i++){
		c[i]=a[i]-b[i]+c[i];
		if(c[i]<0){        //处理进位(借位)
			c[i+1]-=1;
			c[i]+=10;
		}
	}
	if(c[lc]<0)	lc--;
	for(int i=lc-1;i>=0;i--){        //使结果最高位非零
		if(c[i]==0)	lc--;
		else	break;
	}
	for(int i=lc-1;i>=0;i--){
		printf("%d",c[i]);
	}
	return 0;
}

2.​斐波那契数列问题涉及模运算有关性质:(a+b)%p=(a%p+b%p)%p。可以避免超出long long的情况,代码如下:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,t[1000010],a[1000010];
int main(){
	cin>>n;
	memset(t,0,sizeof(t));
	memset(a,0,sizeof(a));
	for(int i=1;i<=n;i++){
		cin>>t[i];
	}
	a[1]=1;
	a[2]=1;
	for(int i=3;i<=1000010;i++){
		a[i]=((a[i-1]%1000)+(a[i-2]%1000))%1000;        //控制单个数据大小
	}
	for(int i=1;i<=n;i++){
		cout<<a[t[i]]%1000<<endl;
	}
	return 0;
}

高精度乘除

基本步骤同上,但必须考虑进位与最高位问题,进位需使用单独变量,代码如下:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
long long la,lb,lc,x[20010],y[20010],z[20010],w,jw,f;        //注意数据大小
char a[20010],b[20010];
int main(){
	scanf("%s",a);
	scanf("%s",b);
	la=strlen(a);
	lb=strlen(b);
	memset(x,0,sizeof(x));
	memset(y,0,sizeof(y));
	memset(z,0,sizeof(z));
	for(int i=0;i<la;i++)	x[la-i-1]=a[i]-'0';
	for(int i=0;i<lb;i++)	y[lb-i-1]=b[i]-'0';
	for(int i=0;i<la;i++){
		for(int j=0;j<lb;j++){
			f=x[i]*y[j];        //f:记录结果
			jw=f/10;        //jw:记录进位
			f%=10;
			w=i+j;        //w:每次数组的下标
			z[w]+=f;
			z[w+1]+=jw+z[w]/10;//处理进位
			z[w]%=10;
		}
	}
	lc=la+lb;
	while(z[lc]==0)	lc--;
	if(lc<0)	printf("%d",0);
	else{
		for(int i=lc;i>=0;i--)	printf("%lld",z[i]);
	}
	return 0;
}

标签:lb,运算,210,高精度,int,la,memset,sizeof
From: https://www.cnblogs.com/Nebulary/p/16873217.html

相关文章

  • 零基础自学javase黑马课程第一天----算术运算符
    零基础自学javase黑马课程第一天----算术运算符✨欢迎关注......
  • C语言指针运算
    指针运算指针可以加减运算,但不可以乘除运算。在指针中p++并不是加一,而是以素的值为单位加一,指向下一个单位,加多少字节 要看类型是什么。在指针变量名字前面加*比......
  • 基础算法篇——位运算
    基础算法篇——位运算本次我们介绍基础算法中的位运算,我们会从下面几个角度来介绍:位运算常用公式二进制中1的个数位运算常用公式其实位运算的使用很常见但大多不难,......
  • java——运算符
                                                        ......
  • C语言的自增自减运算符
    简单去理解,C语言的自增自减运算符的最终结果就是对自身进行加一和减一操作。但是当++、--作为后缀时则具有延后性,可能对程序有一些副作用,并且其的优先级也会对程序产生一......
  • C语言逻辑运算符
    在C语言中,逻辑运算符有&&、||、!&&表示“与”的意思,需要两端的表达式的值都为true,该式的值才为true。||表示“或”的意思,两端的表达式的值只要有一端为true,该式的值就为t......
  • C语言逗号运算符
    在C语言中,逗号运算符虽然不起眼,但也是运算符的一种,而且在所有运算符中,逗号运算符的优先级是最低的。逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。逗号的......
  • 位运算的巧妙使用 -- 字母大小写转换
    引言C标准库的ctype.h头文件提供了一些函数,可用于测试和映射字符,其中有两个函数,inttolower(intc)该函数把大写字母转换为小写字母,inttoupper(intc),该函数把小写字母......
  • 不谈源码,聊聊位运算的实际应用
    Hello,这里是爱Coding,爱Hiphop,爱喝点小酒的AKA柏炎。位运算是java中比较基础的知识,位运算的计算速度很快,jdk中不少源码都是使用位运算​​(例如ArrayList,HashMap)​​。但......
  • C基础学习笔记——01-C基础第05天(运算符和流程结构语句)
    在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。01-C基础第05天(运算符和流程结构语句)目录:一、运算符(运算符优先级)二、程序流......