PAT 1060. Are They Equal

0.abc...(a!=0)型科学计数法表示

此题因为数据超长需用字符串进行处理,有一些细节需要注意

1. 整数部分之前和小数部分之后可能都有多余的0

2.真值为0的数的指数都计作0

3.类似0.0008之类整数为0且小数部分有前导0的数要转化为0.8来考虑并相应修改指数

4.转化后的数可能后面要补0




#include<iostream>  
#include<stdio.h>  
#include<string.h>  

using namespace std;  
char a[105],b[105];  

int a1,b1;

void change(char ch[],int num,int& x)
{
    int i,flag,ls,lp,le;
	
	for( i=0,flag=0;ch[i]!='\0';i++)	
		if(ch[i]!='0'&&ch[i]!='.')
		{
			flag=1;
			break;
		}
		
		if(flag==0)           //全零
		{
			for(i=0;i<num;i++)
				ch[i]='0';
            ch[i]='\0';
			x=0;
			
		}
		else
		{
			for(i=0;ch[i]!='\0';i++)
				if(ch[i]>='1'&&ch[i]<='9')
				{
					ls=i;  
					break;
				}
				
				lp=-1;            
				for (i=0;ch[i]!='\0';i++)
					if(ch[i]=='.')
					{
						lp=i;
						break;
					}
					
					
					for (i=0;ch[i]!='\0';i++)
						;
					
					for(;i>=0;i--)
						if(ch[i]>='1'&&ch[i]<='9')
						{
							le=i;  
							break;
						}
						
						
						if(lp==-1)       //没有小数点
						{
							
							if(ls==0)
							{
								int k;
								for(k=ls;ch[k]>='0'&&ch[k]<='9';k++)   
									;
								x=k;
							}
							else
							{
								x=le-ls+1;
							}	
							
							for(i=ls;i<=le;i++)
								ch[i-ls]=ch[i];
							
							int y=le-ls;
							if(y<num)
							{
								while(y<num-1)
								{
									ch[i-ls]='0';
									i++;
									y++;
								}
								ch[i-ls]='\0';
							}	
							else
							{
								
								ch[num]='\0';
							}
                            
						}
						else
						{
							if(ls<lp&&lp<le)       //几零点零几
							{
								
								for(i=ls;i<lp;i++)
									ch[i-ls]=ch[i];
								i++;
								for(;i<=le;i++)
									ch[i-ls-1]=ch[i];
								
								x=lp-ls;
								
								int y=le-ls;
								
								if(y<num)
								{
									while(y<num)
									{
										ch[i-ls-1]='0';
										i++;
										y++;
									}
									ch[i-ls-1]='\0';
								}	
								else
								{
									
									ch[num]='\0';
								}
								
								
								
							}
                            if(lp!=-1&&lp<ls&&ls<=le) //零点零几
							{
								
								for(i=ls;i<=le;i++)
									ch[i-ls]=ch[i];
								
								x=lp-ls+1;
								
								
								int y=le-ls+1;
								
                            	
								
								if(y<=num)
								{
									while(y<num)
									{
										ch[i-ls]='0';
										i++;
										y++;
									}
									ch[i-ls]='\0';
								}	
								else
								{
									ch[num]='\0';
								}
								
								
							}
                            if(ls<=le&&le<lp)     
							{
								
								for(i=ls;i<=le;i++)
									ch[i-ls]=ch[i];
								
								x=lp-ls; 
								
								
								int y=le-ls+1;
								
								if(y<=num)
								{
									while(y<num)
									{
										ch[i-ls]='0';
										i++;
										y++;
									}
									ch[i-ls]='\0';
								}	
								else
								{
									ch[num]='\0';
								}
								
									
								
							}
								
							
						}
		}
		
			
		
}



void com(char ch1[],char ch2[],int num)
{
    change(ch1,num,a1);
    change(ch2,num,b1);
	
	
    int same=1;
    for(int t=0;ch1[t]!='\0'&&ch2[t]!='\0';t++)
        if(ch1[t]!=ch2[t])   
		{
			same=0;
			break;
		}
		
		
		if(same&&a1==b1) 
		{
			
			printf("YES 0.%s*10^%d\n",ch1,a1);
			
		}
		else 
		{
			printf("NO 0.%s*10^%d 0.%s*10^%d\n",ch1,a1,ch2,b1);
		}
}

int main()
{
    int n;
	scanf("%d%s%s",&n,a,b);
	com(a,b,n);
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值