当前位置:网站首页>PTA 6-2 多项式求值
PTA 6-2 多项式求值
2022-08-04 14:49:00 【林德熙】
本题要求实现一个函数
本题要求实现一个函数,计算阶数为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;
}
*/
边栏推荐
- 实际工作中的高级技术(训练加速、推理加速、深度学习自适应、对抗神经网络)
- Win10无法访问移动硬盘怎么解决
- Oracle database user creation, restart, import and export
- Leetcode: 215 disorderly to find the first big k element in the array
- 特殊品种的二次开户验资金额
- X-ray grazing incidence focusing mirror
- 技术分享| 融合调度系统中的电子围栏功能说明
- 【历史上的今天】8 月 4 日:第一位图灵奖女性得主;NVIDIA 收购 MediaQ;首届网络安全挑战大赛完成
- 快解析结合友加畅捷U+
- 【 HMS core 】 【 Media 】 online video editing service 】 【 material can't show, or network anomalies have been Loading state
猜你喜欢
Go 语言快速入门指南: 变量和常量
uni-app 从零开始-生命周期(二)
一看就会的Chromedriver(谷歌浏览器驱动)安装教程
Cisco - Small Network Topology (DNS, DHCP, Web Server, Wireless Router)
Find My Technology | Prevent your pet from getting lost, Apple Find My technology can help you
This week to discuss the user experience: Daedalus Nemo to join Ambire, explore the encryption of the ocean
【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常
16、学习MySQL 正则表达式
Find My技术|防止你的宠物跑丢,苹果Find My技术可以帮到你
Cisco-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
随机推荐
程序猿七夕礼物-如何30分钟给女朋友快速搭建专属语聊房
微软表示将向内部网络安全专家共享数据 为企业提供更安全保护
Centos7 install mysql version rapidly
CF1527D MEX Tree (mex & tree & inclusive)
Oracle database user creation, restart, import and export
基本介绍PLSQL
Workaround without Project Facets
Technology sharing | Description of the electronic fence function in the integrated dispatching system
Next -21- 添加相册系列 - 1- 框架设置
leetcode:253. 至少需要多少间会议室
[The Art of Hardware Architecture] Study Notes (1) The World of Metastability
没有Project Facets的解决方法
【Today in History】August 4: First female Turing Award winner; NVIDIA acquires MediaQ; first Cybersecurity Challenge completed
B. Construct a simple sequence (greedy)
leetcode:212. 单词搜索 II
xampp安装包含的组件有(php,perl,apche,mysql)
Hangzhou electric the competition team arrangement (ACM)
RS|哨兵二号(.SAFE格式)转tif格式
FRED Application: Capillary Electrophoresis System
B.构造一个简单的数列(贪心)