XDOJ-一元稀疏多项式计算器

2023-11-03 04:08

本文主要是介绍XDOJ-一元稀疏多项式计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一元稀疏多项式计算器

要变得更强。
————更新————
下面同学说的问题我改正啦。
没改之前:
可以看到多了个负号,是因为在这个结构体里面,第一项就是0,因此会跳过打印多项式对fooo[0]的求解,所以会多一项负号。
因此我选择用for循环来找到第一项不是0的就可以啦。
改后:
在这里插入图片描述
——————————
这个问题怎么说,一个上午就这么过去了。果然不愧是小白:(
一开始我还想用三个数组,一个存第一个,一个存第二个,再把结果存到另外一个数组里面。
不过很明显,非常麻烦,当给我把代码码出来时,得到的结果也很离谱。然后……然后我就几乎全部重改了。
然后缩减至两个数组,将无论加减都放在一个数组里。
再将结果放进另外一个数组里。
需要考虑的点:

1.关于系数为0 ,1,-1
2.关于幂次为0,1
3.如果和为0(使用count来计数)

问题描述

一元 n 次多项式𝑝0𝑋𝑒0 + 𝑝1𝑋𝑒1 + ⋯ + 𝑝𝑖𝑋𝑒𝑖 + ⋯ + 𝑝𝑛𝑋𝑒𝑛
项数较少时成为一元稀疏多项式, 例如:3 + 6𝑋3 − 2𝑋8 + 12𝑋20是一个一元稀疏多项式。设计一个一元稀疏多项式计算器程
序完成两个一元稀疏多项式的加减法,输出结果多项式的各项系数和指数。

输入说明

输入数据第 1 行为 3 个正整数 n,m,t。
其中 n 表示第一个多项式的项数,m 表示第二个多项式的项数,t 表示运算类型,0为加法,1 为减法。
数据的第 2 行包含 2n 个整数,每两 个整数分别表示第一个多项式每一项的系数和指数;第 3 行包含 2m 个整数,每两个整数分 别表示第二个多项式每一项的系数和指数。两个多项式的每项是按照指数递增的形式给出的, 例如对于多项式3 + 6𝑋3 − 2𝑋8 + 12𝑋20,对应的输入为 3 0 6 3 -2 8 12 20。

输出说明

运算结果按指数从低到高的顺序在以多项式形式(见输出样例)输出结果,注意系数为负数 时输出减号,系数为 0 时不输出该项,指数为 1
时不输出指数。

输入样例

6 2 0 1 0 1 1 1 2 1 3 1 4 1 5
-1 3 -1 4

输出样例

1+x+x^2 +x^5

我的代码

#include<stdio.h>
typedef struct{struct{int ratio,power;}items;
}POLYNOMIA;int main(){POLYNOMIA f[1000],fooo[1000];int n,m,t,i,j,temp1,temp2,ra,po;int count=1,k=0,sum=0;scanf("%d %d %d",&n,&m,&t);//输入数字 //printf("N:%d M:%d T:%d\n",n,m,t);for(i=0;i<n;i++) scanf("%d %d",&f[i].items.ratio,&f[i].items.power);for(j=0;j<m;j++,i++) {scanf("%d %d",&ra,&po);//在输入时就验证是加法还是减法if(t){//t=1是减法f[i].items.ratio=-ra;f[i].items.power=po;	} else{//加法 f[i].items.ratio=ra;f[i].items.power=po;}}//进行排序for(i=0;i<m+n;i++){ for(j=0;j<m+n-i-1;j++){if(f[j].items.power>f[j+1].items.power){temp1=f[j].items.power;f[j].items.power=f[j+1].items.power;f[j+1].items.power=temp1;temp2=f[j].items.ratio;f[j].items.ratio=f[j+1].items.ratio;f[j+1].items.ratio=temp2;}}}//进行计算for(i=0;i<m+n;i++){if(f[i].items.power!=f[i+1].items.power){fooo[k].items.power=f[i].items.power;fooo[k].items.ratio=f[i].items.ratio;//	printf("fooo%d:%d %d\n",k,fooo[k].items.ratio,fooo[k].items.power);	k++;}if(f[i].items.power==f[i+1].items.power){f[i+1].items.ratio+=f[i].items.ratio;}		} //打印多项式 for(i=0;fooo[i].items.ratio==0;i++);if(fooo[i].items.ratio!=0){//由于第一位不带加减号。count=0; if(fooo[i].items.ratio==1){if(fooo[i].items.power==0)printf("%d",fooo[0].items.ratio);else if(fooo[i].items.power==1) printf("x");else printf("x^%d",fooo[i].items.power);}else if(fooo[i].items.ratio==-1){if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("-x");else printf("-x^%d",fooo[i].items.power);}else{if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("%dx",fooo[i].items.ratio);else printf("%dx^%d",fooo[i].items.ratio,fooo[i].items.power);}}for(i++;i<k;i++){//对后面的数字进行加减 if(fooo[i].items.ratio>0){//如果系数是大于0的数字count=0;	if(fooo[i].items.ratio==1){// 要特别注意1的情况if(fooo[i].items.power==0) printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("+x");else printf("+x^%d",fooo[i].items.power);}else{if(fooo[i].items.power==0)printf("+%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("+%dx",fooo[i].items.ratio);else printf("+%dx^%d",fooo[i].items.ratio,fooo[i].items.power);}}else if(fooo[i].items.ratio==0){count=1;continue;}else{//如果本身是负数,既有符号,就不需要再加上,多余 count=0;if(fooo[i].items.ratio==-1){if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("-x");else printf("-x^%d",fooo[i].items.power);}else{if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("%dx",fooo[i].items.ratio);else printf("%dx^%d",fooo[i].items.ratio,fooo[i].items.power);}	}}if(count)printf("0");return 0;
}

130行太多了太多了——
对于一个C的基础题,这就像你写1+1;
写过程用了nnnnnn个方程来解决一样。
哎呀,就是比喻不大确切。
不过,要是能够优化,请扣我!!!
乐意至极,谢谢。

这篇关于XDOJ-一元稀疏多项式计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335481

相关文章

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

稀疏自编码器tensorflow

自编码器是一种无监督机器学习算法,通过计算自编码的输出与原输入的误差,不断调节自编码器的参数,最终训练出模型。自编码器可以用于压缩输入信息,提取有用的输入特征。如,[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]四比特信息可以压缩成两位,[0,0],[1,0],[1,1],[0,1]。此时,自编码器的中间层的神经元个数为2。但是,有时中间隐藏层的神经元

QT学习之计算器

网格布局初尝试,快速构建计算器 项目结构: wident.h拖动建立界面,20个button,一个lineedit 布局好后整体网格布局调整,依次给每个案件输入文本,并改objectname方便后期辨识 为了在lineedit显示数字,转到槽,编辑点击事件,如显示“1” void Widget::on_pushButton1_clicked(){expression += "1";u

Arcgis字段计算器:随机生成规定范围内的数字

选择字段计算器在显示的字段计算器对话框内,解析程序选择Python,勾选上显示代码块, 半部分输入: import random; 可修改下半部分输入: random.randrange(3, 28) 表示生成3-28之间的随机数 字段计算器设置点击确定完成随机数的生成,生成的随机数如下图所示。

Vue初学-简易计算器

最近在学习Vue的指令,做了一个简易计算器,比较适合刚入门的人参考学习。用到的知识点有: 1.插值表达式 2.v-model,双向绑定+、-、*、/、**等操作符 3.v-show,控制操作数2是否显示,乘方时不显示操作数2 4.methods选项,定义了calculate ()方法,实现各种运算 5.watch选项,监听selected的值的变化。 下面是程序的执行效果: 如果选择的是**乘

一元分类、二元分类、多类分类、多标签学习

unary classification -- 一元分类 维基百科中的定义是:一类分类,即一元分类,通过仅包含该类的对象的训练数据中学习,试图能够在所有对象中识别该特定类的对象。 one-class classification是由[Moya & Hush][1]在1996年提出的,目前已有很多这方面的研究。一个类似的问题是PU Learning,后者是以半监督的学习方式从正类样本和未标记样本

算法笔记02--归纳法之多项式求值(Horner规则)

多项式求值 假设有n+2个实数a0,a1,...,an和x的序列,求多项式 p_nx = a_nx^n + a_n-1x^n-1 + ...+ a_1x + a_0; 则需要乘法:n+n-1 + ...+2+1 = n(n+1)/2 需要加法:n 可见算法效率为O(n^2) 而p_nx = ((...((((a_n)x + a_n-1)x + a_n-2)x + a_n-3)....)

每日OJ_牛客_Emacs计算器(逆波兰表达式)

目录 牛客_Emacs计算器(逆波兰表达式) 解析代码 牛客_Emacs计算器(逆波兰表达式) Emacs计算器__牛客网 解析代码 逆波兰表达式(后缀表达式)求值,需要借助栈,思路: 循环输入,获取逆波兰表达式,然后进行以下补助,直到测试完所有的测试用例: 遇到数字字符串,将该数字字符串转化为数字然后入栈。遇到操作符时,从栈顶取两个数字,然后进行该运算符所对应运算

Django 中的用户界面 - 创建速度计算器

在 Django 中创建一个用户界面来计算速度,可以通过以下步骤完成。这个速度计算器将允许用户输入距离和时间,计算并显示速度。 一、问题背景 一位 Django 新手希望使用 Django 构建一个用户界面,以便能够计算速度(速度 = 距离/时间)。用户创建了一个名为 “speed” 的 Django 项目。但是,在运行服务器时遇到了错误,无法获取速度的用户界面。 二、解决方案 1、检