<Sicily>Polynomial
一、题目描述
Given a polynomial and the value of the variable x, you task is to calculate the value of the polynomial.
二、输入
The first line of the input is a positive integer T. T is the number of test cases followed.
In each test case, the first line contains two integer n and x (0<=n<=50, 0<=x<=10000). The second line contains n+1 integers, representing the coefficients of a polynomial from power degree N down to power degree 0, each integer is no less than 0 and no more than 10000.
三、输出
The output of each test case should consist one line, containing the result of the polynomial.
例如:
输入:
1
2 5
1 2 3
输出:
38
四、解题思路
题意:这道题要求的是多项式值。如果只是简单的求多项式的值很简单。可题目有个条件是 (0<=n<=50, 0<=x<=10000),这样求出来的数已经超过了long long类型。
开始不知道怎么处理这个大数问题,在这里卡住了。后来同学说使用数组处理。以前没接触过使用输出保存大数的问题,当时也上不了网,于是自己思考一下,使用一个数组n表示n位十进制。每位表示十进制中的一位数。大数+(int类型)常数;大数*(int类型)常数。
1、多项式计算方法
记得高中学过求多项式值得方法能较少计算量:
如多项式:1*5^2+2*5^1+3*5^0
2、数组表示整数
例如439保存在数组bigInteger[3];bigInteger[2]=4;bigInteger[1]=3;bigInteger[0]=9;
1)数组表示的整数加上一个常数num
例如加上35。
先从最低位开始,例如bigInteger[0]+35=43;bigInteger[0]=43%10;进位数carryInt=43/10=4;
向高位逐步计算
bigInteger[1]+4=7,bigInteger[1]=7%10,carryInt=7/10。
当出现carryInt为0是停止计算,否则不断想高位计算。
计算的结果是:
bigInteger[2]=4;bigInteger[1]=7;bigInteger[0]=4;
2)数组表示的整数乘以一个常数num
例如bigInteger[2]=4;bigInteger[1]=7;bigInteger[0]=4;乘以4。
也是从最低位开始bigInteger[0]*4=16,bigInteger[0]=16%10=6;
进位数carryInt=16/10=1;
继续到下一位(高位):bigInteger[1]*4=28,28+carryInt=29,bigInteger[1]=29%10=9,
carryInt=29/10=2;
继续下一位:bigInteger[2]*4=16,16+carryInt=18,bigInteger[2]=18%10=8,
carryInt=18/10=1;
继续下一位:
bigInteger[3]开始至为0,所以bigInteger[3]=bigInteger[3]+carryInt=1。
最后计算结果为:bigInteger[3]=1,bigInteger[2]=8,bigInteger[1]=9,bigInteger[0]=6
五、代码
#include<iostream>
using namespace std;
const int BIT_NUM = 200; //支持大数的最大位数(200位)
int main()
{
int times;
cin >> times;
while(times--)
{
int bigInteger[BIT_NUM] = {0}; //用数组保存一个大数
int n, x, argue; //n-多项式的最高次数,x-位置数x的值,argue-每一项的系数
long long sum = 0; //多项式的结果
cin >> n >> x;
for(int k = 0; k < (n + 1); k++) //计算多项式,这里使用了一个公式例如1*5^2+2*5^1+3*5^0=38 可以写成(1*5+2)*5+3=38
{
cin >> argue;
int carryInt = 0; //进位(从低位算起,例如各位数是7乘以一个常数8,那么结果各位数是6,向高位数进5(carryInt))
for(int i = BIT_NUM; i > 0; i--) //一个大数乘以一个常数,从各位开始逐个与常数相乘,满十向高位进
{
bigInteger[i-1] = bigInteger[i-1] * x + carryInt;
carryInt = bigInteger[i-1] / 10;
bigInteger[i-1] %= 10;
}
//大数加上一个常数
int addCarry = 0;
bigInteger[BIT_NUM - 1] += argue; //大数加上一个常数argue,先个位数加
for(int i = BIT_NUM; i > 0; i--)
{
bigInteger[i-1] = bigInteger[i-1] + addCarry;
addCarry = bigInteger[i-1] / 10; //addCarry保存进制数
bigInteger[i-1] %= 10;
if(addCarry == 0) break; //如果出现不需要向高位数进的退出
}
}
int flag = false;
for(int i = 0; i < BIT_NUM; i++) //从高位第一个非0开始输出大数
{
if(bigInteger[i] != 0) {flag = true;}
if(flag) {cout << bigInteger[i];}
}
cout << endl;
}
return 0;
}
<Sicily>Polynomial的更多相关文章
- Polynomial Library in OpenCascade
Polynomial Library in OpenCascade eryar@163.com 摘要Abstract:分析幂基曲线即多项式曲线在OpenCascade中的计算方法,以及利用OpenSc ...
- sicily 中缀表达式转后缀表达式
题目描述 将中缀表达式(infix expression)转换为后缀表达式(postfix expression).假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含左括号'(',右括号‘)’ ...
- sicily 1934. 移动小球
Description 你有一些小球,从左到右依次编号为1,2,3,...,n. 你可以执行两种指令(1或者2).其中, 1 X Y表示把小球X移动到小球Y的左边, 2 X Y表示把小球X移动到小球Y ...
- 周赛-Integration of Polynomial 分类: 比赛 2015-08-02 08:40 10人阅读 评论(0) 收藏
Integration of Polynomial Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/O ...
- FZU 2215 Simple Polynomial Problem(简单多项式问题)
Description 题目描述 You are given an polynomial of x consisting of only addition marks, multiplication ...
- Project Euler 101 :Optimum polynomial 最优多项式
Optimum polynomial If we are presented with the first k terms of a sequence it is impossible to say ...
- 大数求模 sicily 1020
Search
- 【数论】UVa 10586 - Polynomial Remains
Problem F: Polynomial Remains Given the polynomial a(x) = an xn + ... + a1 x + a0, compute the remai ...
- Sicily 1510欢迎提出优化方案
这道题我觉得是除1000(A-B)外最简单的题了……不过还是提出一个小问题:在本机用gcc编译的时候我没包括string.h头文件,通过编译,为什么在sicily上却编译失败? 1510. Mispe ...
随机推荐
- 源泉书签,助您管理海量收藏。www.yuanquanshuqian.com 今日更新:支持了导入url为js代码的书签
源泉书签,助您管理海量收藏.www.yuanquanshuqian.com 今日更新:支持了导入url为js代码的书签
- ubuntu16.04通过ipv6进行学术搜索
https://www.polarxiong.com/archives/%E8%A7%A3%E5%86%B3ubuntu%E4%B8%8Bipv6%E8%BF%9E%E6%8E%A5%E4%B8%80 ...
- nyoj--1036--非洲小孩(区间相交问题)
非洲小孩 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 家住非洲的小孩,都很黑.为什么呢? 第一,他们地处热带,太阳辐射严重. 第二,他们不经常洗澡.(常年缺水,怎么洗 ...
- Oracle 10g RAC (linux) ASM 共享存储的管理详解
---------ASM 的管理(共享磁盘的管理)1.以 instance 的方式管理 ASM,启动 database 之前必须先启动 ASM instance,ASM instance 启动后,挂载 ...
- [hihocoder #1384] Genius ACM 解题报告(倍增)
题目链接:http://hihocoder.com/problemset/problem/1384 题目大意: 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M ...
- 简易Servlet计算器1.0
编写一个简易的Servlet计算器,暂时仅能实现 + - * / % 五种运算 jsp界面: <%@ page language="java" contentType=&qu ...
- Swift学习笔记(8):闭包
目录: 基本语法 尾随闭包 值捕获 自动闭包 闭包是自包含的函数代码块,闭包采取如下三种形式之一: ・全局函数是一个有名字但不会捕获任何值的闭包 ・嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 ...
- png库结合zlib库使用出现的一个链接问题的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 要使用png库,首先得编译png库,要编译png库,得依赖zlib库的头文件.在使用png库读取一个png文件时,代码 ...
- Android封装类似微信的顶部TitleBar弹出的PopupWindow代码
Android仿微信顶部titlebar,点击加号弹出的PopupWindow,是封装好的PopupWindow,直接拿来用即可,先看效果图: 调用代码非常简单,这是MainActivity的代码: ...
- Codeforces 845A. Chess Tourney 思路:简单逻辑题
题目: 题意:输入一个整数n,接着输入2*n个数字,代表2*n个选手的实力. 实力值大的选手可以赢实力值小的选手,实力值相同则都有可能赢. 叫你把这2*n个选手分成2个有n个选手的队伍. ...