题目:
2054题这道题看起来很简单 甚至不用想就会编出以下代码:
#include<stdio.h>
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
if(a==b)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
果断wrong 哈哈哈~~~!!!
答案肯定不是那么简单的,原因就是高精度问题,如果是超长的数列呢???int、long long、double都放不下呢?所以这道题要用高精度的思想来做→→→开数组
开数组一定要考虑下面的问题:
①5.00000 与 5 一个有小数点一个没有
②5.00 与 5000 字符串的长度都一样 但是2个数不一样
方法也有2个:
①去0去小数点
②装入新数组
#include<stdio.h>
#include<string.h>
char a[100000],b[100000];
void change(char s[])
{
int len,i;
len=strlen(s);
if(strstr(s,"."))
{
for(i=len-1;s[i]=='0';i--)
{
s[i]='\0';
len--;
}
}
if(s[len-1]=='.')
s[len-1]='\0';
}
int main()
{
while(~scanf("%s%s",&a,&b))
{
change(a);
change(b);
if(strcmp(a,b)==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
AND——————————————————————————————————————
#include<stdio.h>
#include<string.h>
char a[100000],b[100000],c[100000],d[100000];
int i,k,len1,len2;
int main()
{
while(~scanf("%s%s",&a,&b))
{
len1=strlen(a);
len2=strlen(b);
k=len1;
for(i=len1-1;a[i]=='0';i--);
if(strstr(a,".")==0)
{
i=len1-1;
}
for(k=0;k<=i;k++)
c[k]=a[k];
if(c[k-1]=='.')
c[k-1]='\0';
else
c[k]='\0';
k=len2;
for(i=len2-1;b[i]=='0';i--);
if(strstr(b,".")==0)
{
i=len2-1;
}
for(k=0;k<=i;k++)
d[k]=b[k];
if(d[k-1]=='.')
d[k-1]='\0';
else
d[k]='\0';
if(strcmp(c,d)==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
然后就是一个新学的知识:
strstr(str,"n");
if(strstr(a,".")==0)
判断a数组中是否有"."(小数点)
char *strstr(const char *str1, const char *str2);
include<string.h>
找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。返回该位置的指针,如找不到,返回空指针。
网友评论