函数解决混合运算问题

今天看到了个实验室面试题
分享给大家看一下
要求用C语言实现(1+1!)/2+(2+2!)/3+(3+3!)/4…(n+n!)/(n+1),要求保留2位小数;
其实要解决的困难就是阶乘在程序中怎么去算,还有就是需要考虑数据类型,因为除法的结果是会产生数据类型的更改,所以在定义变量的时候注意,不要全部定义成为整型。
这时候难点不在于怎么把这个表达式写出来,真正的难点在于怎么把数据正确赋值给主函数
很多人写函数上手int +类型,但是在这写无论你逻辑再正确都调试不对,因为你函数返回给主函数的值是double类型的,所以会使数据不准确。因此要定义成double类型的。
其次就是阶乘的写法了
阶乘要用循环来完成,其次要保留每一次累乘的值,因此只能用一个变量接收并且加上之前的值。
下面是源代码

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<Windows.h>

double Sum(int x)
{
	double answer = 0;
	int i;
	int sum = 1;
	for (i = 1; i < x+1; i++)
	{
		sum = sum * i;
		answer =(double)(i + sum) / (i + 1)+answer;
	}
	return answer;
}

int main()
{

	int num;
	double fact;
	printf("请输入一个数");
	scanf("%d", &num);
	fact = Sum(num);
	printf("%.2lf", fact);
	system("pause");
	return 0;
}

写的不容易,点个赞呗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来为您解答。 首先,算符优先法是一种能够解决算术表达式求值的算法,它利用运算符之间的优先关系来减少计算的复杂度。使用算符优先法求解算术表达式,需要使用两个栈来保存操作数和操作符,并按照优先关系确定运算的先后顺序。具体实现过程如下: 1. 初始化空的操作数栈和操作符栈。 2. 从左到右扫描表达式中的每个字符,如果它是数字,将数字转换为相应的操作数入栈;如果是运算符,则判断当前运算符与操作符栈顶元素的优先级关系,如果当前运算符的优先级大于操作符栈顶元素,则将当前运算符入栈;否则,从操作数栈中取出两个操作数,从操作符栈中取出一个操作符,进行相应的运算,将运算结果入操作数栈,然后将当前运算符入操作符栈。 3. 当表达式扫描完毕后,如果操作符栈不为空,则从操作数栈中取出两个操作数,从操作符栈中取出一个操作符,进行相应的运算,将运算结果入操作数栈,重复此过程直到操作符栈为空。 4. 最后,操作数栈中仅剩下一个元素,即为表达式的值。 下面是一个示例程序,它演示了如何使用算符优先法对算术表达式求值: ``` #include <iostream> #include <stack> #include <map> #include <string> using namespace std; int priority(char op) { // 定义运算符优先级 map<char, int> pr = {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}}; if (pr.find(op) != pr.end()) { return pr[op]; } else { return 0; } } double calculate(double num1, double num2, char op) { // 定义运算函数 double result = 0; switch (op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; default: break; } return result; } double evaluate(string expr) { // 定义求值函数 stack<double> nums; stack<char> ops; int len = expr.length(); for (int i = 0; i < len; i++) { char ch = expr[i]; if (isdigit(ch)) { // 如果是数字,将其转换为操作数入栈 int j = i, num = 0; while (j < len && isdigit(expr[j])) { num = num * 10 + expr[j] - '0'; j++; } i = j - 1; nums.push(num); } else if (ch == '(') { // 如果是左括号,入操作符栈 ops.push(ch); } else if (ch == ')') { // 如果是右括号,从操作数栈中取出两个操作数和一个操作符进行运算 while (!ops.empty() && ops.top() != '(') { double num2 = nums.top(); nums.pop(); double num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(calculate(num1, num2, op)); } if (!ops.empty()) ops.pop(); // 弹出左括号 } else if (priority(ch) > 0) { // 如果是运算符,判断优先级并入操作符栈 while (!ops.empty() && priority(ch) <= priority(ops.top())) { double num2 = nums.top(); nums.pop(); double num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(calculate(num1, num2, op)); } ops.push(ch); } } while (!ops.empty()) { // 处理剩余的操作符 double num2 = nums.top(); nums.pop(); double num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(calculate(num1, num2, op)); } return nums.top(); } int main() { // 测试程序 string expr = "3+2*4-1/2"; cout << "Expression: " << expr << endl; cout << "Value: " << evaluate(expr) << endl; return 0; } ``` 以上代码中,我们使用了两个栈来保存操作数和操作符。向前扫描表达式中的每个字符,如果它是数字,将数字转换为相应的操作数入栈;如果是运算符,则判断当前运算符与操作符栈顶元素的优先级关系,如果当前运算符的优先级大于操作符栈顶元素,则将当前运算符入栈;否则,从操作数栈中取出两个操作数,从操作符栈中取出一个操作符,进行相应的运算,将运算结果入操作数栈,然后将当前运算符入操作符栈。最终,操作数栈中仅剩下一个元素,即为表达式的值。 上述程序输出的结果为: ``` Expression: 3+2*4-1/2 Value: 10.5 ``` 因此,我们使用算符优先法成功地求解了算术表达式的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值