A-B Problem 大数相等

发布时间:2020-10-21 整理:编程之家
编程之家收集整理的这篇文章主要介绍了A-B Problem 大数相等编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随编程之家小编过来看看吧!

A-B Problem

http://acm.nyist.net/JudgeOnline/problem.php?pid=524

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

输入

有多组测试数据。每组数据包括两行,分别代表A和B。
它们的位数小于100,且每个数字前中可能包含+,- 号。
每个数字前面和后面都可能有多余的0。
每组测试数据后有一空行。

输出

对于每组数据,输出一行。
如果A-B=0,输出YES,否则输出NO。

样例输入

1
1

1.0
2.0

样例输出

YES
NO

描述

A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧。

现在有两个实数A和B,聪明的你,能不能判断出A-B的值是否等于0呢?

 

我的代码

#include <stdio.h>
#include <string.h>
#define MAX 120

//处理化简字符串 变为  符号位 + 数字 + 小数点 + 小数位 如 +001. --> +1  001.00 --> +1  
void deal(char *s){
	int dot,len,i,t,k;
	//特殊情况 .000 00.00 +0.00 -0.00
 	
	//补充符号位  
	if(s[0]!='+' && s[0]!='-'){
		len = strlen(s);
		for(i=len+1;i>0;i--)
			s[i]=s[i-1];
		s[0]='+';	
	}
			 
	//处理整数位   .1 --> +0.1
	//只有小数点时补 0 
	if(s[1]=='.'){
		len = strlen(s);
		for(i=len+1;i>1;i--)
			s[i]=s[i-1];
		s[1]='0';	
	}
	//将整数位前面的无效 0 去除 
	for(k=1;s[k] && s[k]=='0' && s[k+1]!='.' && s[k+1] ;k++);	 
	t = k-1;	//左移的位数 
	for(i=k;s[i];i++)
		s[i-t]=s[i];
	s[i-t]='\0';
		 
	//处理小数
	len = strlen(s);
	//小数点的位置 
	for(dot=0;s[dot] && s[dot]!='.';dot++);
	for(i=len-1;i>dot && s[i]=='0';i--);
	s[i+1]='\0'; 
	if(s[i]=='.') s[i]='\0';
	
	
	//特殊情况 +0 -0
	len=strlen(s); 
	if(len==2 && s[1]=='0'){
		s[0]='0';
		s[1]='\0';
	}
		
}
char a[MAX],b[MAX]; 
int main(int argc,char *argv[])
{
	int state,lena,lenb;
	while( scanf("%s %s",a,b)!=EOF ){
		deal(a);
		deal(b);
//		printf("%s %s\n",b);
		if(!strcmp(a,b))
			printf("YES\n");
		else
			printf("NO\n");		
	}	
	return 0;
}

 

题目推荐

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
const int M=100;
void back(char* c,int &l)
{
    if(strchr(c,'.') == NULL)
        return ;
    for(int i=l-1;i>=1;i--)
    {
        if(c[i]!='0')
            break;
        l--;
    }
    if(c[l-1]=='.')
        l--;
    c[l]='\0';
    //puts("after back->");
    //puts(c);
}
void front(char* c,int &l,bool &f)
{
    int cnt = isdigit(c[0]) ? 0 : 1;
    if(c[0]=='-')
        f = false;
    for(int i=cnt;i<l-1;i++)
    {
        if(c[i+1]=='.' || c[i]!='0')
            break;
        cnt++;
    }
    if(cnt)
    {
        for(int i=0;i<l-cnt;i++)
            c[i] = c[i+cnt];
        c[l-cnt] = '\0';
    }
    //puts("after front->");
    //printf(f?"+ ":"- ");
    //puts(c);
}
void deal(char *c,bool &f)
{
    int l = strlen(c);
    f = true;
    back(c,l);
    front(c,l,f);
}
bool Cmp(char* A,char* B,bool a,bool b)
{
    if(strcmp(A,B) == 0)
    {
        if(strcmp(A,"0") == 0 || a^b == 0)
            return true;
    }
    return false;
}
int main()
{
    char A[M],B[M];
    bool a,b;
    while(~scanf("%s%s",A,B))
    {
        deal(A,a);
        deal(B,b);
        puts(Cmp(A,B,b)?"YES":"NO");
    }

    return 0;
}

总结

以上是编程之家为你收集整理的A-B Problem 大数相等全部内容,希望文章能够帮你解决A-B Problem 大数相等所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!