4 条题解
-
1
#include<bits/stdc++.h> using namespace std; constexpr int LEN = 10004; int a[LEN], b[LEN], c[LEN], d[LEN]; void Hello(){ cout<<"计算器程序\n可支持10的10000次方位内的运算\n"; cout<<"有如下功能\n"; cout<<"1.常规运算\n"; cout<<"2.面积/体积计算\n"; cout<<"3.表达式计算\n"; cout<<"4.三角函数\n"; cout<<"5.算24点\n"; cout<<"请输入一个整数a,表示所需操作,输入0则结束\n"; } struct Gjd{ void clear(int a[]){ for(int i=0;i<LEN;i++){ a[i]=0; } } void read(string s,int a[]){ cin>>s; int len=s.size(); for(int i=0;i<len;i++){ a[len-i-1]=s[i]-'0'; } } void print(int a[]){ int i; for(i=LEN-1;i>=1;i--){ if(a[i]!=0) break; } for(;i>=0;i--){ cout<<a[i]; } cout<<'\n'; } void add(int a[],int b[],int c[]){ clear(c); for(int i=0;i<LEN;i++){ c[i]+=a[i]+b[i]; if(c[i]>=10){ c[i+1]+=c[i]/10; c[i]%=10; } } } void sub(int a[],int b[],int c[]){ clear(c); for(int i=0;i<LEN-1;i++){ c[i]+=a[i]-b[i]; if(c[i]<0){ c[i+1]-=1; c[i]+=10; } } } void mul(int a[],int b[],int c[]){ clear(c); for(int i=0;i<LEN;i++){ for(int j=0;j<=i;j++){ c[i]+=a[j]*b[i-j]; } if(c[i]>=10){ c[i+1]+=c[i]/10; c[i]%=10; } } } bool greater_eq(int a[], int b[], int last_dg, int len) { if (a[last_dg + len] != 0) return true; for (int i = len - 1; i >= 0; --i) { if (a[last_dg + i] > b[i]) return true; if (a[last_dg + i] < b[i]) return false; } return true; } void div(int a[], int b[], int c[], int d[]) { clear(c); clear(d); int la, lb; for (la = LEN - 1; la > 0; --la) if (a[la - 1] != 0) break; for (lb = LEN - 1; lb > 0; --lb) if (b[lb - 1] != 0) break; if (lb == 0) { puts("不合法"); return; } for (int i = 0; i < la; ++i) d[i] = a[i]; for (int i = la - lb; i >= 0; --i) { while (greater_eq(d, b, i, lb)) { for (int j = 0; j < lb; ++j) { d[i + j] -= b[j]; if (d[i + j] < 0) { d[i + j + 1] -= 1; d[i + j] += 10; } } c[i] += 1; } } } }; long long binpow(long long a, long long b, long long m){ a%=m; long long res=1; while(b>0) { if(b&1) res=res*a%m; a=a*a%m; b>>=1; } return res; } void cgys(){ cout<<"有什么可以帮到你的\n"; cout<<"A.加减乘除\n"; cout<<"B.开方\n"; cout<<"C.一个数的幂次\n"; char op; cin>>op; if(op=='A'){ cout<<"输入:一个形如 a <op> b 的表达式。\na、b 分别是长度不超过 1000 的十进制非负整数;\n<op> 是一个字符(+、-、* 或 /),表示运算。\n整数与运算符之间由一个空格分隔。\n"; Gjd gjd; string s1,s2; char s; gjd.read(s1,a); cin>>s; gjd.read(s2,b); if(s=='+'){ gjd.add(a,b,c); gjd.print(c); } else if(s=='-'){ gjd.sub(a,b,c); gjd.print(c); } else if(s=='*'){ gjd.mul(a,b,c); gjd.print(c); } else if(s=='/'){ gjd.div(a,b,c,d); cout<<"商:\n"; gjd.print(c); cout<<"余数:\n"; gjd.print(d); } else cout<<"不合法"; } else if(op=='B'){ cout<<"仅可支持10的18次方内的运算\n"; cout<<"开几次方\n"; int opo; cin>>opo; cout<<"输入操作数\n"; unsigned long long s; cin>>s; cout<<"结果为"<<pow(s,1.0/opo)<<'\n'; } else{ cout<<"仅可支持10的18次方内的运算\n"; cout<<"输入底数\n"; long long as; cin>>as; cout<<"输入幂数\n"; long long k; cin>>k; cout<<"输入模数\n"; long long mod; cin>>mod; cout<<binpow(as,k,mod)<<'\n'; } } const double pi=3.14; void mtjjs(){ cout<<"可计算以下图形/物体的面积/体积\n"; cout<<"1.正方形\n2.长方形\n3.平行四边形\n4.三角形\n5.梯形\n6.扇形\n7.扇环\n"; int n; cin>>n; if(n==1){ cout<<"输入边长:"; int ap; cin>>ap; cout<<"S="<<ap*ap; }else if(n==2){ cout<<"输入长:"; int aa; cin>>aa; cout<<"输入宽:"; int ap; cin>>ap; cout<<"S="<<aa*ap; }else if(n==3||n==4){ cout<<"输入底:"; int aa; cin>>aa; cout<<"输入高:"; int ap; cin>>ap; if(n==4){ cout<<"S="<<aa*ap*1.0/2<<'\n'; }else{ cout<<"S="<<aa*ap<<'\n'; } }else if(n==5){ cout<<"输入上底:"; int aa; cin>>aa; cout<<"输入上底:"; int ab; cin>>ab; cout<<"输入高:"; int ap; cin>>ap; cout<<"S="<<(aa+ab)*ap*0.5; }else if(n==6){ cout<<"输入半径:"; int r; cin>>r; cout<<"输入圆心角:"; int al; cin>>al; long long s=r*r*314*al; long long d=__gcd(s,36000ll); cout<<"S="<<s/d<<'/'<<36000/d; }else if(n==7){ cout<<"输入外半径:"; int r; cin>>r; cout<<"输入内半径:"; int r1; cin>>r1; cout<<"输入圆心角:"; int al; cin>>al; printf("%.2lf",(r*r-r1*r1)*pi*al/360.0); } } struct bdsjs{ bool IsOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'|| c == '^'; } // 获取运算符的优先级 int GetPriority(char c) { if (c == '+' || c == '-')return 1; if (c == '*' || c == '/')return 2; if (c == '^')return 3; return 0; } // 从字符串中读取一个数字,考虑负数的情况 string ReadNum(string& str,int& i){ string res; if(str[i] == '-'){ res += str[i]; i++; } while (i < str.size() && isdigit(str[i])) { res += str[i++]; } i--; if(res.empty() || res == "-"){cout<<"NO"<<endl;exit(0);} return res; } // 将中缀表达式转换为后缀表达式 vector<string> InfixToPostfix(string& str) { stack<char> s; vector<string> tokens; bool symbol = false; for (int i = 0; i < str.size(); i++) { if (str[i] == '(') { s.push(str[i]); } else if (str[i] == ')') { while (s.size() && s.top()!= '(') { tokens.push_back(std::string(1, s.top())); s.pop(); } s.pop(); }else if(!symbol){ tokens.push_back(ReadNum(str,i)); symbol = true; }else if(IsOperator(str[i])){ while (s.size() && GetPriority(str[i]) <= GetPriority(s.top())) { tokens.push_back(std::string(1, s.top())); s.pop(); } s.push(str[i]); symbol = false; } } return tokens; } int PostfixToAns(std::vector<std::string>& tokens) { std::stack<int> s; for (int i = 0; i < tokens.size(); i++) { if (isdigit(tokens[i][0]) || tokens[i].size() > 1) { s.push(std::stoi(tokens[i])); } else { int a = s.top();s.pop(); int b = s.top();s.pop(); if (tokens[i] == "+") {s.push(a + b);} else if (tokens[i]== "-") {s.push(b - a);} else if (tokens[i] == "*") {s.push(a * b);} else if (tokens[i] == "^") { int sum=1; while(a>0){ if(a%2!=0)sum=sum*b; b=b*b; a=a>>1; } s.push(sum); } else if (tokens[i] == "/") {if (a == 0) {std::cout<<"NO"<<std::endl;exit(0);}s.push(b / a);} } } return s.top(); } }; void bds(){ cout<<"输入一个表达式(支持 + - * / ^):"; std::string expression; std::cin >> expression; // expression.pop_back(); bdsjs js; expression = "(" + expression + ")"; std::vector<std::string> tokens = js.InfixToPostfix(expression); int ans = js.PostfixToAns(tokens); cout<<"结果为:"<<ans<<std::endl; } void sjhs(){ cout<<"输入类型:"; string s; cin>>s; if(s=="sin"){ cout<<"输入弧度:"; int p; cin>>p; cout<<sin(p); }else if(s=="cos"){ cout<<"输入弧度:"; int p; cin>>p; cout<<cos(p); }else{ cout<<"输入弧度:"; int p; cin>>p; if(cos(p)){ cout<<sin(p)*1.0/cos(p)*1.0<<"\n"; } else cout<<"不合法"; } } struct Sd{ int a[5]; char opt[5]={' ','+','-','*','/'}; int Js(int x,int k,int y){ if(k==1) return x+y; if(k==2) return max(x,y)-min(x,y); if(k==3) return x*y; else if(!y||x<y||!x%y) return -9999; return x/y; } void Out(int a,int b,int c,int d,int e,int f,int k1,int k2,int k3){ printf("%d%c%d=%d\n",max(a,b),opt[k1],min(a,b),Js(max(a,b),k1,min(a,b))); printf("%d%c%d=%d\n",max(c,d),opt[k2],min(c,d),Js(max(c,d),k2,min(c,d))); printf("%d%c%d=%d\n",max(e,f),opt[k3],min(e,f),Js(max(e,f),k3,min(e,f))); } void run(){ scanf("%d%d%d%d", &a[1],&a[2],&a[3],&a[4]); sort(a+1,a+5); //保证遍历所有情况 do{ for (int i = 1; i <= 4; i++){ for (int j = 1; j <= 4; j++){ for (int k = 1; k <= 4; k++){ if (Js(Js(Js(a[1],i,a[2]),j,a[3]),k,a[4])==24){ Out(a[1],a[2],Js(a[1],i,a[2]),a[3],Js(Js(a[1],i,a[2]),j,a[3]),a[4],i,j,k); return; } //((a?b)?c)?d else if (Js(Js(a[1],i,a[2]),k,Js(a[3],j,a[4])) == 24){ Out(a[1],a[2],a[3],a[4],Js(a[1],i,a[2]),Js(a[3],j,a[4]),i,j,k); return; } } } } //暴力枚举3个运算符 } while (next_permutation(a + 1, a + 5)); puts("No answer!"); } }; void s24d(){ cout<<"输入四个1到9之间的自然数(所有运算结果均为正整数。):\n"; Sd sd; sd.run(); } int main(){ Hello(); int a; cin>>a; while(a){ if(a==1){ cgys(); } else if(a==2){ mtjjs(); } else if(a==3){ bds(); } else if(a==4){ sjhs(); } else{ s24d(); } cout<<'\n'; Hello(); cin>>a; } return 0; }
- 1
信息
- ID
- 2
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 5
- 标签
- 递交数
- 138
- 已通过
- 53
- 上传者