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 ...
随机推荐
- swift 风骚的Guard语法
http://blog.csdn.net/pjk1129/article/details/48627153#0-qzone-1-64255-d020d2d2a4e8d1a374a433f596ad14 ...
- Django1.11使用命令makemigrations提示No Changes
在项目中,遇到models模型变动,变动后合并发生问题,故当时做了删除应用文件夹下migrations文件,由于数据库里无较多新数据,故删除后重建,但重建后执行模型合并操作结果为No Changes, ...
- python系列之(5)PyMySQL的使用
简介 PyMySQL是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中是使用mysqldb. 安装 pip3 install pymysql 创建连接 #!/usr ...
- 【Django入坑之路】Django与Query Ajax的交互
1:Jquery.ajax后端交互数据 $.ajax({ Url: /路由处理/, Type: GET/POST, #传送请求类型 Data: {user: “ XXXX”,pass:”XXXX”}, ...
- jquery on事件
可以给后添加的动态元素绑定事件
- BZOJ1878 洛谷1972 HH的项链题解
洛谷链接 BZOJ链接 看到这样不用修改的题目,应该佷容易就联想到了离线来处理. 我们发现若将询问按照r来排序,排完后每次对答案有贡献的仅是每个颜色最后出现的位置 我们用next[i]表示i处颜色之前 ...
- CAD安装失败怎样卸载重新安装CAD,解决CAD安装失败的方法总结
技术帖:CAD没有按照正确方式卸载,导致CAD安装失败.楼主也查过网上关于如何解决CAD安装失败的一些文章,是说删除几个CAD文件和CAD软件注册表就可以解决CAD安装失败的问题,实际的情况并没有这么 ...
- c++第四次作业:继承
继承与派生 基本概念和语法 概念 继承与派生是同一过程从不同角度看 保持已有的特性而构造新类的过程称为继承. 在已有类的基础上新增自己的特性而产生新类的过程为派生. 被继承的已有类称为基类(父类) 派 ...
- 【BootStrap】--具有增删改查功能的表格Demo
[BootStrap]--具有增删改查功能的表格Demo 目录(?)[+] 前言 版本一 样式 代码 版本二 样式 代码 版本三 样式 代码 总结 前言 bootstrap的表格样式,有类似EasyU ...
- sql.date
package com.sxt.utils.date1; import java.sql.Date; /* * sql.date:没有时,分,秒 */ public class TestDate2 { ...