栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

高精度基本运算(加减乘除)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

高精度基本运算(加减乘除)

高精度加法

题目描述

高精度加法,相当于a+b problem,不用考虑负数.

输入格式

分两行输入。a,b leq 10^{500}a,b≤10500

输出格式

输出只有一行,代表a+ba+b的值

输入输出样例

输入 #1复制

1
1

输出 #1

2

输入 #2

1001
9099

输出 #2复制

10100
#include

using namespace std;
int x[510],y[510],c[510],ans[510];

int main()
{
	string a,b;
	int i,j,lta,ltb;
	cin>>a>>b;
	int la=a.size();
	int lb=b.size();
	lta=la;//la在循环体里,不能在x[]中直接用 
	ltb=lb;
	for(i=0;i9)
		{
			c[i+1]++;//进位 
			ans[i]-=10;
		}
	}
	if(ans[len]!=0)
	{
		len++;//位数是否增加 
	}
	for(j=len-1;j>=0;j--)
	{
		cout<

高精度减法

题目描述

高精度减法。

输入格式

两个整数 a,b(第二个可能比第一个大)。

输出格式

结果(是负数要输出负号)。

输入输出样例

输入 #1

2
1

输出 #1

1
说明/提示
  • 20%20% 数据 a,ba,b 在 long long 范围内;
  • 100%100% 数据 0​ #include #include using namespace std; int x[10090],y[10090],c[10090],ans[10090]; int main() { string a,b; cin>>a>>b; int i,la,lb,flag=0,len1,len2; char op='-'; len1=a.size(); len2=b.size(); if(len11&&ans[len1-1]==0) len1--; if(flag) cout<=0;i--) cout< 高精度乘法
  • 题目描述

    求两数的积。

    输入格式

    两行,两个整数。

    输出格式

    一行一个整数表示乘积。

    输入输出样例

    输入 #1复制

    1 
    2

    输出 #1复制

    2
    说明/提示

    每个数字不超过 10^{2000}102000 ,需用高精。

  • #include
    using namespace std;
    int x[2010],y[2010],ans[4020];
    
    int main()
    {
    	string a,b;
    	int i,j;
    	cin>>a>>b;
    	int la=a.size();
    	int lb=b.size();
    	for(i=0;i9)
    		{
    			ans[i+1]+=ans[i]/10;
    			ans[i]%=10;
    		}
    	}
    
    	while(ans[len-1]==0&&len>1)
    	len--;
    	for(i=len-1;i>=0;i--)
    	{
    		cout<

    高精度除法

  • 题目描述

    输入两个整数 a,ba,b,输出它们的商。

    输入格式

    两行,第一行是被除数,第二行是除数。

    输出格式

    一行,商的整数部分。

    输入输出样例

    输入 #1复制

    10
    2

    输出 #1复制

    5
    说明/提示

    0le ale 10^{5000}0≤a≤105000,1le ble 10^91≤b≤109。

  • 法一(高精除以低精)

  • #include
    #include
    #include
    using namespace std;
    
    char a[5005];
    int ans[5005];
    
    int main()
    {
    	long long b,k=0,c=0;
    	int la,i,top=0,flag=0;
    	cin>>a;
    	cin>>b;
    	la=strlen(a);
    	for(i=0;i 

    法二(高精除以高精)

  •  #include
    #include
    #include
    using namespace std;
    
    int a[5005],b[100],c[5005],ans[5005];
    bool cmp();
    
    int main()
    {
    	string x,y;
    	int i,j,k;
    	cin>>x>>y;
    	a[0]=x.size();
    	b[0]=y.size();//a[0]b[0]c[0]均用于记录位数 
    	for(i=1;i<=a[0];i++)
    	{
    		a[i]=x[a[0]-i]-48;
    	}
    	for(i=1;i<=b[0];i++)
    	{
    		b[i]=y[b[0]-i]-48;//逆序 
    	}
    	c[0]=0;
    	for(i=a[0];i>=1;i--)
    	{
    		for(j=b[0];j>=1;j--)
    		{
    			c[j+1]=c[j];//数字右移,相当于乘上十次幂 
    		}
    		c[1]=a[i];
    		c[0]++;if(!c[c[0]])--c[0];
    		while(cmp())
    		{
    			int t=0;
    			for(k=1;k<=c[0];k++)
    			{
    				c[k]=c[k]-b[k]-t;
    				if(c[k]<0)
    				{
    					c[k]+=10;
    					t=1;
    				}
    				else t=0;
    			}
    			while(c[0]>1&&c[c[0]]==0)
    			{ 
    				c[0]--;//去除余数的前导0 
    			} 
    				ans[i]++;//每从c中减去一个b,当前位答案计数加1 
    		}
    	}
    	ans[0]=a[0];
    	while(ans[0]>1&&ans[ans[0]]==0)
    	ans[0]--;//去除答案前导0 
    	for(i=ans[0];i>=1;i--)
    	cout=1;i--)
    	{
    		if(c[i]b[i])
    		return 1;
    	}
    	return 1;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289872.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号