【大数处理、正则表达式】NYOJ-513
【正则】
正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。
模式描述在搜索文本时要匹配的一个或多个字符串。
常用字符:
1 //正则表达式 2 //$ 匹配输入字符串结尾的位置 3 //* 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,} 4 //+ 一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。 5 //? 零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。 6 //[xyz] 字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。
【例题】
A+B Problem IV
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
- 输入
- 包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400) - 输出
- 每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。
- 样例输入
-
1.9 0.1 0.1 0.9 1.23 2.1 3 4.0
- 样例输出
-
2 1 3.33 7
- 【代码】
- Java:
1 import java.math.BigDecimal; 2 import java.util.Scanner; 3 4 public class Bignumber { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 while (cin.hasNext()) { 8 BigDecimal a = cin.nextBigDecimal();//移除组分隔符 9 BigDecimal b = cin.nextBigDecimal(); 10 BigDecimal c = a.add(b); 11 System.out.println(sw(c.toString())); 12 } 13 } 14 static String sw(String s) { 15 if (s.indexOf(".") > 0) { 16 System.out.println("*-*-"); 17 s = s.replaceAll("0+?$", ""); 18 s = s.replaceAll("[.]$", ""); 19 } 20 return s; 21 } 22 }
C++:
1 #include <stdio.h> 2 #include <string.h> 3 #define MAX 1000 4 char a[MAX],b[MAX],c[MAX]; 5 int main() 6 { 7 int i,j,k,l,m,n,la,lb,mx; 8 char ch; 9 memset(a,'0',sizeof(a)); 10 memset(b,'0',sizeof(b)); 11 while(~scanf("%s%s",a,b)) 12 { 13 la=strlen(a); 14 lb=strlen(b); 15 a[la]='0'; 16 b[lb]='0'; 17 i=0; 18 while((a[i]-'.')&&i<la) 19 { 20 i++; 21 } 22 if(i==la) 23 a[la]='.'; 24 j=0; 25 while((b[j]-'.')&&j<lb) 26 { 27 j++; 28 } 29 if(j==lb) 30 b[lb]='.'; 31 m=(la-i)>(lb-j)?(la-i):(lb-j); 32 if(i>=j) 33 { 34 for(l=mx=i+m,k=0,j=i-j;l>=0;l--) 35 { 36 if(a[l]=='.') 37 { 38 c[l]='.'; 39 continue; 40 } 41 ch=(l-j)<0?'0':b[l-j]; 42 c[l]=(a[l]-'0'+ch-'0'+k)%10+'0'; 43 k=(a[l]-'0'+ch-'0'+k)/10; 44 } 45 } 46 else 47 { 48 for(l=mx=j+m,k=0,j=j-i;l>=0;l--) 49 { 50 if(b[l]=='.') 51 { 52 c[l]='.'; 53 continue; 54 } 55 ch=(l-j)<0?'0':a[l-j]; 56 c[l]=(ch-'0'+b[l]-'0'+k)%10+'0'; 57 k=(ch-'0'+b[l]-'0'+k)/10; 58 } 59 } 60 if(k>0) 61 printf("%d",k); 62 while(c[mx]=='0') 63 mx--; 64 if(c[mx]=='.') 65 mx--; 66 for(i=0;i<=mx;i++) 67 printf("%c",c[i]); 68 printf("\n"); 69 memset(a,'0',sizeof(a)); 70 memset(b,'0',sizeof(b)); 71 } 72 } 73 //待研究、待看懂
梦想要一步步来!