May 05, 2020
문제
다항식(polynomial)은 문자의 거듭제곱의 상수 배들의 합을 표현하는 수식이다. 예를 들어 x2+2x+3 같은 식을 의미한다. 그중 변수가 하나인 것을 일변수 다항식이라고 하고 이는 다음과 같이 표현한다.
f(x) = axn + bxn-1+...+cx+d
최대 일차 일변수 다항식이 주어졌을 때 그 함수를 적분한 결과를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 최대 일차 일변수 다항식이 주어진다. 항의 개수는 최대 2개이고, 변수는 항상 x로 주어지며, 각 항은 공백 문자로 구분되지 않는다. 주어지는 계수는 절댓값이 10,000을 넘지 않는 0이 아닌 2의 배수이고 주어지는 상수는 절댓값이 10,000을 넘지 않는 정수이다. 차수가 같은 항은 한 번만 주어진다. 단, 계수의 절댓값이 1인 경우에는 1을 생략한다. 다항식은 차수가 큰 것부터 작아지는 순서대로 주어진다.
출력
주어진 일변수 다항식을 적분한 결과를 입력 형식과 동일하게 출력한다. 적분상수는 "W"로 x2은 "xx"로 표현한다.하 진짜 개빡치는 문제…어렵진 않은데 처리해줘야되는게 너무 많다..문자열을 가운데 있는 연산자를 기준으로 두개로 나누어서 각각 적분식에 따라 처리해주고 마지막에 적분상수 W를 붙여주어 해결했다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main (){
string poly;
cin >> poly;
vector<string> tokens;
while(!poly.empty()){
int end;
string token;
for (end = 1 ; end < poly.size() ; end++){
if (poly[end] == '-' || poly[end] == '+') break;
}
token = poly.substr(0, end);
tokens.push_back(token);
poly.erase(0, end);
}
string result;
string op = "";
for (auto s : tokens){
//cout << s << endl;
if (stoi(s) == 0) {
if (s.size() == 2) op.push_back(s[0]);
break;
}
string num;
size_t p = s.find("x");
if (p != string::npos) {
num = s.substr(0, p);
int n = stoi(num)/2;
if (abs(n) != 1)result += to_string(n);
else if (n < 0) result += "-";
result += "xx";
}
else{
num = s;
if (num.compare("+1") && num.compare("-1")) result += (num+"x+");
else {
result.push_back(num[0]);
result += "x+";
}
}
}
if (result.back() != '+' && result.size() > 1) result += "+";
if (!op.empty()) {
result.pop_back();
result += (op + "W");
}
else result += "W";
cout << result << endl;
}