1024 科学计数法

1024 科学计数法 (20 分)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式:
对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例 1:
+1.23400E-03
输出样例 1:
0.00123400
输入样例 2:
-1.2E+10
输出样例 2:
-12000000000
要是自己慢慢想的话,估计做不出来,再参考别人的之后,感觉还是相对简单点,不想狼人杀那样丝毫没有头绪,这题关键还是思路,其次我觉得是函数的掌握,不会函数也行,但是会相关的函数更方便,我做了2个版本,思路都差不多,区别就在于函数。主要的函数是stoi,substr,我一开始用的是codeblocks,可能版本太低了,stoi用不了,然后我用的dev-c++,里面设置一下就可以用stoi了
stoi 里面变量是string类型,返回10进制整数,也可以添加参数,具体百度,这题只要直接转,
substr,string变量,返回string类型,比如s.substr(1,5)就是从s下标为1开始截取,之后一共5个字符,如果直接s.substr(1),就是从下标为1截取到最后,还有很多其他具体的用法,具体百度。
思路:
1.首先要把底数弄出来,再把指数弄出来,再这里就可以用函数,或者麻烦一点的方法
2.具体分析指数,大方向是±,-的情况一定会打出0.,然后就是判断底数小数点之后的位数和指数的大小,因为只有判断这个,你才能知道小数点在哪里,
3.特殊情况我没有考虑,想0.000,00340,但是这样的数结果是对的,也没有多想;
麻烦点的方法

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
int main() {
	string s,di;
	cin>>s;
	if(s[0]=='-') cout<<'-';
	int eindex=0,zhi=0;
	while(s[eindex]!='E') eindex++;
	di=s.substr(1,eindex-1);
	int len=di.length();
	for(int i=eindex+2;i<s.length();i++)
        zhi=zhi*10+s[i]-'0';
        if(s[eindex+1]=='-') zhi*=-1;
    if(zhi<0){
        cout<<"0.";
        for(int i=1;i<=abs(zhi)-1;i++)
            cout<<'0';
        for(int i=0;i<di.length();i++)
            if(di[i]!='.')
            cout<<di[i];
    }
    else{
        if(zhi>=di.length()-2){
            for(int i=0;i<len;i++)
                if(di[i]!='.')
                cout<<di[i];
            for(int i=1;i<=zhi-len+2;i++) cout<<'0';
        }
        else{
                cout<<di[0];
                  int bk=1,j;
                for(j=2;bk<=zhi;j++,bk++)
                    cout<<di[j];
                cout<<'.';
                for(;j<len;j++)
                    cout<<di[j];
        }

    }

	return 0;
}

函数的方法

#include <iostream>
#include <string>
using namespace std;
int main(){
	string s,di;
	cin>>s;
	int i=0,zhi,len;
	if(s[0]=='-') cout<<'-';
	while(s[i]!='E') i++;
	di=s.substr(1,i-1);
	zhi=stoi(s.substr(i+1));
	len=di.length();
	if(zhi<0){
		cout<<"0.";
		for(int j=0;j<abs(zhi)-1;j++)
		           cout<<'0';
		for(int j=0;j<len;j++)
		       if(di[j]!='.') cout<<di[j];           
	}
	else{
		if(zhi>=len-2){
			for(int j=0;j<len;j++)
			 if(di[j]!='.') cout<<di[j];
			for(int j=0;j<zhi-(len-2);j++) 
			 cout<<'0';
		}
		else{
			cout<<di[0];
			int j,bk=1;
			for(j=2;bk<=zhi;bk++,j++)
			   cout<<di[j];
			   cout<<'.';
			for(;j<len;j++)
			 cout<<di[j];   
				
				
		}	
	}
	return 0;

} 

总结:函数在某些题目还是很方便的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值