txt文件里面的多项式处理~解决思路
txt文件里面的多项式处理~~
现在txt文件有一个多元多项式, 3200*v45^6*v47^3 + 1876*v45^4*v47^6 + 3560*v45^5*v47^5 + 1120*v45^6*v47^4 + 272*v45^5*v47^6 + 208*v45^6*v47^5 + 16*v45^6*v47^6 + 2071387*v45^2*v48^2 + 1977269*v46^2*v47^2 + 725403*v45^2*v48^3 + 893531*v45^3*v48^2
想要把其中的系数为偶数的项去掉(奇数项保留),应该怎么做?
最后应该得到是 2071387*v45^2*v48^2 + 1977269*v46^2*v47^2 + 725403*v45^2*v48^3 + 893531*v45^3*v48^2 写回txt里面
可以考虑用模2
------解决方案--------------------
struct Poly{
int m_nK;
std::string m_X;
int m_nPower;
Poly* m_pNext;
}
typedef Poly* PolyList;
读取多项式,放在这个连表里,然后遍历将m_nk为偶数的delete掉,然后将剩余链表写回
------解决方案--------------------
一个简单高效的实现:
------解决方案--------------------
字符挺有规律的,C++做的话,可以对Poly重载istream& operator>>和ostream& operator<<,轻轻松松
现在txt文件有一个多元多项式, 3200*v45^6*v47^3 + 1876*v45^4*v47^6 + 3560*v45^5*v47^5 + 1120*v45^6*v47^4 + 272*v45^5*v47^6 + 208*v45^6*v47^5 + 16*v45^6*v47^6 + 2071387*v45^2*v48^2 + 1977269*v46^2*v47^2 + 725403*v45^2*v48^3 + 893531*v45^3*v48^2
想要把其中的系数为偶数的项去掉(奇数项保留),应该怎么做?
最后应该得到是 2071387*v45^2*v48^2 + 1977269*v46^2*v47^2 + 725403*v45^2*v48^3 + 893531*v45^3*v48^2 写回txt里面
可以考虑用模2
------解决方案--------------------
struct Poly{
int m_nK;
std::string m_X;
int m_nPower;
Poly* m_pNext;
}
typedef Poly* PolyList;
读取多项式,放在这个连表里,然后遍历将m_nk为偶数的delete掉,然后将剩余链表写回
------解决方案--------------------
一个简单高效的实现:
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#define ITEM_COUNT (32)
#define ITEM_LEN (81)
int isodd(char ch)
{
return ch == '1'
------解决方案--------------------
ch == '3'
------解决方案--------------------
ch == '5'
------解决方案--------------------
ch == '7'
------解决方案--------------------
ch == '9';
}
int main(int argc, char* argv[])
{
FILE* file;
char items[ITEM_COUNT][ITEM_LEN];
char last_char;
int count = 0;
int len = 0;
int state = 0;
char ch;
int i;
if((file = fopen("poly.txt", "rt")) == NULL)
return -1;
while(!feof(file))
{
ch = fgetc(file);
switch(state)
{
case 0:
if(isdigit(ch))
{
items[count][len++] = ch;
state++;
}
break;
case 1:
if(isdigit(ch))
{
items[count][len++] = ch;
}
else
{
if(!isodd(items[count][len - 1]))
state = 0xff;
else
{
items[count][len++] = ch;
state++;
}
}
break;
case 2:
if(isspace(ch))
{
items[count][len] = '\0';
count++;
len = 0;
state = 0;
}
else
items[count][len++] = ch;
break;
case 0xff:
if(isspace(ch))
{
len = 0;
state = 0;
}
break;
default:
break;
}
}
fclose(file);
if((file = fopen("poly.txt", "wt")) == NULL)
return -1;
for(i = 0; i < count; i++)
{
if(i < count - 1)
fprintf(file, "%s + ", items[i]);
else
fprintf(file, "%s", items[i]);
}
fclose(file);
return 0;
}
------解决方案--------------------
字符挺有规律的,C++做的话,可以对Poly重载istream& operator>>和ostream& operator<<,轻轻松松