问题描述:
字符串处理:从string.in文件里读入两个字符串,字符串除了数字还可能包括 ‘—’、‘E’、‘e’、’.’,相加之后输出到文件string.out中,如果是浮点型,要求用科学计数法表示(最多包含10个有效数字)。
Sample Input:
34.56
2.45e2
Sample Output:
2.7956e2
测试结果:
第一个为处理前直接按是“%.9e”格式输出的
第二个为按题目要求处理后的字符串
AC代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 100
int isdouble(char s[])//判断是否为浮点数
{
int n=strlen(s);
for(int i=0;i<n;i++)
{
if(s[i]=='e'||s[i]=='E'||s[i]=='.')return 1;
}
return 0;
}
int main()
{
freopen("input.txt","r",stdin);
char s1[maxn];
char s2[maxn];
char tail[maxn];
char index[4];
int num;
int n=10;//要求最多保留10位有效数字,加上'.'号,所以尾数部分最后一位为10
scanf("%s %s",s1,s2);
if(isdouble(s1)||isdouble(s2))
{
double x=atof(s1);
double y=atof(s2);
x+=y;//
sprintf(tail,"%.9e",x);
printf("%s\n",tail);
char mark=tail[12];//记录符号
index[0]=tail[13];
index[1]=tail[14];
index[2]=tail[15];
index[3]='\0';//
num=atoi(index);
while(tail[n]=='0')
{
n--;
}
for(int i=0;i<=n;i++)
{
printf("%c",tail[i]);
}
printf("e");
if(mark=='-')printf("-");//如果是负数就打印符号
printf("%d",num);
}
else
{
int m=atoi(s1);
int n=atoi(s2);
printf("%d",m+n);
}
}
2月24日代码
/*
strchr 函数的使用
指数的确定
以及如何不输出末尾的0
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 100
char s1[maxn],s2[maxn],tail[maxn];
int main()
{
freopen("input.txt","r",stdin);
scanf("%s%s",s1,s2);
int x,y;
double a,b;
if(strchr(s1,'.')==NULL&&strchr(s2,'.')==NULL)
{
x=atoi(s1);
y=atoi(s2);
printf("%d",x+y);
}
else
{
a=atof(s1);
b=atof(s2);
double sum=a+b;
int cnt=0;
if(sum>1)
{
while(sum>=1)
{
sum/=10;
cnt++;
}
sum*=10;
cnt--;
}
else
{
while(sum<1)
{
sum*=10;
cnt--;
}
}
sprintf(tail,"%.9lf",sum);
int len=(int)strlen(tail);
while(tail[len-1]=='0')len--;
for(int i=0;i<len;i++)printf("%c",tail[i]);
printf("e%d",cnt);
}
}
**
五月二日更新
**
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#define maxn 100
#define INF 1e9
using namespace std;
string change(string s,int &e,bool &flag)//flag判断是否为整型 也就是小数点后全为0
{
while(s[0]=='0')s.erase(s.begin());
if(s[0]=='.')//如果是0.xxxx型
{
s.erase(s.begin());//得到纯数字
while(s.size()>=1&&s[0]=='0')
{
s.erase(s.begin());
e--;
}
}
else//如果是xx.xxx型
{
int i=0;
while(i<s.size()&&s[i]!='.')
{
i++;
e++;
}
for(int j=i+1;j<s.size();j++)//如果小数点后全为0 那么就是整形
{
if(s[j]!='0')flag=false;
}
s.erase(s.begin()+i);//去掉小数点
}
if(s.size()==0)e=0;// 特判0
while(*(s.end()-1)=='0')s.erase(s.end()-1);
return s;
}
int main()
{
freopen("input.txt","r",stdin);
double a,b;
char s1[100];
scanf("%lf%lf",&a,&b);
sprintf(s1,"%lf",a+b);
int e=-1;//首部保留一位所以e初始化为-1
bool flag=true;//假设为整形
string s=s1,ans=change(s1,e,flag);
if(flag)
{
printf("%d",(int)(a+b));
return 0;
}
cout<<ans[0]<<".";
for(int i=1;i<ans.size();i++)
{
cout<<ans[i];
}
printf("e%d",e);
}