华为面试题:一元多项式的化简 C语言实现源码

编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。

说明:

1.多项式由若干个单项式组成,单项式之间为加、减(+,-)关系。

2.单项式指数字与字母幂的乘积构成的代数式。对一元多项式,字母只有一种。

3.同类项合并指将多项式中指数相同的单项式,系数经过加减求和,合并为一个单项式。按指数降序指多项式中,单项式按指数从大到小顺序

相连。

格式说明

一元多项式输入输出时以字符串形式表示,格式如下

l.单项式之间用单个加减运算符相连,运算符:+,-

2.单项式由系数、字母、指数标识符、指数依次直接相连组成,各部分均不能省略。

系数:只由若干0到9数字字符组成(系数不等于0,且不以0开头)

字母:X

指数标识符:^

指数:只由若干0到9数字字符组成(指数可等于0,不等于0时不以0开头)

3.其他约定

输入不为空串,输出若为0则以空串表示

字符串中除以上字符,不包含空格等其他字符,字符串尾部以’\0’结束

多项式中第一个单项式前加运算时省略+符号,减运算时有-符号

注意:输入多项式符合上述格式,无需检查;输出多项式格式由考生程序保证

规格

输入多项式满足如下规格,考生程序无需检查:

–0<单项式系数<=1000<>

–0<=单项式指数<=3000<>

–单项式个数不限制,但同类项合并处理后,单项式的系数小于65535。

示例

输入:

"-7X^4+5X^6-3X^3+3X^3+1X^0"

输出:

"5X^6-7X^4+1X^0"

<=单项式指数<=3000<>

<单项式系数<=1000<>

输入:-7X^5+7X^3+1X^2-7X^3+2X^5

输出:-5X^5+1X^2(要求从高次到低次排序)

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#define MAX_PATH 256

int store[1024] = {0};
int num = 0;
void getStringBeforeString(char *out,char *in,char *subFlag)
{
 char *t = strstr(in,subFlag);
 if(t!=NULL)
 {
  memcpy(out,in,t-in);
 }
 else
 {
  memset(out,0,1);
 }

}

char *getUnit(char *out,char *in,int *pn)
{
 char *position = NULL;
 char tmp1[1024] = {0};
 char tmp2[1024] = {0};
 getStringBeforeString(tmp1,in,"+");
 getStringBeforeString(tmp2,in,"-");
 if (strlen(tmp1)==0 && strlen(tmp2)==0)
 {
  memset(out,0,1);
  return in;
 }
 if (strlen(tmp1)<strlen(tmp2))
 {
  if (strlen(tmp1)!=0)
  {
   memcpy(out,tmp1,strlen(tmp1)+1);
   *pn = 1;//正数
   position = in+(strstr(in,"+")-in)+1;
  }
  else
  {
   memcpy(out,tmp2,strlen(tmp2)+1);
   *pn = 0;//负数
   position = in+(strstr(in,"-")-in)+1;
  }
 }
 else
 {
  if(strlen(tmp2)!=0)
  {
   memcpy(out,tmp2,strlen(tmp2)+1);
   *pn = 0;//负数
   position = in+(strstr(in,"-")-in)+1;
  }
  else
  {
   memcpy(out,tmp1,strlen(tmp1)+1);
   *pn = 1;//正数
   position = in+(strstr(in,"+")-in)+1;
  }
 }
 return position;
}
//准备工作:存入数据,处理数据(矩阵运算:行的元素和列的元素对应积的和),输出
int main()
{
 //输入:
 // "-7X^4+5X^6-3X^3+3X^3+1X^0"
  //输出:
  //"5X^6-7X^4+1X^0"
 char buffer[1024] = {0};
 char out[1024] = {0};
 gets(buffer);
 int pn = 1,pn_next = 1;//记录正负,1为正数
 char *position = buffer;
 //单独处理第一个
 if (*position=='-')
 {
  pn_next = 0;
  pn = pn_next;
  position = position+1;
 }
 while(true)
 {
  memset(out,0,1024);
  position = getUnit(out,position,&pn_next);
  if (strlen(out)==0)
  {
   //处理最后一组
   char *a = strtok(position,"X^");
   char *b = strtok(NULL,"X^");
   if (pn==1)
   {
    store[atoi(b)] += atoi(a);
   }
   else
   {
    store[atoi(b)] -= atoi(a);
   }
   break;
  }
  char *a = strtok(out,"X^");
  char *b = strtok(NULL,"X^");
  if (pn==1)
  {
   store[atoi(b)] += atoi(a);
  }
  else
  {
   store[atoi(b)] -= atoi(a);
  }
  pn = pn_next;
 }
 int headFlag = 0;
 for (int i=1023;i>=0;i--)
 {
  int t = store[i];
  if (t!=0)
  {
   if (t>0)
   {
    if (headFlag==1)
    {
     printf("+");
    }
   }
   printf("%dX^%d",t,i);
   headFlag = 1;
  }

 }
 //store[num++] = atoi(out);
 return 0;
}
时间: 2024-08-10 01:57:30

华为面试题:一元多项式的化简 C语言实现源码的相关文章

JAVA面试题 StringBuffer和StringBuilder的区别,从源码角度分析?

面试官Q1:请问StringBuffer和StringBuilder有什么区别? 这是一个老生常谈的话题,笔者前几年每次面试都会被问到,作为基础面试题,被问到的概率百分之八九十.下面我们从面试需要答到的几个知识点来总结一下两者的区别有哪些? 继承关系? 如何实现的扩容? 线程安全性? 继承关系 从源码上看看类StringBuffer和StringBuilder的继承结构: 从结构图上可以直到,StringBuffer和StringBuiler都继承自AbstractStringBuilder类

高可用的池化 Thrift Client 实现(源码分享)

本文将分享一个高可用的池化 Thrift Client 及其源码实现,欢迎阅读源码(Github)并使用,同时欢迎提出宝贵的意见和建议,本人将持续完善. 本文的主要目标读者是对 Thrift 有一定了解并使用的童鞋,如对 Thrift 的基础知识了解不多或者想重温一下基础知识,推荐先阅读本站文章<和 Thrift 的一场美丽邂逅>. 下面进入正题. 为什么我们需要这么一个组件? 我们知道,Thrift 是一个 RPC 框架体系,可以非常方便的进行跨语言 RPC 服务的开发和调用.然而,它并没有

JUC锁简析(基于源码的详解后续会陆续发出)

张图说明下要分享的内容: 01. Lock接口 JUC包中的 Lock 接口支持那些语义不同(重入.公平等)的锁规则.所谓语义不同,是指锁可是有"公平机制的锁"."非公平机制的锁"."可重入的锁"等等. "公平机制"是指"不同线程获取锁的机制是公平的", 而"非公平机制"则是指"不同线程获取锁的机制是非公平的","可重入的锁"是指同一个锁能够被一个

基于sklearn 实现决策树(含最简代码,复杂源码:预测带不带眼镜)

最简代码: 1 #简单的决策树分类 2 from sklearn import tree 3 features = [[300,2],[450,2],[200,8],[150,9]] 4 labels = ['apple','apple','orange','orange'] 5 clf = tree.DecisionTreeClassifier() 6 clf = clf.fit(features,labels) 7 print(clf.predict([[400,6]])) 预测代码: 数据

华为历年试题(掷骰子游戏 7)

问题描述: 在掷骰子游戏中,会根据所掷数字在地图中前进几步,前进完成后需要根据当前地图位置所示的障碍进行相应操作,其中障碍表示: 1)  9:无障碍 2)  1:停掷一轮,即下轮所掷数字无效: 3)  2:后退两步,如果已经到起点不再后退: 4)  3:奖励前进一步 如果在游戏过程中,已经走到地图终点,则游戏结束.根据输入的地图数组,和5个骰子数的数组,返回最终玩家前进了多少步. 要求实现函数: void dice(int map_len, int* map, int* dice_val, in

卡诺图简单逻辑化简与五变量卡诺图化简

一.格雷码编码规则 画卡诺图的时候需要先将所有变量可能以格雷码的形式排列在方格两侧,所有变量有2^n个,虽然我们常用的变量为四个及以下,可以熟记格雷码,但为了学习还是有必要了解格雷码的编码规则.格雷码的基本特点就是任意两个相邻的代码只有一位二进制数不同,这样在数字电路中变化时每次就只有一位发生变化,提高了电路的稳定性. 规则: 自然二进制数到格雷码: 保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似. 格雷码到自然二进制数

华为上机试题

一.题目描述:通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”. public String stringFilter(String str) { Map<String, Integer> map = new LinkedHashMap<String, Integer>(); String s = ""; for(int i=0

华为历年试题(10约瑟夫环)

约瑟夫环形问题 有30人将其编号,从头开始1,2,3数数,每到3将其删除,一共删去15个数.输出被删去的15个数 #include<iostream> using namespace std; struct LinkList { int val; LinkList* next; LinkList(int a):val(a),next(NULL){} }; LinkList *CreatList(int n) { LinkList *p = new LinkList(1); LinkList *

逻辑函数的化简 【数字电路】

逻辑函数的化简 先补点各种门的 basic knowledge NAND 与非 NOR或非 XOR异或 XNOR 同或 对于同或,异或之前一直没搞明白....那个该死的标记老是混淆,也不知道为嘛标记的发明人为嘛要那么标记 ...现在知道了XOR...所以异或的标记是一个圈中间一把×             化简: 上面预设的ABCD的值输出结果是1 至于化简过程是为嘛...这个就是一步步化简....各种求并消项 切记!不要搞这种傻事! 然后就是另外一个很重要的化简方法--卡诺图 将n变量的全部最