2018-6-29-PTA-6-2-多项式求值
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
PTA 6-2 多项式求值
|
lindexi
|
2018-06-29 15:24:28 +0800
|
2018-6-14 22:0:41 +0800
|
C 算法
|
本题要求实现一个函数
本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式$f(x)=\sum_{i=0}^{n}(a[i]\times x^i)$在x点的值。
函数接口定义
double f( int n, double a[], double x );
其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。
裁判测试程序样例
#include <stdio.h> #define MAXN 10 double f( int n, double a[], double x ); int main()
{
int n, i;
double a[MAXN], x; scanf("%d %lf", &n, &x);
for ( i=0; i<=n; i++ )
scanf(“%lf”, &a[i]);
printf("%.1f\n", f(n, a, x));
return 0;
} /* 你的代码将被嵌在这里 */
输入样例
2 1.1
1 2.5 -38.7
输出样例
-43.1
可通过代码
double f(int n, double a[], double x)
{
double sum = 0;
// 如果这时的 n 大于最大的数值,就返回比他小 1 的值
if (n >= MAXN)
{
n = MAXN - 1;
} // 这个值用来做中间的计算,也就是计算 x 的中间计算
// 为什么 temp 默认值会是 1 ? 原因就是无论多大的数
// 100000000^0 等于 1 double temp = 1; for (int i = 0; i <= n; i++)
{
// 第 1 次 是 x^0 刚好就是现在 temp 的值
sum = sum + a[i] * temp;
// 进行第 2 次计算 x^1 = x = temp * x
temp = temp * x;
} return sum;
} /*
// 里面存在x的多少次方,就需要重新定义一个函数来写,如果直接写在代码,代码很不好看
// 但是因为有时间的限制,所以不能使用这个方式,这个方式是每个 x 都需要重新计算多少次方
// 而比较快的方式是下一次的计算使用上一次计算的结果
// 在工程的开发,要尽量避免这种优化
// 但是在写题目到是可以这样考虑
// 每次计算的 x 的方都比原来的大 1 次,也就是我第 2 次的计算可以用到第 1 次计算的结果
double Pow(double x, int count)
{
double sum = x; // 任何一个数的0次都是等于多少?
if (0 == count)
{
// 100000000^0
return 1;
} // 这里使用 i = 1 因为这里的值默认 sum 就是等于 x
// 如输入 x^2 那么就是 x = x count = 2
// 如果这里的 i = 0 开始就会首先设置 sum = x;
// sum 会循环两次,于是返回 x^3 和需要的不一样
for (int i = 1; i < count; i++)
{
//sum = sum * x;
sum *= x;
} return sum;
} double f(int n, double a[], double x)
{
double sum = 0;
if (n >= MAXN)
{
n = MAXN - 1;
} for (int i = 0; i <= n; i++)
{
sum = sum + a[i] * Pow(x, i);
} return sum;
} */
考点:
大概的输入
是否可以在下一次运算使用上一次的值
阅读题目能力
第2个考点是有些问题,如果比较会设计的小伙伴,就会写出我注释的代码
在工程使用是建议使用被注释的代码,但是被注释的代码会多了一次循环,于是会运行超时
第3个考点在于一开始的 n 的值,i <= n的循环和 i < n 的循环次数不相同
另外for (int i = 0; i < n; i++)和for (int i = 1; i < n; i++)的循环次数也不相同,都是相差 1 ,在于初始化 i 的大小和判断循环。
因为 PTA 没有告诉说代码的输出是什么,而且输出在哪里出错了,所以对于初学者还是比较难的,很多很难知道自己的程序在哪错了。一个建议是使用 CodeBlock 进行调试或者 VisualStudio 调试。
两个调试是不相同,可以看到 CodeBlock 支持比较简单的程序,而且使用也很简单。比较推荐简单的代码使用 CodeBlock ,如果训练的要求是实际使用,那么建议使用 VisualStudio 。可以从安装的时候看到 VisualStuio 很大,而且开始部署环境也是比较困难。但是 VisualStudio 可以开发几乎任何的软件。
下载CodeBlock请到官网:Download binary
下载 VisualStudio 请到官网 Visual Studio
在部署完成VisualStudio 之后,可以使用我修改的代码运行。需要注意在 VisualStduio 需要使用 scanf_s 替换scanf,其他几乎不需要修改。
下面的代码复制之后就可以在 VisualStudio 运行调试,注意 VisualStudio
// JisnaicasManawashar.cpp: 定义控制台应用程序的入口点。 #include "stdafx.h" #define MAXN 10 double f(int n, double a[], double x); int main()
{
int n, i;
double a[MAXN], x; //scanf("%d %lf", &n, &x);
//for (i = 0; i <= n; i++)
// scanf("%lf", &a[i]); n = 2;
x = 1.1;
//1 2.5 -38.7
a[0] = 1;
a[1] = 2.5;
a[2] = -38.7; printf("%.1f\n", f(n, a, x));
return 0;
} double f(int n, double a[], double x)
{
double sum = 0;
// 如果这时的 n 大于最大的数值,就返回比他小 1 的值
if (n >= MAXN)
{
n = MAXN - 1;
} // 这个值用来做中间的计算,也就是计算 x 的中间计算
// 为什么 temp 默认值会是 1 ? 原因就是无论多大的数
// 100000000^0 等于 1 double temp = 1; for (int i = 0; i <= n; i++)
{
// 第 1 次 是 x^0 刚好就是现在 temp 的值
sum = sum + a[i] * temp;
// 进行第 2 次计算 x^1 = x = temp * x
temp = temp * x; // 第1次 sum = 1
// 第2次 sum = 3.75
// 第3次 sum = -43.1
} return sum;
} /*
// 里面存在x的多少次方,就需要重新定义一个函数来写,如果直接写在代码,代码很不好看
// 但是因为有时间的限制,所以不能使用这个方式,这个方式是每个 x 都需要重新计算多少次方
// 而比较快的方式是下一次的计算使用上一次计算的结果
// 在工程的开发,要尽量避免这种优化
// 但是在写题目到是可以这样考虑
// 每次计算的 x 的方都比原来的大 1 次,也就是我第 2 次的计算可以用到第 1 次计算的结果
double Pow(double x, int count)
{
double sum = x; // 任何一个数的0次都是等于多少?
if (0 == count)
{
// 100000000^0
return 1;
} // 这里使用 i = 1 因为这里的值默认 sum 就是等于 x
// 如输入 x^2 那么就是 x = x count = 2
// 如果这里的 i = 0 开始就会首先设置 sum = x;
// sum 会循环两次,于是返回 x^3 和需要的不一样
for (int i = 1; i < count; i++)
{
//sum = sum * x;
sum *= x;
} return sum;
} double f(int n, double a[], double x)
{
double sum = 0;
if (n >= MAXN)
{
n = MAXN - 1;
} for (int i = 0; i <= n; i++)
{
sum = sum + a[i] * Pow(x, i);
} return sum;
} */
<script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML">
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script>
2018-6-29-PTA-6-2-多项式求值的更多相关文章
- PTA 6-2 多项式求值
PTA 6-2 多项式求值 本题要求实现一个函数 本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑i=0n(a[i]×xi)" role=" ...
- 多项式求值问题(horner规则)——Python实现
# 多项式求值(Horner规则) # 输入:A[a0,a1,a2...an],x的值 # 输出:给定的x下多项式的值p # Horner迭代形式实现 1 # 在此修改初值 2 A = [2, 6 ...
- PTA之多项式求值
时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: double f( int n, double a[], double x ); 其中n是多项式的阶数,a[]中 ...
- PTA基础编程题目集6-2多项式求值(函数题)
本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑i=0n(a[i]×xi) 在x点的值. 函数接口定义: double f( int n, dou ...
- 多项式求值 n维多项式 Horner解法
#include<iostream> using namespace std; template<class T> T ploy(T *coeff,int n,const T& ...
- C006:多项式求值 horner法则
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { float x; do{ printf("E ...
- 多项式函数插值:多项式形式函数求值的Horner嵌套算法
设代数式序列 $q_1(t), q_2(t), ..., q_{n-1}(t)$ ,由它们生成的多项式形式的表达式(不一定是多项式): $$p(t)=x_1+x_2q_1(t)+...x_nq_1(t ...
- 2018.12.30 洛谷P4238 【模板】多项式求逆
传送门 多项式求逆模板题. 简单讲讲? 多项式求逆 定义: 对于一个多项式A(x)A(x)A(x),如果存在一个多项式B(x)B(x)B(x),满足B(x)B(x)B(x)的次数小于等于A(x)A(x ...
- 记2018/4/29 qbxt 测试
记 2018/4/29 qbxt 测试(提高基础班) 简单的 NOIP 模拟赛 竞赛时间: 2018 年 4 月 29 日 13:30-17:00 题目名称 乘法 求和 计数 输入文件名 mul.i ...
随机推荐
- Web.xml详解(转)(Filter,context,listener)
web.xml 详细解释!!(链接) web.xml加载过程(步骤) 首先简单说一下,web.xml的加载过程. 当我们去启动一个WEB项目时,容器包括(JBoss.Tomcat等)首先会读取项目we ...
- Linux的登录和退出
Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统,使用完系统后,必须退出系统. 本章主要讨论登录和退出系统的方法: 用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经 ...
- day39-Spring 12-Spring的JDBC模板:快速入门
Spring AOP的关键是它的底层的原理和思想,配置和使用并不是十分困难.AOP本身就是一个思想,是面向对象的延伸,不是用来替换面向对象的,而是用来解决面向对象中的一些问题的.在最初的时候提出过一个 ...
- oracle-Nomount
启动实例但不安装数据库,当数据库以这个模式启动时,参数文件被读取,后台进程和内存结构被启动,但他们不被附加或与数据库的磁盘结构进行通信.这种模式下,数据库是不可使用的. 可以执行的任务是:运行一个创建 ...
- iOS学习系列 - 扩展机制category与associative
iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...
- sql.date
package com.sxt.utils.date1; import java.sql.Date; /* * sql.date:没有时,分,秒 */ public class TestDate2 { ...
- @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...
- C++笔记:面向对象编程(Handle类)
句柄类 句柄类的出现是为了解决用户使用指针时须要控制指针的载入和释放的问题. 用指针訪问对象非常easy出现悬垂指针或者内存泄漏的问题. 为了解决这些问题,有很多方法能够使用,句柄类就是当中之中的一个 ...
- oracle函数 INSTR(C1,C2[,I[,J]])
[功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] C1 被搜索的字符串 C2 希望搜索的字符串 I 搜 ...
- 微信支付、支付宝支付和QQ钱包支付
最近忙于对接微信支付和支付宝支付,注册微信公众号,认证公众号,注册微信支付商户号并进行认证: 签约支付宝支付产品(手机网站支付.PC网站支付),注册支付宝企业账号(企业账号权限更大): 注册QQ钱包商 ...