为什么会有输出超限的错误! 快把我逼疯了,求大神们指点, (针对 oj 检测)

sds_buct 2015-09-29 10:45:36
题目描述
一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求积,并输出求积的结果。

输入
输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。 系数和指数均为整数,指数不小于0。

输出
输出为求积结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。 系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。

样例输入
2 5 1 0 -1 -1
5 4 3 0 -1 -1

样例输出
10 9 6 5 5 4 3 0




下面是我写程序:(本人初学,如有发现缺点,请指出)


#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
struct fx
{
int a;
int b;
struct fx *next;
};

struct fx_1
{
int a;
int b;
};

int n; //定义全局变量,用于统计多项式中单项式的数目

struct fx * creat()
{
n=0;
struct fx *head,*p1,*p2;
head=NULL;
p1=p2=(struct fx *)malloc(sizeof(struct fx));
p1->next=NULL;
int x,y;
scanf("%d %d",&x,&y);
if(x!=-1&&y!=-1){
while(x!=-1&&y!=-1){
p1->a=x;
p1->b=y;
n++;
if(head==NULL) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct fx *)malloc(sizeof(struct fx));
scanf("%d %d",&x,&y);
}
p2->next=NULL;
}
return head;
}

void action(struct fx *head1,struct fx *head2,int s1,int s2)
{
int f=0; //标记值,标记计算结果是否为零 ,f=0 表示结果为零,f=1 则反之。
int t; //交换中间变量
int s;

if(s1!=0&&s2!=0) s=s1*s2;
else s=s1+s2;

struct fx *p1,*p2;
struct fx_1 *pn;
pn=(struct fx_1 *)malloc(s*sizeof(struct fx_1));
int i=0;
if(head1!=NULL&&head2!=NULL){
for(p1=head1;p1!=NULL;p1=p1->next){ //计算两个多项式的乘积
for(p2=head2;p2!=NULL;p2=p2->next){
pn[i].a=p1->a*p2->a;
pn[i].b=p1->b+p2->b;
i++;
}
}
for(int j=0;j<s-1;j++) //冒泡法排序,按指数由大到小
for(i=0;i<s-1-j;j++){
if(pn[i].b<pn[i+1].b){
t=pn[i].b;
pn[i].b=pn[i+1].b;
pn[i+1].b=t;
}
}
}

if(head2!=NULL||head1!=NULL){
if(head1!=NULL){
for(p1=head1;p1!=NULL;p1=p1->next){
pn[i].a=p1->a;
pn[i].b=p1->b;
i++;
}
}
if(head2!=NULL){
for(p2=head2;p2!=NULL;p2=p2->next){
pn[i].a=p2->a;
pn[i].b=p2->b;
i++;
}
}
}
if(head2!=NULL||head1!=NULL) //有计算结果时
for(i=0;i<s-1;i++){ //合并同类项
if(pn[i].b==pn[i+1].b){
pn[i].a=pn[i].a+pn[i+1].a;
for(int j=i+1;j<s-1;j++){
pn[j].a=pn[j+1].a;
pn[j].b=pn[j+1].b;
}
s--;
i--;
}
}

if(head2!=NULL||head1!=NULL) //有计算结果时 ,输出结果
for(i=0;i<s;i++){
if(pn[i].a!=0){
printf("%d %d ",pn[i].a,pn[i].b);
f=1; //f=1,表示答案不为零
}
}
if(f==1)
printf("\n");
else
printf("%d",0);
}

int main()
{
int s1,s2;
struct fx *head1,*head2;
head1=creat();
s1=n;
head2=creat();
s2=n;
action(head1,head2,s1,s2);
}
...全文
1124 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sds_buct 2015-09-30
  • 打赏
  • 举报
回复
发帖的时候代码有点变化了,原先程序的输出结果是和题目一样的 void action(struct fx *head1,struct fx *head2,int s1,int s2) 函数中的 if(head2!=NULL||head1!=NULL) 应为 (head2!=NULL&&head1==NULL)||(head1!=NULL&&head2==NULL) 谢谢指出缺点,看来还得慢慢调整,可以说说一般什么情况会引起输出超限吗
赵4老师 2015-09-30
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
ipqtjmqj 2015-09-29
  • 打赏
  • 举报
回复
我把你的程序编译后,用样例输入测试,结果输出是2 5 1 0 5 4 3 0 与样栵输出不同,显然程序有问题。 1. 函数太长,不方便找错误,比如冒泡排序,可以单独写个函数,再如定义中间变量,也可以另一个swap函数。 分解成的每个函数都测试通过,再合起来测试。 2. 变量与新类型命名,尽量全称,不要用a,b,c或出现数字,这样不易理解 3. 除了一元操作符紧贴变量,其他运算符前后加个空格,不要省大括号,注意缩进

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧