多项式系数提取算法 c++

2023-05-16


bool isNumber(char s)
{
if (s >= 48 && s <= 57)
return true;
else
return false;
}

bool isLetter(char s)
{
if (s >= 97 && s <= 122)
return true;
else
return false;
}

//函数的作用是把如“-45+2*a-a^2-4*a^6+a^8”这样的字符串提取成这样:(-45,2,-1,0,0,0,-4,0,1),只提取系数,并根据指数安排起位置.
//s为传入的字符串,result为处理后的一组数,返回这组数的个数
//恩,我需要这样的一个函数
int fenxi(string &s,double **result)
{
// string s("-45+2*a-a^2-4*a^6+a^8");
int letter = 0; //字符串中字母的个数
int operators = 0; //字符串中运算符的个数(+ - * ^),包括最开头隐藏的+号

double *num = new double[s.length()]; //存储数字,存储已经判断过正负号的数字
int dijige_num = 0; //和num配合,定位每一个数字,是合起来的数字,不是单个字符数字

double *pow = new double[s.length()]; //存储幂指数的数字,只能判断正指数。抱歉,负指数无法判断
int dijige_pow = 0; //和pow配合,定位每一个指数数字,也是合起来的数字

double *list = new double[s.length()]; //队列数据结构,用于存储每个数字位,未免溢出,开辟的和字符串长度相等
int front = (int)(s.length() / 2); //指向队列头部,填入数据时减小,开始位置在list正中间
int tail = (int)(s.length() / 2); //指向队列尾部,取出数据时减小,开始位置和front一样

int *op = new int[s.length()]; //用来存储正负号运算符,用来确定数字的正负号
int pin = 0; //指向每一个正负号运算符,用来定位

for (int i = 0; i < s.length(); i++) //初始化,全初始为0
{
list[i] = 0;
pow[i] = 0;
num[i] = 0;
op[i] = 0;
}

if (s.length() == 1 &&isLetter(s[0])) //处理为“a”的情况
{
num[dijige_num++]=1;
pow[dijige_pow]=1;
goto end;
}

if (s.length() ==2 &&isLetter(s[1])) //处理为‘-a’的情况
{
num[dijige_num++] = -1;
pow[dijige_pow] =1;
goto end;
}

for (int i=0;i<s.length();i++)
{
if (isLetter(s[i]))
{
letter++;
}
}
if (letter == 0) //处理全为数字的情况,正负均可
{
num[dijige_num++] =atoi(s.c_str());
pow[dijige_pow] = 0;
goto end;
}

letter=0;
if (s[0] == '-') //判断最初的运算符正负号,这是为负号的情况
{
op[0] = -1;
pin++;
operators++;
}
else //以一个字符不是‘-’时,是数字或字母,都判断为正号
{
op[0] = 1;
pin++;
if (!isLetter(s[0])) //不是字母的话,这个operators加一
{
operators++;
}
}

for (int i = 0; i < s.length(); i++)
{
if (isLetter(s[i]))
{
if (letter == 0)
{
if (!isLetter(s[s.length()-1]))
{
if (s[i+1] != '^') //用来判断单个a的情况,如 1+a+a^2;这是a的下一个字符如果不是'^',就说明这个a的幂指数为1
{
pow[dijige_pow] = 1;
dijige_pow++;
}
}
else
{
pow[dijige_pow] = 1;
}
}
letter++;
if (i != 0)
{
if (s[i-1] == '+') //不是第一个字母时,看字母前的正负号,来设置num中为+1或-1
{
num[dijige_num] = 1;
dijige_num++;
}
if (s[i-1] == '-')
{
num[dijige_num] = -1;
dijige_num++;
}
}
if (i == 0) //如果第一个为字母的话,那这个字母的系数肯定是+1
{
num[dijige_num] = 1;
dijige_num++;
}
}

if (isNumber(s[i]))
{
if (letter ==0 && front == tail &&operators < 2 ) //第一个位为数字时,pow这一位值为0,比如12=12*a^0
{
pow[dijige_pow] = 0;
dijige_pow++;
}

front--;
list[front] = (double)(s[i] - 48); //将ascii字符-48就变为数字了
}

if (s[i] == '+')
{
if (i != 0)
{
operators++;
}
if (letter == 0) //后面多次有这个,主要是把list队列中存储的单个数逐次取出并合成num中或pow中的数
{
if (front != tail)
{
while (front != tail)
{
tail--;
num[dijige_num] = list[tail] + num[dijige_num] * 10;
}
num[dijige_num] = num[dijige_num] * op[pin-1]; //存入num中的数还需要判断正负号,就用op存的数判断
dijige_num++;
tail = (int)(s.length() / 2);
front = tail;
}
}
else
{
if (front != tail)
{
while (front != tail)
{
tail--;
pow[dijige_pow] = list[tail] + pow[dijige_pow] * 10; //存入pow中的数没有判断正负号,这就是为什么不支持负幂指数的原因
}
dijige_pow++;
tail = (int)(s.length() / 2);
front = tail;
}
}
if (i != 0)
{
op[pin] = 1;
pin++;
}
}

if (s[i] == '-')
{
if (i != 0)
{
operators++;
}
if (letter == 0)
{
if (front != tail)
{
while (front != tail)
{
tail--;
num[dijige_num] = list[tail] + num[dijige_num] * 10;
}
num[dijige_num] = num[dijige_num] * op[pin-1];
dijige_num++;
tail = (int)(s.length()/2);
front = tail;
}
}
else
{
if (front != tail)
{
while (front != tail)
{
tail--;
pow[dijige_pow] = list[tail] + pow[dijige_pow] * 10;
}
dijige_pow++;
tail = (int)(s.length() / 2);
front = tail;
}
}
if (i != 0)
{
op[pin] = -1;
pin++;
}
}

if (s[i] == '*')
{
operators++;
if (operators == 2 ) //用来处理类似 2*a+..这样的情况
{
dijige_pow--;
}
if (front != tail) //'*'号之前一般是num吧,一般不会是幂指数吧 ,如“1+2*a^2+34*a^5”,"*"好像都是系数
{
while (front != tail)
{
tail--;
num[dijige_num] = list[tail] + num[dijige_num] * 10;
}
num[dijige_num] = op[pin-1] * num[dijige_num];
dijige_num++;
tail = (int)(s.length() / 2);
front = tail;
}
}
}


while (tail != front) //把最后一个幂指数添加入pow中
{
tail--;
pow[dijige_pow] = list[tail] + pow[dijige_pow] * 10;
}


end:

dijige_pow++;
int res_num = pow[dijige_pow-1] + 1; //最终数组中的数的个数
/*

for (int i=0;i<dijige_num;i++)
{
cout<<num[i]<<" ";
}
cout<<endl;
for (int i=0;i<dijige_pow;i++)
{
cout<<pow[i]<<" ";
}
*/

double *temp = new double[res_num];
*result = new double[res_num]; //最终要输出的数据

for (int i = 0; i < res_num; i++)
{
temp[i] = 0;
}

for (int i = 0; i < dijige_pow; i++) //以pow中的数来定位,把num中的数添加到result中相应的位置
{
int tmp1;
tmp1 = pow[i];
temp[tmp1] = num[i];
}
/*
cout<<endl;
for (int i=0;i<res_num;i++)
{
cout<<temp[i]<<" ";
}
*/
*result=temp;
return res_num;
}

转载于:https://www.cnblogs.com/tiandsp/archive/2011/12/04/2275414.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多项式系数提取算法 c++ 的相关文章

随机推荐

  • mac系统如何生成SSH key与GitHub通信

    一 检查 SSH key 是否存在 在终端输入 xff1a ls al ssh 如果没有 xff0c 终端显示如下 xff1a No such file or directory 如果已经存在 xff0c 则会显示 id rsa 和 id
  • TortoiseSVN 忽略文件 忽略已提交文件

    主要以下两种情况 xff1a 1 首次提交就做好了忽略拦截 xff1a 项目首次提交到svn服务器的时候 xff0c 把该删的删了 xff0c 然后设置忽略规则 xff0c 就没问题了 2 提交一段时间忽然想忽略拦截 xff1a 经常碰到的
  • java里getter和setter的作用和区别是什么?

    java是典型的面向对象的编程语言 xff0c 面向对象三个特性 xff0c 继承性 xff0c 多态性 xff0c 封装性 xff0c 主要和封装性考虑 xff0c 类里面的变量不想设置成公共的类型 xff0c 但是还要给外部使用在这种实
  • FC金手指使用方法+大全

    一 文章来由 童年 小时候除了小霸王FC主机 xff0c 然后就是世嘉MD主机 xff0c 玩的好多啊 xff0c 但有些游戏一直没打穿留下遗憾 网上找金手指使用方法 xff0c 都真真假假 xff0c 鱼龙混杂 xff0c 试了很多终于得
  • shell根据关键字获取文件某一行的行号

    为什么80 的码农都做不了架构师 xff1f gt gt gt cat n 文件名 grep 39 关键字 39 awk 39 print 1 39 cat n是获取行号 xff0c 要是获取行内容 xff0c 去掉 n就可以了 转载于 h
  • VS Code编译支持C++11问题

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如果你正确配置了 xff0c 能正确编译c 43 43 xff0c 但是发现auto等一些关键词不能使用 xff0c 那么 xff0c 请尝试如下操作 xff1a 打开ta
  • word2007自动生成参考文献引用并且右上角标注

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在写毕业论文时 xff0c 总要处理四五十篇的参考文献的引用 xff0c 本文就介绍如何快捷自动生成参考文献引用 xff0c 同时实现参考文献右上角标注 打开需要排版的论文
  • matlab练习程序(随机粒子切换特效)

    视频制作软件中一般都会有相邻帧切换的特效 xff0c 我过去用过vagas好像就有很多切换特效 我想这个也算是其中一种吧 xff0c 虽然我不确定实际中到底有没有这种切换 实际上我只是下班后太无聊了 xff0c 写着玩的 xff0c 没什么
  • PyQt4(简单信号槽)

    import sys from PyQt4 import QtCore QtGui class myWidget QtGui QWidget def init self super myWidget self init self setWi
  • 模拟京东商城登陆HttpRequest

    利用Winform HttpRequest 模拟登陆京东商城 目前只获取订单信息 xff0c 可以获取图片等其他信息 1 using System 2 using System Collections Generic 3 using Sys
  • Nginx (一)Windows下编译Nginx源码以及安装 nginx for windows方法步骤

    转载自 http apps hi baidu com share detail 11192699 content Nginx介绍 xff1a Nginx 34 engine x 34 是一个高性能的 HTTP 和反向代理服务器 xff0c
  • 我所理解的人工智能

    很多人容易把人工智能理解为机器人 机器人是人工智能的一个实际体现 人工智能应用很广泛 下面我来谈谈我的理解 人工智能可分开理解为 人工 和 智能 xff0c 即人类创造出来的智能 xff0c 从广义上来讲只要人类创造出来 xff0c 能为人
  • [Oracle数据库] 存储过程出错 :PLS-00103: 出现符号 "("在需要下列之一时: := . ) , @...

    讨论原因之一 xff1a 我写的简单存储过程如下 xff1a create or replace procedure p c v date in varchar2 200 is t count number begin select cou
  • Android读写properties配置文件

    写这篇文章之前可以成功运行 文章后就各种找不到文件 所以并没有采用此种方式 后期完善 详见下篇解决方案 配置文件读取很容易 修改需要注意权限 比如assets目录下就不允许修改 配置文件的创建 New File 命名后选择propertie
  • el-select数据过多懒加载(loadmore)

    el select数据过多处理方式 在日常项目中el select组件的使用频率是非常之高的 当数据过多时渲染时间非常长 这里提供几个处理方式 远程搜索 组件提供了远程搜索方式 也就是按照你输入的结果匹配选项 官网提供了参考示例 这里不加赘
  • Node连接Mysql遇到的坑以及踩坑总结

    前段时间做的项目中 xff0c 要用到 express 43 mysql 先看看我最初的实现代码 xff1a var conn 61 mysql createConnection host 39 example org 39 user 39
  • Cisco交换机配置新手篇之端口配置

    上回跟大家介绍了 如何正确连接交换机 xff0c 今天用一些配置片段给大家介绍一下端口的配置 鉴于网上大多数配置事例都是show run出来的结果 不利于新手对命令配置过程的了解 xff0c 所以笔者将配置片段和注意的地方都注明了一下 xf
  • 批处理:FOR的参数/F之delims详解

    xff08 三 xff09 delims 61 符号集 分隔符 格式 xff1a FOR F 34 Delims 61 符号集 34 I IN Command1 DO Command2 用法 xff1a 一句话总结 xff1a 忽略分隔符
  • springboot 单元测试 指定启动类

    问题 在做单元测试时 xff0c 写了一个工具类 xff0c 用于注入spring的上下文 public class AppBeanUtil implements ApplicationContextAware private static
  • 多项式系数提取算法 c++

    bool isNumber char s if s gt 61 48 amp amp s lt 61 57 return true else return false bool isLetter char s if s gt 61 97 a