4 条题解

  • 1
    @ 2025-2-10 20:48:20
    #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;
    }
    

    信息

    ID
    2
    时间
    1000ms
    内存
    32MiB
    难度
    5
    标签
    递交数
    138
    已通过
    53
    上传者