| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2356 人关注过本帖
标题:一元多项式求导,为什么负数放进去会出错?恳请指导,谢谢!
只看楼主 加入收藏
wzhe800
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-9-26
结帖率:80%
收藏
已结贴  问题点数:10 回复次数:6 
一元多项式求导,为什么负数放进去会出错?恳请指导,谢谢!
1010. 一元多项式求导 (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)

输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。

输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0




自己的代码如下:
#include<stdio.h>
#include<math.h>
int main(){
    int m[1000],xis,zs;                               //m数组用来存放输入的数,xis为输出的系数,zs为输出的指数
    char a;
    for(int i=0;(a=getchar())!='\n';){
        if(a!=' '){                               //跳过空格
        a=a-'0';
        m[i]=a;
        i++;
        }
        if(a=='-'){                            //当输入的数为负数的情况
            a=getchar();
            a=a-'0';
            m[i]=a*(-1);
            i++;
            }
        }
    m[i]=1001;                                      //为下面的循环设定一个结束条件
    for(i=0;m[i]!=1001;i=i+2){
        if(m[i+1]!=0){                              //指数为零时不输出
        xis=m[i]*m[i+1];
        zs=m[i+1]-1;
        if(m[i+2]==1001){printf("%d %d",xis,zs);}    //最后一个指数后面没有空格
        else printf("%d %d ",xis,zs);
        }//if
        }//for
    return 0;
}



将3和4代进去是对的。可一代入负数就出错。  可我感觉负数那块地方按我的逻辑是对的啊。。
恳请有心人帮忙指点一下,谢谢了!!!
搜索更多相关主题的帖子: 绝对值 多项式 
2016-02-02 21:53
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
不知道“注意“零多项式”的指数和系数都是0,但是表示为“0 0””这句话是何目的,是输入可能为零多项式呢,还是输出至少零多项式

程序代码:
#include <stdio.h>

int main( void )
{
    for( int i=0, a,b; scanf("%d%d",&a,&b)==2 && b!=0; ++i )
        printf( "%s%d %d", " "+(i==0), a*b, b-1 );
    // 注意“零多项式”的指数和系数都是0,但是表示为“0 0”
    // if( i==0 ) printf( "%s", "0 0" );

    return 0;
}

2016-02-03 08:55
wzhe800
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-9-26
收藏
得分:0 
回复 2楼 rjsp
我也不明白这句话。。
2016-02-03 20:18
wzhe800
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-9-26
收藏
得分:0 
回复 2楼 rjsp
你真的好厉害。。这么几行就搞定了
2016-02-03 20:20
wzhe800
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-9-26
收藏
得分:0 
回复 楼主 wzhe800
请问一下
scanf("%d%d",&a,&b)==2   是什么意思?  是有输入两个数的意思吗

还有
printf( "%s%d %d", " "+(i==0), a*b, b-1 );这个里面

这是怎么实现“数字间以空格分隔,但结尾不能有多余空格”的啊。。表示太高端看不懂。。
按我的理解,如果这样输出的话,第一个系数前面不就有空格了吗?
因为我看不懂 " "+(i==0)

TAT
2016-02-03 20:27
杭01
Rank: 3Rank: 3
来 自:广州
等 级:论坛游侠
威 望:1
帖 子:29
专家分:132
注 册:2016-2-11
收藏
得分:0 
回复 5楼 wzhe800
我说下我的理解罢:
1.
请问一下
scanf("%d%d",&a,&b)==2   是什么意思?  是有输入两个数的意思吗

是的。
scanf 函数是有返回值的,它的返回值可以分成三种情况
  1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);
      如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
      如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
  2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
  3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。

2.
还有
printf( "%s%d %d", " "+(i==0), a*b, b-1 );这个里面

这是怎么实现“数字间以空格分隔,但结尾不能有多余空格”的啊。。表示太高端看不懂。。
按我的理解,如果这样输出的话,第一个系数前面不就有空格了吗?
因为我看不懂 " "+(i==0)


TAT
先看后面的
+(i==0)
可以改写为;
程序代码:
if (i == 0) {
    +1;
} else {
    +0;
}
于是整句话可以改写为:
程序代码:
if (i == 0) {
    " "+1;
} else {
    " "+0;
}
继续改写,把" "拿出来:
程序代码:
char s[] = " ";
if (i == 0) {
    s+1;
} else {
    s+0;
}
C语言对会给双引号加上一个
'\0'
于是我们可以继续改写,把s换成数组的形式:
程序代码:
char s[] = {
    ' ',
    '\0'
};

if (i == 0) {
    s+1;
} else {
    s+0;
}
由于数组中
a[i] == a+i
我们可以把指针运算改成下标形式:
程序代码:
if (i == 0) {
    s[1];
} else {
    s[0];
}
替换成数组的值:
程序代码:
if (i == 0) {
    '\0';
} else {
    ' ';
}
这就是我们想要的结果了:如果i为0不输出,否则输出一个空格

准备中考中,有事请Email :)

Email: huihan9 AT qq DOT com
QQ: 2672286148
cnblogs: jt2001
2016-02-13 14:10
wzhe800
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-9-26
收藏
得分:0 
回复 6楼 杭01
太谢谢了~非常详细,赞!
2016-02-13 21:15
快速回复:一元多项式求导,为什么负数放进去会出错?恳请指导,谢谢!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017112 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved