c++高精度运算(加、乘)

本文介绍了一种使用C++实现的高精度加法和乘法算法。通过对字符串形式的大数进行位逆置处理,并利用逐位相加及进位处理完成加法运算;通过模拟竖式乘法的过程来实现乘法运算。最后展示了完整的程序流程。
#include <stdio.h>
#include <iostream>
#include <memory.h>
#include <math.h>

using namespace std;

#define MI 1000

/*****************high precision computation********************/
int hpcAdd(char* a,char* b,int lena,int lenb,char *re)
{
	memset(re,0,MI);
	
	char rest=0;
	char tmp=0;
	int len=max(lena,lenb);
	int i;
	
	for(i=0;i<len;i++)
	{
		tmp=a[i]+b[i]+rest;
		re[i]=tmp%10;
		rest=tmp/10;
	}
	if(rest>0)
	{
		len++;
		re[len-1]=rest;
	}
	
	return len;
}

int hpcMui(char* a,char* b,int lena,int lenb,char *re)
{
	memset(re,0,MI+MI);
	
	char rest=0;
	char tmp=0;
	int len;
	int i,j,l;
	
	for(i=0;i<lena;i++)
	{
		for(j=0;j<lenb;j++)
		{
			tmp=a[i]*b[j];
			re[i+j]+=tmp%10;
			re[i+j+1]+=tmp/10;
			l=i+j;
			while(re[l]>=10)
			{
				re[l]=re[l]%10;
				tmp=re[l]/10;
				re[++l]+=tmp;
			}
		}
	}
	
	for(i=MI*2-1;i>=0;i--)
	{
		if(re[i]!=0)
		{
			break;
		}
	}
	i++;
	len=i;
	cout<<len<<endl;
	return len;
}

char turnUpsideDown(char* a,int lena)
{
	//数组逆置
	int i;int j;char t;
	i=0;
	j=lena-1;
	while(i<j)
	{
		t=a[i];
		a[i]=a[j];
		a[j]=t;
		++i;
		--j;
	}
	
	return 0;
}

char turntooutput(char *a,int len)
{
	int i;
	for(i=0;i<len;++i)
	{
		a[i]+=48;
	}
}

int main()
{
	cout<<"Input the two number:";
	char tina[MI],tinb[MI];
	char a[MI];
	char b[MI];
	char aAdd[MI];
	int ladd;
	char aMui[MI+MI];
	int lmui;
	memset(a,0,MI);
	memset(b,0,MI);
	int lena,lenb;
	cin>>tina>>tinb;
	cout<<endl; //一次性读入用户输入的数据 
	int i,j;
	char t;
	i=0;
	j=0;
	
	//解析数据
	while( 48<=tina[i] && tina[i]<=57 && i<MI)
	{
		a[i]=tina[i]-48;
		++i;
	}
	lena=i;
	
	while( 48<=tinb[j] && tinb[j]<=57 && i<MI)
	{
		b[j]=tinb[j]-48;
		++j;
	}
	lenb=j;

	turnUpsideDown(a,lena); //数组逆置 
	turnUpsideDown(b,lenb); //数组逆置

	ladd=hpcAdd(a,b,lena,lenb,aAdd);
	lmui=hpcMui(a,b,lena,lenb,aMui);

	turnUpsideDown(aAdd,ladd);
	turntooutput(aAdd,ladd);
	turnUpsideDown(aMui,lmui);
	turntooutput(aMui,lmui);
	cout<<aAdd<<endl<<aMui<<endl;

	return 0;
 } 

这是一份游戏规则,如果让你生成一个可以用游览器打开的小游戏,你有什么有疑问,或者有异议的地方 玩家技能 技能一 基础伤害:10 + 玩家当前攻击力×10(攻击力包含技能带来的永久成)。 击杀成:若击杀目标,技能伤害永久提升(新手+5,进阶+10,大师+20),叠方式为: 总成 = 5×新手击杀数 + 10×进阶击杀数 + 20×大师击杀数。 动态计算:攻击力提升后,技能伤害实时更新。 技能二 回复量:20 + 玩家当前攻击力×系数(系数由当前战斗的怪物类型决定:新手=0.1,进阶=0.2,大师=0.4)。 切换难度:若中途切换难度,系数立即更新为当前难度对应值。 技能三 基础伤害:10 + 玩家当前攻击力×0.5(攻击力包含永久成)。 击杀成:若击杀目标,玩家攻击力永久提升(新手+2,进阶+5,大师+10)。 成触发:攻击力提升后,技能三伤害实时更新。 技能四 基础伤害:10 + 玩家当前血量上限×0.1(血量上限包含技能四的永久成)。 击杀成:若击杀目标,血量上限永久提升(新手+50+当前生命值上限*0.1,进阶+100+当前生命值上限*0.1,大师+200+当前生命值上限*0.1)。 动态计算:血量上限提升后,技能四伤害实时更新。 属性叠机制 永久成:技能一、三、四的属性成均基于击杀怪物类型累计,与当前战斗难度无关。例如: 即使切换到大师难度,之前击杀的新手怪物仍保留对应的成。 成继承:切换难度时,所有永久成保留,但技能描述中的动态数值(如攻击力、血量上限)实时更新。 经验系统 怪物经验: 新手怪物:100×(1.5)^(玩家等级-1) 进阶怪物:1000×(1.5)^(玩家等级-1) 大师怪物:10000×(1.5)^(玩家等级-1) 升级所需经验:从LvN到Lv(N+1)需 100×(N+1)² 经验。 怪物类型与属性 基础属性: 新手:血量=100,攻击力=10;系数=0.2 进阶:血量=1000,攻击力=50;系数=0.5 大师:血量=10000,攻击力=200;系数=2 成长公式:当前属性 = 基础值 × (1 + 系数 × (等级 - 1)) 例如:大师怪物Lv5时,攻击力 = 200 × (1 + 2×4) = 1800 怪物等级机制 新手怪物:等级始终等于玩家当前等级。 进阶/大师怪物:每被击杀一次,等级+1(独立于玩家等级)。 生成规则: 玩家升级后,生成的新怪物: 新手怪物:等级=玩家新等级 进阶/大师怪物:没有击杀之前一直保持一级的状态 数值与显示 技能描述:实时显示动态数值,精度到小数点后两位。例如: 技能一显示:造成[10 + 10×攻击力 + 总成]点伤害(总成=5×新手击杀数 + 10×进阶击杀数 + 20×大师击杀数) UI显示: 条形图动态显示玩家与怪物血量 其他补充 血量恢复:玩家升级或怪物死亡时,血量立即回满(包括新增血量上限部分)。 难度切换:保留所有永久成,但怪物属性根据新难度重新计算(新手怪物等级=玩家等级,进阶/大师等级+1)。
最新发布
11-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值