求算术表达式1!+2!+3!+4!+…+20!的值并输出

2024-12-28 18:29:18
推荐回答(3个)
回答1:

#include
#include
//创建一个结构体,用于栈中的元素,其中包含数据域和指针域
typedef struct stack
{
char data;//数据域
struct stack * next;//指针域
}sqstack;

//初始化栈
sqstack * initstack(sqstack * L)
{
L = (sqstack *)malloc(sizeof(sqstack));
L->next = NULL;
L->data = -1;
return L;
}

//入栈
void push(sqstack *L,char data)
{
sqstack *q;//创建一个指向节点的指针
q = (sqstack *)malloc(sizeof(sqstack));//动态分配一个内存空间
q->next = NULL;
q->data = data; //以上是初始化一个节点
q->next = L->next; //将q的指针域指向L的指针域指向的地址
L->next = q; //将L的next域指向q
L->data ++; //将L的数据域自增1,表示栈中的元素个数
}

//出栈
void pop(sqstack *L ,char *data)
{
*data = L->next->data ; //将data的值赋值为L的next域指向的元素的数据域的值
L->next = L->next->next ; //将L的next域指向的元素删除
L->data --; //元素个数-1
}

//取栈顶
char gettop(sqstack *L)
{
return L->next->data;//取栈顶的元素
}

//判断数据是否为符号
int in(char data)
{
if(data == '+'||data == '-'||data == '*'||data == '/'||data == '('||data == ')'||data == '#')
return 1;
else return 0;
}

//判断符号的优先性
char precede(char a,char b)
{
if( ((a == '+' ) && (b == '-' || b == '+' || b == ')' || b == '#'))||
((a == '-' ) && (b == ')' || b == '#' || b == '+' || b == '-'))||
((a == '*' ) && (b == '*' || b == '/' || b == '-' || b == '+' || b == ')' || b == '#' ))||
((a == '/' ) && (b == '*' || b == '/' || b == '-' || b == '+' || b == ')' || b == '#' ))||
((a == ')' ) && (b != '(')))
return '>';
else if(((b == '(' ) && (a != '('))||
((b == '/' ) && (a == '+' || a == '-' || a == '(' || a == '#' ))||
((a == '+' || a == '-' || a == '(' || a == '#' ) && (b == '*' ))||
((a == '(' || a == '#') && (b == '-'))||
((a == '(' || a == '#') && (b == '+'))
)
return '<';
else if (((a == '(') && (b == ')'))||
((a == '#') && (b == '#'))
)
return '=';
else
{
printf("输入格式有误");
return 0;
}

}

//算术运算
char operate(int a,char theta,int b)
{
if (theta == '+')
return (char)(a+b+48);
else if(theta == '-')
return (char)(a-b+48);
else if(theta == '/')
return (char)(a/b+48);
else if(theta == '*')
return (char)(a*b+48);
else
{
printf("\n 您输入的算法有误!");
return 0;
}
}

void main()
{
char data,n,theta;
char a,b;
sqstack *OPTR;
sqstack *OPND;
OPTR = NULL;
OPND = NULL;
OPTR=initstack(OPTR);
push(OPTR,'#');
OPND=initstack(OPND);
printf("请输入算术表达式,表达式中运算符请用英文符号!并且以'#'结束!\n请输入表达式:");
data = getchar();
while(data!='#'||gettop(OPTR)!='#')
{
if(!in(data))
{
push(OPND,data);
data = getchar();
}
else
switch(precede(gettop(OPTR),data))
{
case '<':
push(OPTR,data);
data = getchar();
break;
case '=':
pop(OPTR,&n);
data = getchar();
break;
case '>':
pop(OPTR,&theta);
pop(OPND,&b);
pop(OPND,&a);
push(OPND,operate((a-48),theta,(b-48)));
break;
}
}
printf("\n 结果为:%d ",(int)(OPND->next->data-48));
}

呵呵o(∩_∩)o...,这还是当初学c的时候才写的呢!
现在都快忘了差不多了!
c学好堆栈,队列,表这些就很不错了呢!
另外,站长团上有产品团购,便宜有保证

回答2:

#include

int main(void)
{
int i , j , sum1 ,sum = 0;

for(i = 1;i <= 20;i ++)
{
sum1 = 1 ;
for(j = 1;j <= i;j ++)
{
sum1 = sum1 * j;
}
sum = sum + sum1;
}
printf("sum is: %d\n",sum);
}
新手解答

回答3:

#include
using namespace std;
int jiecheng(int n)
{
int x=1;
for(int i=1;i<=n;i++)
x=x*i;
return x;
}
main(){
int n,x=0;
cin>>n;
for(int i=1;i<=n;i++)
x+=jiecheng(i);
cout< }