给你100块钱
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
小光见到昨晚旭能神没拿到一血,又损失了一百块,很同情他。但是为了不表现出自己在同情他,于是对他说:“我最近碰到了难题,一直没有AC,如果你能第一个帮我AC掉,我就给你100块钱。题目就是:给定一个实数,输出它的相反数。”
Output:
对于每组数据,输出它的相反数,占一行。
Sample Input:
0
-0.1
00.10
Sample Output:
0
0.1
-0.1
解题思路:处理字符串,各种情况要面面俱到。很容易想到,用另外的数组a来保存相反数,每一次输入都将a数组元素全部赋为'\0',这有利于直接输出最后的新字符串。先判断第一个字符是否为'-',是的话先用flag标记true,然后去掉前导0,之后要判断i==len?表示全部为0(包含'-'、'+'、'.',但其实表示的是0)接下来判断是否有小数点,有点话就去掉尾部的0。剩下的分4种情况:
一、当s[i]!='.'时,如果flag为false,则a[k++]='-'先标记负号;①如果s[j]!='.',直接从i~j拷贝给a数组;②否则,先--j,去掉多余的'.',对剩下的整数部分进行拷贝;
二、当s[i]=='.'时,同样如果flag为false,则a[k++]='-'先标记为负号;③如果s[j]!='.',先把0给整数部分,接下来直接拷贝i~j即可;④否则说明此时相当于0,直接a[k]='0'即可。
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 bool ispoint(char ch[],int len){ //用来判断是否有小数点,这样才可以去掉尾部多余的0
4 for(int i=0;i<len;++i)
5 if(ch[i]=='.')return true;
6 return false;
7 }
8 int main()
9 {
10 char s[110],a[110];
11 int i,j,k,len;
12 bool flag;
13 while(cin>>s){
14 memset(a,'\0',sizeof(a));
15 k=i=0;len=strlen(s);flag=false;
16 if(s[i]=='-'){flag=true;++i;}
17 while(s[i]=='0')++i;
18 if(i==len){ //判断是否都为0的情况
19 cout<<"0"<<endl; //是的话直接输出0
20 continue; //继续输入
21 }
22 j=len-1;
23 if(ispoint(s,len)){ //有小数点的话才去掉后导0
24 while(s[j]=='0')--j;
25 }
26 if(s[i]!='.'){
27 if(!flag)a[k++]='-';
28 if(s[j]!='.'){
29 while(i<=j)a[k++]=s[i++];
30 }
31 else{
32 --j;
33 while(i<=j)a[k++]=s[i++];
34 }
35 }
36 else{ //表示当前为'.'
37 if(s[j]!='.'){
38 if(!flag)a[k++]='-';
39 a[k++]='0';
40 while(i<=j)a[k++]=s[i++];
41 }
42 else a[k]='0'; //直接赋值为'0'
43 }
44 cout<<a<<endl;
45 }
46 return 0;
47 }
测试数据:输入:.1 00 -.2 10 -0.0 0.0
对应的输出:-0.1 0 0.2 -10 0 0