PAT乙级 1010 JAVA实现

1010 一元多项式求导 (25 分)
设计函数求一元多项式的导数。(注:x​n​​(n为整数)的一阶导数为nxn−1​​。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0

 

基本思路:

1、设定一个数组e[ ],数组下标为该项指数,值为系数。

2、将读入的一行数字调用trim()函数去掉此行字符串首尾的空格,然后用split("\\s+")根据空格将字符串分隔,并存入一个字符串数组num[ ]

3、用for循环依次根据字符串数组给e[ ]数组的下标和值赋值。这里要注意的是:(1)因为一行字符串中,输入格式是“系数  指数”这样对应的,所以for循环中,i每次加2,num[i]就是e[ ] 的下标,num[i+1]就是e[ ]的值.(2)e[ ]数组的下标和值都是整数,所以要将字符串数组num[ ] 中的字符转为数字

4、求导时,还是在e[ ]数组中进行,无需再开辟额外数组空间。指数为 i 的项对应的系数为e[i] ,该项求导后,指数为i-1,系数为e[i]*i ,所以e[i-1]的值为e[i]*i ,

5、将数组逆序输出e[i] !=0 时的下标i 和对应的值e[i] ,即为求导后的系数和指数

代码如下:

package pat;

import java.util.Scanner;

public class B1010three {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String[] num = sc.nextLine().trim().split("\\s+");
		int e[] = new int[1001];
		for (int i = 0; i < num.length; i += 2) {
			int m = Integer.parseInt(num[i]);// 系数
			int n = Integer.parseInt(num[i + 1]);// 指数
			e[n] = m;

		}
		// 特殊考虑0次项
		e[0] = 0;
		// 求导
		int count = 0;
		for (int i = 1; i < 1000; i++) {
			e[i - 1] = e[i] * i;
			e[i] = 0;
			if (e[i - 1] != 0) {
				// 计不为0 的导数项个数
				count++;
			}
		}
		if (count == 0) {
			System.out.println("0 0");
		} else {
			// 按照指数从高到低的顺序输出
			for (int j = 1000; j >= 0; j--) {
				if (e[j] != 0) {
					System.out.print(e[j] + " ");
					System.out.print(j);
					count--;
					if (count != 0)
						System.out.print(" ");
				}
			}
		}

	}

}

 

你可能感兴趣的:(PAT)