PAT(甲级)1060

来源:互联网 发布:葫芦娃 知乎 编辑:程序博客网 时间:2024/05/29 04:04

1060. Are They Equal (25)

时间限制
50 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered equal since they are both saved as 0.123*105 with simple chopping. Now given the number of significant digits on a machine and two float numbers, you are supposed to tell if they are treated equal in that machine.

Input Specification:

Each input file contains one test case which gives three numbers N, A and B, where N (<100) is the number of significant digits, and A and B are the two float numbers to be compared. Each float number is non-negative, no greater than 10100, and that its total digit number is less than 100.

Output Specification:

For each test case, print in a line "YES" if the two numbers are treated equal, and then the number in the standard form "0.d1...dN*10^k" (d1>0 unless the number is 0); or "NO" if they are not treated equal, and then the two numbers in their standard form. All the terms must be separated by a space, with no extra space at the end of a line.

Note: Simple chopping is assumed without rounding.

Sample Input 1:
3 12300 12358.9
Sample Output 1:
YES 0.123*10^5
Sample Input 2:
3 120 128
Sample Output 2:
NO 0.120*10^3 0.128*10^3

<pre name="code" class="cpp">#include <iostream>#include <cstring>#include <stack>using namespace std;/////////////////////////////////////////////////////////////////////////// THIS METHOD IS TOO COMPLEX,PLEASE TRY ANOTHER NEST JUST RECORDING//N BITS FROM ORIGINAL STRING.EG 12315646.15648641.. STRAT RECORDING// FROM FIRST NON-ZERO BIT, THEN COUNTING n BITS, IF IT CAME TO NULL// ADDING ZEROS INSTEAD UNTIL THE NUMBERS OF BITS IS N////every data should be as the form 0.d1d1...*10^k including 0.0000..*10^0//0.123455..dn should be 0.123455dn*10^0void itoa(int n,char str[],int base){stack<char> s;if(n==0){str[0] = '0';str[1] = '\0';return;}//cout <<n <<endl;while(n){s.push('0'+n%base);n /=base;}int i =0,size = s.size();for(i = 0;i<size;i++){str[i] = s.top();s.pop();}str[i] = '\0';}char * transfer(char *str,int n){char *res = new char[250];res[0] = '0';res[1] = '.';    char *pstart,*pdot,*p;        p = str;    pstart = pdot = NULL;    bool found1 =false;    while(*p != '\0'){    if(*p > '0' && *p <='9' && !found1){    pstart =p;    found1 =true;}else if(*p == '.')    pdot = p;p++;}int count;if(pstart == NULL){  //zerosp =res+2;for(int i = 0;i<n;i++){*p = '0';p++;}*p = '\0';strcat(res,"*10^0");return res;}else if(pstart != NULL && pdot == NULL){   //no fraction partcount = p -pstart;if(n <=count){memcpy(res+2,pstart,sizeof(char)*n);p = res+2+n;}else{memcpy(res+2,pstart,sizeof(char)*count);p = res+2+count;for(int i=0;i<n-count;i++){  //pading zeros*p ='0';p++;}}*p = '\0';strcat(res,"*10^");//cout <<count <<endl;        char exp[250];itoa(count,exp,10);strcat(res,exp);   return res;}else {                        if(pdot < pstart) { //only fraction part    count = pstart - pdot -1;int count1 = p - pstart;if(count1 >=n){memcpy(res+2,pstart,sizeof(char)*n);p =res+2+n;}                 else{    memcpy(res+2,pstart,sizeof(char)*count1);    p = res+2+count1;    for(int i = 0;i<n-count1;i++){         //pading zeros to n width    *p = '0';    p++;}}    *p ='\0';                    //    cout <<count <<endl;    char exp[250];    itoa(count,exp,10);    strcat(res,"*10^-");    strcat(res,exp);    return res;}else{              //integer part adding fraction partint count = pdot -pstart;  //exponentint count1 = p-pstart-1;   //valid bitsif(count <= n)      memcpy(res+2,pstart,sizeof(char)*count);else{    memcpy(res+2,pstart,sizeof(char)*n);    p = res+2+n;    goto LABEL1;}if(count1 >=n){  memcpy(res+2+count,pdot+1,sizeof(char)*(n-count));p =res+2+n;}                 else{    memcpy(res+2+count,pdot+1,sizeof(char)*(count1-count));    p = res+2+count1;    for(int i=0;i<n-count1;i++){    *p ='0';    p++;}}LABEL1:               *p ='\0';    strcat(res,"*10^");//    cout <<count <<endl;    char exp[250];    itoa(count,exp,10);    strcat(res,exp);       return res;}}}int main(){char str1[250];char str2[250];int num;cin >>num >>str1 >>str2;    char *p1,*p2;    p1 = transfer(str1,num);    p2 = transfer(str2,num);    if(strcmp(p1,p2) == 0)        cout <<"YES " <<p1 <<endl;    else        cout <<"NO " <<p1 <<' ' <<p2 <<endl;        return 0;}


                                             
0 0
原创粉丝点击