1. 程式人生 > >1010 一元多項式求導 (25 分)

1010 一元多項式求導 (25 分)

思路:可用陣列實現,每兩個為一對,用a[i]表示係數,a[i+1]表示對應的指數,a[i]=a[i]*a[i+1],a[i+1]=a[i+1]-1;

程式碼如下:

#include<iostream>
using namespace std;
int main()
{
	int a[10000],i=0,j=1,n=0;
	char c; 
	while(c!='\n')
	{
		cin>>a[n];
		n++;
		c=getchar();
	}	
	for(i=0;i<n-1;i+=2)
	{
		a[i]=a[i]*a[i+1];
		a[i+1]=a[i+1]-1;
	}
	for(i=0;i<n-1;i+=2,j+=2)
	{
		if((a[0]==0)&&(a[1]==-1)){
			cout<<"0 0";
			break;
		}
		else
		{
			if((a[i+2]!=0)&&(a[j+2]!=-1))
			{
				cout<<a[i]<<" "<<a[j]<<" ";
			}
			else
			{
				cout<<a[i]<<" "<<a[j];
				break;
			}
		}	
	}
	return 0;
}

注意:一定注意輸出格式啊!!!真的有毒,pat測試用例不公開,我第一次提交的時候有一個測試用例不通過,25分只能拿22分,一直猜不到到底哪裡出問題,debug了一下才發現類似這樣的用例:5 3 0 0通不過,最開始的時候並沒有考慮到這種輸入,以為0 0只會作為零多項式的形式輸入,出現兩個0為一組的情況我在最開始就直接把它判斷為零多項式的輸出了,所以導致最後輸出的值一直都是15 2 0 0;正確答案是15 2;之前真的沒想到還能有這種輸入,我自己測試的時候,指數為0的式子,係數也會有值的,就沒考慮到這種,細節決定成敗,確實如此。

#include <iostream>
using namespace std;
int main() {
    int a, b, flag = 0;
    while (cin >> a >> b) {
        if (b != 0) {
            if (flag == 1) cout << " ";
            cout << a * b << " " << b - 1;
            flag = 1;
        }
    }
    if (flag == 0) cout << "0 0";
    return 0;
}

大神的思路:

分析:1.flag用來判斷是否已經有過輸出~
2.當b!=0時,因為給出的是所有非零項係數,所以必定會有輸出,先判斷flag是否為1,如果為1表示已經有過輸出,那麼在前面要先輸出一個空格
3.輸出 a * b 和 b – 1,然後將flag標記為1表示已經有過輸出
4.最後判斷當沒有輸出並且b==0的時候,輸出“0 0”

本渣渣的感想:大神的程式碼還是一如既往地簡單呢(*^▽^*),莫名想哭,這題用陣列解還是太麻煩了,指數和係數是一對沒錯,但其實可以在輸入的時候判斷:a為係數,b為指數,flag為判斷是否輸出過的標誌,直接簡單粗暴地判斷b是否為0,不為0的時候輸出求導之後的值,其中這個flag的作用真的很大,不用寫過多的判斷語句來判斷此時空格是否應該輸入,只需要一個flag引數就可以完成:迴圈內部,最初b!=0,flag==0的話,首先輸出的是a*b空格b-1,注意此時b-1後面是沒有空格的,此時已經有輸入了,flag變成1;    如果再進行迴圈,滿足b!=0條件,此時flag==1,就在上一個b-1的後面加空格;如果flag==1,b=0的話,就不會再進行求導了,最後的那個數字也不會再加空格。然後再是對零多項式的判斷:如果flag==0的話,就證明之前沒有過輸出,直接輸出0 0,如果flag!=0的話,代表有過輸出了,就不是零多項式,這樣的寫法也不會造成像我之前一樣犯的錯誤,將5 3 0 0這樣的式子的輸出弄錯。好贊啊~學習到了

今天也要繼續加油鴨!

今天吃了一個烤雞腿獎勵自己,嗚嗚嗚嗚太好吃了!