两个数相乘,小数点后位数没有限制,请写一个高精度算法 c语言,任意长度的高精度大整数和浮点数的加法和乘法...

任意长度的高精度大整数和浮点数的加法和乘法

一. 任意长度的高精度大整数加法

方法:这里用了数据结构栈,实际上栈更方便实现高精度加法。

步骤:1、第一个数据加数按输入顺序(高位到低位)入栈1。此时栈顶为最低位

2、‍第二个数据加数按输入顺序(高位到低位)入栈2。此时栈顶为最低位

3、将栈1、栈2均pop出栈顶做加法,并考虑进位,结果入栈3,这时栈3正好是低位入栈。

4、处理多余的栈1、栈2。

5、直接pop出栈3,即正好的从高位到低位的结果。

#include "iostream"

#include "stack"

using namespace std;

stacks1;

stacks2;

stacks3;

char c1[100];

char c2[100];

int main(void)

{

printf("请输入第一个加数:");

cin>>c1;

printf("请输入第二个加数:");

cin>>c2;

int len1=strlen(c1);

int len2=strlen(c2);

for(int i=0;i

二. 任意长度的高精度大整数乘法

#include "iostream"

#include "string"

using namespace std;

int main(void)

{

char str1[1000],str2[1000];

int i,j,len1,len2,len;

bool flag=false;

cout<9)

{

result[i+1]+=result[i]/10;

result[i]%=10;

}

}

cout<=0;i--)

{

if(flag)

cout<

三.两个数相加,小数点后位数没有限制,请写一个高精度算法

public class test

{

private static String addFloatNum(String num1, String num2)

{//两个浮点大数相加,小数点位数任意

String result = "";

int pos1,pos2,len1,len2;

len1 = num1.length();

len2 = num2.length();

pos1 = num1.indexOf('.');

pos2 = num2.indexOf('.');

//分别剥离两个数的整数和小数部分

String num1a = num1.substring(0, pos1);

String num1b = num1.substring(pos1+1, len1);

String num2a = num2.substring(0, pos2);

String num2b = num2.substring(pos2+1, len2);

//整数部分相加

String rsOne = add(num1a, num2a);

//小数位对齐,不足的补0

int i,nZeroes,maxLen;

maxLen = (num1b.length()>num2b.length()) ? num1b.length() : num2b.length();

if (num1b.length()>num2b.length())

{//第一个数的小数部分长,则第二个补不足的0

nZeroes = num1b.length() - num2b.length();//待补的0的个数

for (i = 0; i < nZeroes; ++i)

{

num2b += '0';

}

}

else if(num2b.length() > num1b.length())

{//第二个数的小数部分长,则第一个补不足的0

nZeroes = num2b.length() - num1b.length();//待补的0的个数

for (i = 0; i < nZeroes; ++i)

{

num1b += '0';

}

}

//小数位对齐准备完毕,进行小数部分相加

String rsTwo = add(num1b, num2b);

if (rsTwo.length() > maxLen)

{//说明有进位, 剥离第一位进位,加到整数部分去

String nAddOn = rsTwo.substring(0,1);

rsOne = add(rsOne, nAddOn);

rsTwo = rsTwo.substring(1,rsTwo.length());

}

//两部分结果拼凑起来

StringBuilder sb = new StringBuilder(rsOne);

sb.append(".");

sb.append(rsTwo);

result = sb.toString();

return result;

}

private static String add(String num1, String num2)

{ //大数相加

String result = "";

int len1 = num1.length();

int len2 = num2.length();

int nAddOn = 0;

int i,j,n1,n2,sum;

StringBuilder sb = new StringBuilder();

for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j)

{

n1 = num1.charAt(i) - '0';

n2 = num2.charAt(j) - '0';

sum = n1 + n2 + nAddOn;

if (sum >= 10)

{

nAddOn = 1;

}

else

{

nAddOn = 0;

}

sb.append(sum % 10);

}

if (len1 > len2)

{

for (; i >= 0; --i)

{

n1 = num1.charAt(i) - '0';

sum = n1 + nAddOn;

if (sum >= 10)

{

nAddOn = 1;

}

else

{

nAddOn = 0;

}

sb.append(sum % 10);

}

}

else if (len2 > len1)

{

for (; j >= 0; --j)

{

n2 = num2.charAt(j) - '0';

sum = n2 + nAddOn;

if (sum >= 10)

{

nAddOn = 1;

}

else

{

nAddOn = 0;

}

sb.append(sum % 10);

}

}

if (nAddOn > 0)

{

sb.append(nAddOn);

}

sb.reverse();

result = sb.toString();

return result;

}

public static void main(String[] args) throws Exception

{

String num1 = "13454354352454545454354354354354543.9999999999993545624524435245425435435435";

String num2 = "3415545435435435435435435434525435245245454252.999999999999999994535435435435252245426";

String result = addFloatNum(num1, num2);//大浮点数相加

System.out.println(result);

}

}

四.两个数相乘,小数点后位数没有限制,请写一个高精度算法。

算法分析:

输入 string a, string b; 计算string c=a*b; 返回 c;

1,    纪录小数点在a,b中的位置l1,l2, 则需要小数点后移动位置数为l=length(a)+length(b)-l1-l2-2;

2,    去掉a,b中的小数点,(a,b小数点后移,使a,b变为整数)

3,    计算c=a*b; (同整数的大数相乘算法)

4,    输出c,(注意在输出倒数第l个数时,输出一个小数点。若是输出的数少于l个,就补0) 代码为:

#includeusing namespace std;

#define MAX 10000

struct Node{

int data;

Node *next;

};

void output(Node *head,int pos)

{

if(!head->next&&!head->data)return;

output(head->next,pos-1);

cout

if(!pos)coutnext=0; //头

Node *p,*q=head,*p1;

int temp=0,temp1,bbit;

while(*bp) //若乘数不为空 ,继续.

{

p=q->next;p1=q;

bbit=*bp-48; //把当前位转为整型

while(*ap||temp) //若被乘数不空,继续

{

if(!p) //若要操作的结点为空,申请之

{

p=new Node;

p->data=0;

p->next=0;

p1->next=p;

}

if(*ap==0)temp1=temp;

else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }

p1->data=temp1%10; //留当前位

temp=temp1/10; //进位以int的形式留下.

p1=p;p=p->next; //被乘数到下一位

}

ap=a;bp++;q=q->next; //q进下一位

}

p=head;

output(p,pos); //显示

cout

delete head;

head=p;

}

}

int main()

{

cout<

参考:

1. http://blog.csdn.net/Hackbuteer1?viewmode=contents

2. http://www.cppblog.com/dotaqop/articles/148190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值