标签(空格分隔): 九度OJ
原题地址:http://ac.jobdu.com/problem.php?pid=1137
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。 每组测试数据之间有一个空行,每行数据不超过100个字符
每组案例是n行,每组测试数据有一行输出是相应的和。 输出保证一定是一个小数部分不为0的浮点数
这里说的是大浮点数的问题,还好java给我们提供了BigDecimal可以直接使用。使用方法答题和BigInteger类很像。记得要使用stripTrailingZeros函数删除浮点小数末尾的0.
以下代码通过了4个案例中的3个,不知道其中的另外一个案例为什么没有A掉,希望读到这篇文章的读者能告诉我。
import java.util.*; import java.math.*; public class Main{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); while (n-- != 0) { BigDecimal a = scanner.nextBigDecimal(); BigDecimal b = scanner.nextBigDecimal(); System.out.println(a.add(b).stripTrailingZeros().toString()); } if (scanner.hasNext()){ String white = scanner.nextLine(); } } } }因为我没有A掉这个题,所以附上网友的答案备忘。
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; const int Max = 100; int ia[Max], ib[Max], ta[Max], tb[Max], ic[Max], tc[Max]; char in[Max], t[Max]; int main() { int cases, l1, l2, l3, l4, l; cin >> cases; while(cases--) { memset(ic, 0, sizeof(ic)); memset(tc, 0, sizeof(tc)); memset(ia, 0, sizeof(ia)); memset(ta, 0, sizeof(ta)); memset(ib, 0, sizeof(ib)); memset(tb, 0, sizeof(tb)); scanf("%s", in); l = strlen(in); int i; for(i=0; i<l && in[i] != '.'; i++) ia[i] = in[i] - '0'; l1 = i++; for(int j=0; j<l1/2; j++) { int tem = ia[l1 - 1 - j]; ia[l1 - 1 - j] = ia[j]; ia[j] = tem; } for(; i<l; i++) ta[i-l1-1] = in[i] - '0'; l2 = l - l1 - 1; scanf("%s", in); l = strlen(in); for(i=0; i<l && in[i] != '.'; i++) ib[i] = in[i] - '0'; l3 = i++; for(int j=0; j<l3/2; j++) { int tem = ib[l3 - 1 - j]; ib[l3 - 1 - j] = ib[j]; ib[j] = tem; } for(; i<l; i++) tb[i-l3-1] = in[i] - '0'; l4 = l - l3 - 1; l2 = max(l2, l4); int c = 0, temp; for(int i=l2-1; i>=0; i--) { temp = ta[i] + tb[i] + c; tc[i] = temp % 10; c = temp / 10; } int f; for(f=l2-1; f>=0; f--) if(tc[f]) break; l1 = max(l1, l3); for(int j=0; j<=l1; j++) { temp = ia[j] + ib[j] + c; ic[j] = temp % 10; c = temp / 10; } int k; for(k=l1; k>=0; k--) if(ic[k]) break; if(k == -1) l1 = 0; else l1 = k; for(int j=l1; j>=0; j--) printf("%d", ic[j]); if(f != -1) { printf("."); for(int j=0; j<=f; j++) printf("%d", tc[j]); } printf("\n"); } system("pause"); return 0; }JAVA BigDecimal 小数点处理
保留两位小数{ 方法一:{ double c=3.154215; Java.text.DecimalFormat myformat=new java.text.DecimalFormat("0.00"); String str = myformat.format(c); } 方式二:{ java.text.DecimalFormat df =new java.text.DecimalFormat("#.00"); df.format(你要格式化的数字); 例:new java.text.DecimalFormat("#.00").format(3.1415926) #.00 表示两位小数 #.0000四位小数 以此类推... } 方式三:{ double d = 3.1415926; String result = String .format("%.2f"); %.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型 } } 四舍五入 { double f = 111231.5585; BigDecimal b = new BigDecimal(f); //保留2位小数 double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); }2017 年 3 月 8 日