H17 科学计数法
题目描述
思路
这个关键是对小数点、前导零以及负号的处理
代码实现
#include <stdio.h>
#include <string.h>
#include <math.h>
int getDot(char* str){
for(int i=0;i<strlen(str);i++){
if(str[i]=='.') return i;
}
return -1;
}
void swap(char* str,int a,int b){
char temp=str[a];
str[a]=str[b];
str[b]=temp;
}
void strMove(char* str,int n){
int len=strlen(str);
if(n>0){
for(int i=len-1;i>=0;i--){
str[i+n]=str[i];
}
for(int i=0;i<n;i++){
str[i]='0';
}
}else if(n<0){
for(int i=0;i<len-1;i++){
str[i]=str[i-n];
}
}
str[len+n]=0;
}
void dotMove(char* str,int n){
str[strlen(str)]=getDot(str)==-1?'.':0;
int index=getDot(str);
if(n<0){
strMove(str,-n);
for(int i=-n+index;i>index;i--){
swap(str,i,i-1);
}
for(int i=0;i<=getDot(str)+8;i++){
if(str[i]==0) str[i]='0';
if(i==getDot(str)+8) str[i+1]=0;
}
}else{
for(int i=index;i<index+n;i++){
if(str[i+1]==0) str[i+1]='0';
swap(str,i,i+1);
}
for(int i=getDot(str);i<=getDot(str)+8;i++){
if(str[i]==0) str[i]='0';
if(i==getDot(str)+8) str[i+1]=0;
}
}
}
void deleteLeadingZore(char* str){
int len=strlen(str);
if(str[0]=='0' && str[1]!='.'){
for(int i=0;i<len;i++){
strMove(str,-1);
if(str[0]!='0') break;
if(str[1]=='.') break;
}
}
}
int main(){
int n,sign=1;
char str[200]={0,};
for(int i=0;;i++){
int letter=getchar();
if(letter!=' ') str[i]=letter;
if(letter==' ') break;
}
sign=str[0]=='-'?-1:1;
if(str[0]=='-') strMove(str,-1);
for(int i=0;i<200;i++){
char letter=getchar();
if(letter=='e' || letter=='E') break;
}
scanf("%d",&n);
dotMove(str,n);
deleteLeadingZore(str);
if(sign==-1){
strMove(str,1);
str[0]='-';
}
printf("%s\n",str);
return 0;
}
H18 逆波兰算数表达式
题目描述
思路
依次读取表达式,如果是数字就储存在数组中,用一个变量count来表示数组中数字个数,如果是运算符,则对数组中最后两个数字进行相应的运算操作,储存在数组倒数第二个位置上,count减一。等读取完表达式后,输出数组中第一个数字即为答案。
代码实现
#include <stdio.h>
#include <math.h>
#include <string.h>
long long int getNum(char* str){
long long int isNegative=str[0]=='-'?1:0,count=0;
for(int i=isNegative;i<strlen(str);i++){
count+=(str[i]-'0')*pow(10,strlen(str)-i-1);
}
return isNegative==1?-count:count;
}
int main(){
long long int nums[10000]={0,},count=0;
char str[20]={0,};
while(scanf("%s",str)==1){
if(str[0]=='t') break;
if(str[0]=='+' && strlen(str)==1) nums[count-2]=nums[count-2]+nums[count-1];
if(str[0]=='-' && strlen(str)==1) nums[count-2]=nums[count-2]-nums[count-1];
if(str[0]=='*' && strlen(str)==1) nums[count-2]=nums[count-2]*nums[count-1];
if(str[0]=='/' && strlen(str)==1) nums[count-2]=nums[count-2]/nums[count-1];
if((str[0]<='9' && str[0]>='0') || strlen(str)>1) nums[count++]=getNum(str);
if((str[0]<'0' || str[0]>'9') && strlen(str)==1) count--;
}
printf("%lld\n",nums[0]);
return 0;
}