news 2026/4/16 9:18:39

UVa 126 The Errant Physicist

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 126 The Errant Physicist

题目概述

著名物理学家Alfred E Neuman\texttt{Alfred E Neuman}Alfred E Neuman在处理涉及xxxyyy多项式乘法的问题时经常出错,导致核弹头提前引爆,摧毁了五座大城市和几片雨林。
你的任务是编写一个程序,正确计算两个多项式的乘积,以避免进一步的灾难。

输入

  • 输入数据包含若干对行,每行最多包含808080个字符。
  • 最后一行的第一个字符是#,表示输入结束。
  • 每行输入一个没有空格、没有显式乘方运算符的多项式。
  • 指数为正非零无符号整数,系数为整数(可为负)。
  • 指数和系数的绝对值均不超过100100100
  • 每一项最多包含一个xxx因子和一个yyy因子。

输出

  • 对于每一对多项式,计算乘积并输出两行:第一行输出指数,第二行输出对应的项。
  • 两行长度相等,较短的末尾用空格补齐。
  • 输出格式需满足以下规则:
    1. 项按xxx的降序排列,xxx相同时按yyy的升序排列。
    2. 同类项合并。
    3. 系数为零的项不输出。
    4. 系数为111时省略(常数项111除外)。
    5. 指数为111时省略。
    6. x0x^0x0y0y^0y0因子省略。
    7. 项间的加减号前后各有一个空格。
    8. 首项系数为负时,第一列输出负号,无空格;否则从第一列开始输出系数。

解题思路

本题的核心是多项式乘法的模拟与格式化输出。我们可以将问题分解为以下几个步骤:

  1. 解析输入
    将每行输入按+-拆分为单独的项。由于输入没有空格,且可能以正号或负号开头,我们需要为每项补上符号以便后续处理。

  2. 解析单项式
    对于每一项,需要提取出:

    • 符号(正或负)
    • 系数(整数)
    • xxx的指数(默认为000
    • yyy的指数(默认为000

    注意系数可能省略(即为111),指数也可能省略(即为111)。解析时需要处理这些情况。

  3. 多项式乘法
    使用二维数组coefficients[i][j]表示xiyjx^i y^jxiyj项的系数。
    遍历第一个多项式的每一项和第二个多项式的每一项,计算它们相乘后的系数,并累加到对应位置。

  4. 格式化输出
    输出分为两行:

    • 第一行输出指数,即每个项的xxxyyy的指数,按规则对齐。
    • 第二行输出具体的项(包括系数、变量和符号)。

    输出时需按xxx降序、yyy升序遍历coefficients数组。对于每个非零系数项:

    • 处理符号(首项特殊处理)
    • 输出系数(注意省略111
    • 输出xxxyyy(注意指数为111时省略)
    • 确保两行对齐,指数和变量位置对应
  5. 对齐处理
    由于第一行只输出数字,第二行输出变量和符号,为了保证两行等长且对齐,需要计算每个数字占用的宽度,并在输出时用空格补齐。

代码实现

// The Errant Physicist// UVa ID: 126// Verdict: Accepted// Submission Date: 2020-05-08// UVa Run Time: 0.000s//// 版权所有(C)2020,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;#defineMAXN210intcoefficients[MAXN][MAXN];intpart1[4],part2[4];voidgetItem(vector<string>&c,string line){if(line[0]!='-'&&line[0]!='+')line='+'+line;while(true){intplusIndex=line.rfind('+');intminusIndex=line.rfind('-');if(plusIndex>=0||minusIndex>=0){c.push_back(line.substr(max(plusIndex,minusIndex)));line=line.substr(0,max(plusIndex,minusIndex));}elsebreak;}}intgetExponent(string&item,charnext){intexponent=0,haveExponent=0;item=item.substr(1);while(item.length()&&item[0]!=next){haveExponent=1;exponent=exponent*10+item[0]-'0';item=item.substr(1);}if(!haveExponent)exponent=1;returnexponent;}voidgetPart(string item,intpart[]){// 解析符号。part[0]=(item[0]=='-'?-1:1);if(item[0]=='+'||item[0]=='-')item=item.substr(1);// 获取系数。intcoefficient=0;inthaveDigit=0;while(item.length()&&item[0]>='0'&&item[0]<='9'){haveDigit=1;coefficient=coefficient*10+item[0]-'0';item=item.substr(1);}part[1]=(haveDigit==0?1:coefficient);// 获取指数。if(item.length()){charstart=item[0];intexponent1=0,exponent2=0;if(start=='x'||start=='y'){charnext=(start=='x'?'y':'x');exponent1=getExponent(item,next);if(item.length()>0)exponent2=getExponent(item,next);}part[2]=start=='x'?exponent1:exponent2;part[3]=start=='x'?exponent2:exponent1;}}// 将两个项目相乘。voidmultiply(string term1,string term2){memset(part1,0,sizeof(part1));memset(part2,0,sizeof(part2));getPart(term1,part1);getPart(term2,part2);coefficients[part1[2]+part2[2]][part1[3]+part2[3]]+=part1[0]*part1[1]*part2[0]*part2[1];}stringspace(intn){stringstream ss;string line;ss<<n;ss>>line;returnstring(line.length(),' ');}voidoutput(boolprintExponent,intn){if(printExponent)cout<<n;elsecout<<space(n);}boolprint(boolprintExponent){boolfirstItemPrinted=false;for(inti=200;i>=0;i--)for(intj=0;j<=200;j++)if(coefficients[i][j]!=0){if(firstItemPrinted==false){if(coefficients[i][j]<0)cout<<(printExponent?" ":"-");firstItemPrinted=true;}else{cout<<" ";cout<<(printExponent?" ":((coefficients[i][j]>0)?"+":"-"));cout<<" ";}if(fabs(coefficients[i][j])>1)output(!printExponent,fabs(coefficients[i][j]));elseif(i==0&&j==0)cout<<(printExponent?" ":"1");if(i>0)cout<<(printExponent?" ":"x");if(i>1)output(printExponent,i);if(j>0)cout<<(printExponent?" ":"y");if(j>1)output(printExponent,j);}returnfirstItemPrinted;}intmain(intac,char*av[]){string line;vector<string>polynomial1,polynomial2;while(getline(cin,line),line!="#"){polynomial1.clear();polynomial2.clear();getItem(polynomial1,line);getline(cin,line);getItem(polynomial2,line);memset(coefficients,0,sizeof(coefficients));for(inti=0;i<polynomial1.size();i++)for(intj=0;j<polynomial2.size();j++)multiply(polynomial1[i],polynomial2[j]);print(true);cout<<'\n';boolflag=print(false);if(!flag)cout<<0;cout<<'\n';}return0;}

总结

本题主要考察字符串解析、多项式乘法模拟和格式化输出。需要注意的细节非常多,尤其是输出格式的严格要求。通过合理设计数据结构和遍历顺序,可以高效地完成计算和输出。代码中使用二维数组存储系数,解析函数提取每项信息,乘法过程累加系数,最后按规则输出两行,确保对齐。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 1:52:08

5大核心功能全面解析Zotero元数据格式化的完整教程

5大核心功能全面解析Zotero元数据格式化的完整教程 【免费下载链接】zotero-format-metadata Linter for Zotero. An addon for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item languages, etc; d…

作者头像 李华
网站建设 2026/4/13 6:49:51

Fillinger脚本:Illustrator智能填充的完整使用指南

Fillinger脚本&#xff1a;Illustrator智能填充的完整使用指南 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为复杂的图形填充而头疼吗&#xff1f;Fillinger脚本是Adobe Ill…

作者头像 李华
网站建设 2026/4/16 9:18:03

阿里通义Z-Image-Turbo商业变现指南:从快速搭建到盈利模式的全解析

阿里通义Z-Image-Turbo商业变现指南&#xff1a;从快速搭建到盈利模式的全解析 AI图像生成技术正在改变创意产业的游戏规则&#xff0c;而阿里通义Z-Image-Turbo作为一款高性能的商业化AI图像生成工具&#xff0c;为创业者提供了快速验证市场需求的利器。本文将带你从零开始&am…

作者头像 李华
网站建设 2026/4/16 9:07:12

阿里通义Z-Image-Turbo跨平台集成:移动端调用云端AI服务实战

阿里通义Z-Image-Turbo跨平台集成&#xff1a;移动端调用云端AI服务实战 作为一名移动应用开发者&#xff0c;你是否遇到过这样的困境&#xff1a;想要在应用中集成AI图像生成功能&#xff0c;但又担心模型在手机端运行效果不佳&#xff1f;本地部署不仅占用大量存储空间&#…

作者头像 李华
网站建设 2026/4/15 10:07:19

终极指南:在英特尔集成显卡上优化Z-Image-Turbo推理性能

终极指南&#xff1a;在英特尔集成显卡上优化Z-Image-Turbo推理性能 作为一名嵌入式开发者&#xff0c;你是否遇到过这样的困境&#xff1a;想要在资源受限的边缘设备上部署图像生成模型&#xff0c;却担心性能不足&#xff1f;本文将手把手教你如何利用英特尔集成显卡和OpenV…

作者头像 李华
网站建设 2026/4/16 9:07:44

keysound终极配置指南:让Linux键盘声音焕然一新

keysound终极配置指南&#xff1a;让Linux键盘声音焕然一新 【免费下载链接】keysound keysound is keyboard sound software for Linux 项目地址: https://gitcode.com/gh_mirrors/ke/keysound keysound是一款专为Linux系统设计的键盘音效软件&#xff0c;通过简单的配…

作者头像 李华