LJX的高精度 |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述 |
在科学计算中,有时候需要用到超高精度的运算。输入两个不超过2^31的正数A和B,两数都带有小数点,小数点后面的数的位数都不超过10000。请你计算并输出A和B的和。 |
输入 |
两行,每行包含一个符合题目要求的数,分别为A和B。 |
输出 |
一个数,即A+B的结果。 |
输入示例 |
1.123 2.877 |
输出示例 |
4.0 |
其他说明 |
特别说明:输入和输出的数都要符合数学上的基本规则,小数点后面尾部多余的0不输出,特殊的,当小数点后全是0,则结果仅仅输出小数点后一个0即可。例如2.800应该写成2.8,3应该写成3.0。 |
虽然小数点后面的数不超过10000位,但小数点前的整数没有特别要求,所以只要把小数点后面的数设成字符串,小数点前的整数直接用int就可以了。
下面是刚学编程时写的代码,可能写得不太好,有时间重新写一个:
#include<iostream> #include<cstdio> using namespace std; int a,b,s; char ch,A[10000],B[10000],S[10000]; int main() { cin>>a>>ch>>A; cin>>b>>ch>>B; s=a+b; int lenA=strlen(A),lenB=strlen(B),lenS; if(lenA>lenB) { for(int i=lenB;i<lenA;i++) B[i]=‘0‘; } else if(lenB>lenA) { for(int i=lenA;i<lenB;i++) A[i]=‘0‘; } lenA=strlen(A);lenB=strlen(B); lenS=lenA; int i,j; bool temp=0; i=lenA;j=lenA; while(i>=1 || j>=1) { i--;j--;lenS--; S[lenS]+=A[i]+B[j]-48; if(S[lenS]<48) S[lenS]+=48; if(S[lenS]>57) { S[lenS-1]+=1; S[lenS]-=10; if(lenS==0) temp=1; } } lenS=strlen(S); if(temp==1) s++; cout<<s<<‘.‘; int x=lenS-1; while(S[x]==‘0‘) x--; x++; if(S[x+1]==‘0‘) x++; for(int i=0;i<x;i++) cout<<S[i]; }
时间: 2024-11-26 02:42:27