表达式计算模板(+-*/^)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int number[101],i=0,p=1;
char symbol[101],s[256],t[256];
void push(){symbol[++p]=s[i];}
int Pow(int a,int b){
    int res=1;
    while(b){
        if(b&1)res=res*a;
        a=a*a;
        b>>=1;
    }
    return res;
}
void pop(){
    switch(symbol[p--]){
        case'+':number[p]+=number[p+1];break;
        case'-':number[p]-=number[p+1];break;
        case'*':number[p]*=number[p+1];break;
        case'/':number[p]/=number[p+1];break;
        case'^':number[p]=Pow(number[p],number[p+1]);break;
    }
}
bool can(){
    if((s[i]=='+'||s[i]=='-')&&symbol[p]!='(')return 1;
    if((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/'))return 1;
    if(s[i]=='^'&&symbol[p]=='^')return 1;
    return 0;
}
int main(){
    //scanf("%s",s);
    freopen("Soda.txt","r",stdin);
    gets(s);
    s[strlen(s)]=')';symbol[p]='(';
    while(i<strlen(s)){
        while(s[i]==' ')i++;
        while(s[i]=='('){
            push();i++;
            while(s[i]==' ')i++;
        }
        int x=0;
        while(s[i]>='0'&&s[i]<='9'){
            x=x*10+s[i]-'0';
            i++;
            while(s[i]==' ')i++;
        }
        number[p]=x;
        int j=0;
        do{
            if(s[i]==')'){
                while(symbol[p]!='(')pop();
                number[--p]=number[p+1];
            }
            else{
                while(can())pop();
                push();
            }
            j=0;
            i++;j++;
            while(s[i]==' ')i++,j++;
        }while(i<strlen(s)&&s[i-j]==')');
    }
    printf("%d",number[0]);
    return 0;
}

 

/*
    by林永迪
    读入一个字符串,里面有+-*/()
*/
#include <cstdio>
#include <cstring>
const int strsize = 1024;

int n, ops, nms;
char str[strsize], opt[strsize];
int num[strsize];
void pop() {
    char op = opt[--ops];
    int x = num[--nms], y = num[--nms], z;
    switch (op) {
        case '+': z = y + x; break;
        case '-': z = y - x; break;
        case '*': z = y * x; break;
        case '/': z = y / x; break;
    }
    num[nms++] = z;
}

int main() {
    int n;
    for (scanf("%d", &n); n; n--) {
        scanf("%s", str);
        int len = strlen(str);
        ops = nms = 0;
        int x = 0;
        for (int i = 0; i < len; i++)
            if (str[i] >= '0' && str[i] <= '9')
                x = x * 10 + str[i] - '0';
            else {
                if (x > 0) num[nms++] = x, x = 0;
                if (str[i] == ')') {
                    while (opt[ops - 1] != '(') pop();
                    --ops;
                    continue;
                }
                if (str[i] == '+' || str[i] == '-')
                    while (ops > 0 && opt[ops - 1] != '(') pop();
                else if (str[i] == '*' || str[i] == '/')
                    while (ops > 0 && opt[ops - 1] != '(' && (opt[ops - 1] == '*' || opt[ops - 1] == '/')) pop();
                opt[ops++] = str[i];
            }
        if (x > 0) num[nms++] = x, x = 0;
        while (ops > 0) pop();
        printf("%d\n", num[0]);
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/thmyl/p/7667642.html

### 回答1: 这里是AI语言模型,以下是对题目的回答: 编程模板如下: n = int(input("请输入一个自然数:")) sum = if n % 2 == : for i in range(2, n+1, 2): sum += 1/i else: for i in range(1, n+1, 2): sum += 1/i print("表达式的值为:{:.2f}".format(sum)) 如果输入的n为奇数,则计算表达式1+1/3+.....+1/n的值,如果n为偶数,则计算表达式1/2+1/4+....+1/n的值。最后输出表达式的结果,保留2位小数。 例如,输入n为5,则计算表达式1+1/3+1/5的值,输出结果为1.47;如果输入n为6,则计算表达式1/2+1/4+1/6的值,输出结果为.83。 ### 回答2: 这道题目要求根据输入的自然数n输出特定的数列,分为n为奇数和n为偶数两种情况。 在解答这道题的时候,我们可以采用循环语句来实现数列的计算和输出。具体实现流程如下: 1. 首先,定义一个变量sum来记录数列的和。 2. 判断n的奇偶性,如果n为奇数,则采用步长为2的循环来计算数列,依次累加每一项的值。 3. 如果n为偶数,则采用步长为2的循环来计算数列,但需要注意每一项的分母是2的整数倍,因此需要在循环中进行条件判断。 4. 计算完整个数列后,将其结果保留2位小数输出。 下面是本题的代码实现: #include <stdio.h> int main() { int i, n; float sum = 0.0; printf("请输入一个自然数n:\n"); scanf("%d", &n); if(n % 2 == 0) // n为偶数 { for(i = 2; i <= n; i += 2) { if(i % 2 == 0) // 分母为2的整数倍 sum += 1.0 / i; } } else // n为奇数 { for(i = 1; i <= n; i += 2) { sum += 1.0 / i; } } printf("数列的和为:%.2f\n", sum); return 0; } 需要注意的是,本题要求结果保留2位小数,因此我们在输出结果的时候需要采用%.2f的格式化输出方式。 以上就是本题的详细解答。通过使用循环语句,我们可以快速高效地实现数列计算和输出,为学习编程打下坚实的基础。 ### 回答3: 这道题目可以用循环结构来完成。首先,我们需要询问用户输入一个自然数n: ``` n = int(input("请输入一个自然数n:")) ``` 接着,我们需要判断n的奇偶性。如果是奇数,我们需要累加1/3至1/n,如果是偶数,我们需要累加1/2至1/n。用一个for循环可以实现: ``` sum = 0 if n % 2 == 0: # n为偶数 for i in range(2, n+1, 2): sum += 1/i else: # n为奇数 for i in range(1, n+1, 2): sum += 1/i ``` 这里,我们用到了range函数,range(start, stop, step)可以生成一个等差数列,从start开始,到stop结束,步长为step。例如,range(1, 10, 2)可以生成1、3、5、7、9这5个数。 接下来,我们需要将表达式的结果输出,并保留2位小数。可以使用format函数来实现: ``` print("表达式结果为:{:.2f}".format(sum)) ``` 其中,{:.2f}表示输出一个浮点数,保留两位小数。 为了防止出现除0异常,我们需要判断n是否为0: ``` if n == 0: print("无法计算") else: # 上述代码 ``` 最终代码如下: ``` n = int(input("请输入一个自然数n:")) if n == 0: print("无法计算") else: sum = 0 if n % 2 == 0: # n为偶数 for i in range(2, n+1, 2): sum += 1/i else: # n为奇数 for i in range(1, n+1, 2): sum += 1/i print("表达式结果为:{:.2f}".format(sum)) ``` 运行程序,输入不同的自然数,即可得到相应的表达式结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值