设计函数求一元多项式的导数。
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
代码1:
#include<iostream>
using namespace std;
int main() {
int a, b, flag = 0;
while (scanf("%d %d", &a, &b) == 2 && b != 0) {
if (flag++)cout << " ";
cout << a * b-- << " " << b;
}
if (!flag)cout << "0 0";//考虑这个特殊情况
return 0;
}
代码2:
#include<stdio.h>
int main()
{
int m, n, flag = 1;
while (scanf("%d%d", &m, &n) != EOF)
{
if (n > 0)
{
if (flag == 1)
{
printf("%d %d", m * n, n - 1);
flag = 0;
}
else
{
printf(" %d %d", m * n, n - 1);
}
}
}
if (flag == 1)
printf("0 0");
return 0;
}
代码3:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int e,c,m=0,n=0;
int a[100];
int b[100];
while(1)
{
scanf("%d %d",&e,&c);
if((fabs(e)<=1000)&&(fabs(c)<=1000)&&c!=0)
{
a[m]=e*c;
b[m]=c-1;
m++;
}
if(getchar()=='\n') //输入数据结束标志,这点刚开始没想到
break;
else
continue;
}
if(m==0)//判断是否有零多项式;
{
printf("0 0");
}
for(n=0;n<m;n++)
{
if(n==0)
printf("%d %d",a[0],b[0]);
else
printf(" %d %d",a[n],b[n]);
}
return 0;
}
这道题对我来说,难度在于如何输入数据(基础不好)QAQ
,看代码1时,我查了一下scanf函数:
scanf的用法
scanf从缓冲区读取数据,每次读取一个数据,如果缓冲区中无内容,则出现堵塞,在运行窗口要求用户输入;
scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。
且返回值为int型
scanf()函数返回成功读取的项数。
如果没有读到任何项,且需要读取一个数字而用户却输入一个非数值字符串,这时scanf()便返回0。
当scanf()检测到“文件结尾”时,会返回EOF(EOF是stdio.h 中定义的特殊值,通常宏定义为-1)。
详细可以看这个:
C语言输入/输出(scanf(),printf())的返回值
原来scanf函数是有返回值的。
所以我们可以用scanf函数的返回值来判断是否输入结束。
代码1中,判断是否输入结束用这个条件:
while (scanf("%d %d", &a, &b) == 2 && b != 0)
代码2中的条件是:
while (scanf("%d%d", &m, &n) != EOF)
a是系数,b是指数,由于数据的输入就是成对输入的。
代码3的结束是:
while(1)
{
scanf("%d %d",&e,&c);
if((fabs(e)<=1000)&&(fabs(c)<=1000)&&c!=0)
{
a[m]=e*c;
b[m]=c-1;
m++;
}
if(getchar()=='\n') //输入数据结束标志,这点刚开始没想到
break;
else
continue;
}