華爲面試題:一元多項式的化簡 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;
}


 

發佈了52 篇原創文章 · 獲贊 40 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章