11月27日 - 12月3日(H17 科学计数法,H18 逆波兰算数表达式)

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; 
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值