标签:
NO
题目大意:给你两个数A和B,推断A和B是否相等,若相等输出"YES"。
否则输出"NO"。
思路:题目没有给出A、B的数据规模,这里就是个大数题。把A、B用
字符数组存起来。标记A、B的正负号,若为正,则标记为1,若为负。
则标记为0。将字符数组内的‘-‘赋值为‘0‘,然后将整数前的零和小数部分
后边的零清除,然后用数组将整数部分和小数部分分别存起来。之后分别
比較A、B的整数部分和小数部分是否相等。注意A、B可能为整数或是小
数,尤其注意A、B可能会在整数部分前边有N个零或者小数部分后边有N
个零,比方00012、123.123000、0.00、012.200等等。详细解题过程
看以下代码。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char A[20020],B[20020]; char a[20020],aa[20020],b[20020],bb[20020]; int main() { int flagA,flagB,lenA,lenB,markA,markB; while(~scanf("%s%s",A,B)) { memset(a,0,sizeof(a));//存A的整数部分 memset(b,0,sizeof(b));//存B的整数部分 memset(aa,0,sizeof(aa));//存A的小数部分 memset(bb,0,sizeof(bb));//存B的小数部分 flagA = flagB = 1;//标记正负数,1为整数,0为负数 markA = markB = 0;//标记小数点,1为有小数点,0为没有小数点 if(A[0] == '-')//标记并清除A、B的正负号 { flagA = 0; A[0] = '0'; } if(B[0] == '-') { flagB = 0; B[0] = '0'; } lenA = strlen(A); lenB = strlen(B); int numa = 0,i; for(i = 0; i < lenA; i++)//清除A的整数部分前面的零 if(A[i]!='0') break; if(i==lenA || A[i]=='.')//若整数部分全为0,则数组a为"0" a[0] = '0'; for(; i < lenA; i++)//用数组a记录A的整数部分 { if(A[i]!='.') a[numa++] = A[i]; else { markA = 1; break; } } int j,numaa = 0; for(j = lenA-1;j > i; j--)//清除A小数部分后边的零 if(A[j]!='0') break; if(j == i)//若小数部分全为0,则数组aa为"0" aa[0] = '0'; for(;j > i; j--)//用数组aa记录A的小数部分 { aa[numaa++] = A[j]; } //B和A的处理一样 int k,l; for(k = 0; k < lenB; k++) if(B[k]!='0') break; if(k == lenB || B[k]=='.') b[0] ='0'; int numb = 0; for(; k < lenB; k++) { if(B[k]!='.') b[numb++] = B[k]; else { markB = 1; break; } } int numbb = 0; for(l = lenB-1;l > k; l--) if(B[l]!='0') break; if(l==k) bb[0]='0'; for(;l > k; l--) { bb[numbb++] = B[l]; } if(markA == 0) aa[0] = '0'; if(markB == 0) bb[0] = '0'; if(flagA==flagB && strcmp(a,b)==0 && strcmp(aa,bb)==0)//推断A、B是否相等 printf("YES\n"); else printf("NO\n"); memset(A,0,sizeof(A)); memset(B,0,sizeof(B)); } return 0; }
版权声明:本文博主原创文章,博客,未经同意不得转载。
HDU2054_A == B ?【模拟题】【大数】【水的问题】
标签:
原文地址:http://www.cnblogs.com/hrhguanli/p/4837182.html