zoukankan      html  css  js  c++  java
  • 算法第二次作业

    问题内容

    第一行有一个正整数 k,表示有 k 个一元实系数多项式。接下来有 k(k<=20)个数据块,每个数据块的第 1行是 1 个正整数 s,表示该数据块共有 s行。接下来的 s 行中,每行由实数 a和整数 b组成,表示多项式中的项 
    紧接着 k 个数据块的是长度为 k-1 的字符串,每个字符是“+”,“-”,“*”这 3 个字符之一。
    ★数据输出:
    文件的第一行是计算得到的多项式 g(x),输出多项式时,用 x^k 表示应表示为 5x^5。注意输出的结果应该符合数学中手写习惯。例如,x不应输出为 1x^1,实系数 保留 6位有效数字。(数据保证多项式项数不大于 500)
    ★补充说明
    整数 b 满足 b 为非负整数
    输出的多项式结果,按项的幂次从高到低排序,参见样例
    ★Hint
    c++中可以使用 setprecision 操作符来控制显示浮点数值的有效数的数量
    

    输入示例

    输入示例1
    2
    4
    -1 4
    8.75 3
    0.5556666 2
    1234.456 1
    1
    6007.0012 0
    +

    输出示例1
    -x4+8.75x3+0.555667x^2+1234.46x+6007

    输入示例2
    3
    3
    3 3
    4 1
    6 0
    2
    6 2
    1 0
    1
    3 1
    +*

    输出示例2
    9x4+18x3+12x^2+21x

    整体思路

    因为我链表太菜了,所以决定开一个二维数组将所有多项式的数据存起来,用下标表示多项式某一项的次数。
    然后就是不停的写写改改,但这个方法也有很大的不足,因为如果指数过大就无法存进数组中。

    我的代码

    #include<iostream>
    using namespace std;
    double num[21][502]={0};
    void add(int a){         //加法
    	int j;
    	for(j=0;j<502;j++){
    		num[20][j]=num[20][j]+num[a+1][j];
    	} 
    }
    void re(int a){          //减法
    	int j;
    	for(j=0;j<502;j++){
    		num[20][j]=num[20][j]-num[a+1][j];
    	}
    }
    void mul(int a){            //乘法
    	int j,l;
    	double n[502]={0};
    	for(j=0;j<502;j++){
    		if(num[20][j])
    		for(l=0;l<501;l++)
    		if(num[a+1][l])
    		n[l+j]+=num[20][j]*num[a+1][l];
    	}
    	for(j=0;j<502;j++){
    		num[20][j]=n[j];
    	}
    }
    void show(){        //最终输出
    	int j,s=0;    //注意将s初始化为0,否则s的数值未知,下面for循环判断时如果全是0,那么s的值不定就会导致程序错误
    	for(j=0;j<502;j++){
    		if(num[20][j]!=0){
    			s=j;
    		}
    	}
    	if(s!=0&&s!=1){
    		if(num[20][s]==1)
    		cout<<"x^"<<s;
    		if(num[20][s]!=1&&num[20][s]!=-1)
    		cout<<num[20][s]<<"x^"<<s;
    		if(num[20][s]==-1)
    		cout<<"-x^"<<s;
    	}
    	if(s==0)
    	cout<<num[20][s];
    	if(s==1){
    		if(num[20][s]==1)
    		cout<<"x";
    		if(num[20][s]==-1)
    		cout<<"-x";
    		if(num[20][s]!=1&&num[20][s]!=-1)
    		cout<<num[20][s]<<"x";
    	}
    	for(j=s-1;j>=0;j--){
    		if(num[20][j]>0&&num[20][j]!=1){
    			if(j!=1&&j!=0)
    			cout<<"+"<<num[20][j]<<"x^"<<j;
    			if(j==1)
    			cout<<"+"<<num[20][j]<<"x";
    		    if(j==0)
    		    cout<<"+"<<num[20][j];
    		}
    		if(num[20][j]==1){
    			if(j==1){
    				cout<<"+x";
    			}
    			if(j==0)
    			cout<<"+1";
    			if(j!=0&&j!=1)
    			cout<<"+x^"<<j;
    		}
    		if(num[20][j]<0&&num[20][j]!=-1){
    			if(j!=1&&j!=0)
    			cout<<num[20][j]<<"x^"<<j;
    			if(j==1)
    			cout<<num[20][j]<<"x";
    		    if(j==0)
    		    cout<<num[20][j];
    		}
    		if(num[20][j]==-1){
    			if(j==1){
    				cout<<"-x";
    			}
    			if(j==0)
    			cout<<"-1";
    			if(j!=0&&j!=1)
    			cout<<"-x^"<<j;
    		}
    	}
    }
    int main(){
    	int k,i,s[21]={0},z;
    	double x;
    	char sym[21];
    	cin>>k;
    	for(i=0;i<k;i++){
    		cin>>s[i];
    		for(int j=0;j<s[i];j++){
    			cin>>x>>z;
    			num[i][z]=x;
    		}
    	}
    	for(i=0;i<k-1;i++)
    	cin>>sym[i];
    	for(int j=0;j<502;j++)
    	num[20][j]=num[0][j];
    	for(i=0;i<k-1;i++){
    		if(sym[i]=='+')
    		add(i);
    		if(sym[i]=='-')
    		re(i);
    		if(sym[i]=='*')
    		mul(i);
    	}
    	show();
    	return 0 ;
    }
    
  • 相关阅读:
    架构之美阅读笔记05
    架构之美阅读笔记04
    已经导入到VS工具箱中的DevExpress如何使用
    C#中遇到的方法总结
    vs下C# WinForm 解决方案里面生成的文件都是什么作用?干什么的?
    ssh关于含有外键的传值中无法识别正确的action的原因和解决办法
    MVC模式在Java Web应用程序中的实例分析
    浅谈对MVC的理解
    简述23种设计模式
    浅谈对可用性和易用性的认识以及对如何增加系统功能的理解
  • 原文地址:https://www.cnblogs.com/XINJIUXJ/p/13663319.html
Copyright © 2011-2022 走看看