标题7-3 一元多项式求导(类设计) (50 分)
注意:仅供参考和交流,抄袭后果自负
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
当输出结果第一项系数符号为“+”时,不输出“+”;
当指数符号为“+”时,不输出“+”;
当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
-2* x^-2+ 5*x^12-4*x+ 12
输出样例1:
在这里给出相应的输出。例如:
4*x^-3+60*x^11-4
输入样例2:
在这里给出一组输入。例如:
2*x^6-0*x^7+5
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
注意:这道题当年是出现了问题,现如今老师可能已经更改了这道题的测试数据,可能导致无法全部通过,但是大致的思路不变,而且认真看代码的话是可以找到那一部分是错误了,加油
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String[] dxs = new String[1000];
long xs[] = new long[1000];
long mi[] = new long[1000];
int x=0;
String s1 ;
s1 = s.replace(" ","");;
String zz1 = "([-+]?\\d*\\*?x(\\^-?\\d*)?)";
Pattern pattern1 = Pattern.compile(zz1);
Matcher matcher1 = pattern1.matcher(s1);
boolean yes = matcher1.find();
while(yes) {
dxs[x]=s1.substring(matcher1.start(), matcher1.end());
x++;
yes = matcher1.find();
}
if(x==0)
{
System.out.print("0");
System.exit(0);
}
for(int i=0;i<x;i++) {
if(dxs[i].contains("*"))
xs[i] = zh(dxs[i]);
else
{
if(dxs[i].charAt(0)=='-')
xs[i]=-1;
else
xs[i]=1;
}
if(dxs[i].contains("^")) {
int a = (dxs[i]).indexOf("^");
String str =dxs[i].substring(a + 1);
mi[i] = zh(str);
}
else
mi[i]=1;
if(xs[i]==0||mi[i]==0){
System.out.print("Wrong Format");
System.exit(0);
}
}
for(int i=0;i<x;i++) {
String z = ss(xs[i],mi[i]);
if(i==0) {
if(mi[i]*xs[i]==1) {
if(mi[i]==1) {
System.out.print("1");
}
else if(mi[i]==2) {
System.out.print("x");
}
else {
System.out.print("x^" + (mi[i]-1));
}
}
else if(mi[i]*xs[i]==-1) {
if(mi[i]==1) {
System.out.print("-1");
}
else if(mi[i]==2) {
System.out.print("-x");
}
else {
System.out.print("-x^" + (mi[i]-1));
}
}
else {
if(mi[i]==1) {
System.out.print(z);
}
else if(mi[i]==2) {
System.out.print(z + "*x");
}
else {
System.out.print(z + "*x^" + (mi[i]-1));
}
}
}
else {
if(mi[i]==1) {
System.out.print(z);
continue;
}
else if(z.charAt(0)=='-')
;
else
System.out.print("+");
if(mi[i]*xs[i]==1) {
if(mi[i]==1) {
System.out.print("1");
}
else if(mi[i]==2) {
System.out.print("x");
}
else {
System.out.print("x^" + (mi[i]-1));
}
}
else if(mi[i]*xs[i]==-1) {
if(mi[i]==1) {
System.out.print("-1");
}
else if(mi[i]==2) {
System.out.print("-x");
}
else {
System.out.print("-x^" + (mi[i]-1));
}
}
else {
if(mi[i]==1) {
System.out.print(z);
}
else if(mi[i]==2) {
System.out.print(z + "*x");
}
else {
System.out.print(z + "*x^" + (mi[i]-1));
}
}
}
}
}
public static long zh(String s) {
long z=0;
if(s.charAt(0)=='+'||s.charAt(0)=='-')
{
for(int i =1;i<s.length();i++)
{
if(i==1&&(s.charAt(1)<'0'||s.charAt(1)>'9')) {
if(s.charAt(0)=='+')
return 1;
else
return -1;
}
if(s.charAt(i)>='0'&&s.charAt(i)<='9')
z = z*10+s.charAt(i)-'0';
else
break;
}
if(s.charAt(0)=='+')
return z;
else
return -z;
}
if(s.charAt(0)<'0'||s.charAt(0)>'9')
return 1;
for(int i =0;i<s.length();i++)
{
if(s.charAt(i)>='0'&&s.charAt(i)<='9')
z = z*10+s.charAt(i)-'0';
else
break;
}
return z;
}
public static String ss(long a,long b) {
int[] a1 = new int [30];
int[] b1 = new int [30];
int[] cj = new int [30];
int js1 = 0 , js2 = 0,js=0;
if(a>0)
;
else
{
a=-a;
js++;
}
if(b>0)
;
else
{
b=-b;
js++;
}
for(int i=0;i<30;i++) {
if(cj[i]>9)
{
cj[i+1] = cj[i+1] + cj[i]/10;
cj[i] = cj[i]%10;
}
}
while(a!=0) {
a1[js1] = (int) (a % 10);
a = a/10;
js1++;
}
for(int i = 0; i<30;i++)
cj[i] = 0;
while(b!=0) {
b1[js2] = (int) (b % 10);
b = b/10;
js2++;
}
for(int i = 0; i < js2;i++) {
for(int j = 0;j < js1;j++) {
cj[j+i] = cj[j+i] + b1[i] * a1[j];
if(cj[j+i]>9)
{
cj[j+i+1] = cj[j+i+1] + cj[j+i]/10;
cj[j+i] = cj[j+i]%10;
}
}
}
int i,j;
if(js%2==0)
{
for(i=29;i>=0&&cj[i]==0;i--);
char[] z = new char[i+1];
for(j=i;j>=0;j--)
z[i-j] = (char) (cj[j] +'0');
String s ;
s = String.valueOf(z);
return s;
}
else
{
for(i=29;i>=0&&cj[i]==0;i--);
char[] z = new char[i+2];
z[0] = '-';
for(j=i;j>=0;j--)
z[i+1-j] = (char) (cj[j] +'0');
String s ;
s = String.valueOf(z);
return s;
}
}
}