我的运动有问题。该计划必须使用霍纳计划。我已经尽了最大努力,但我总是得到错误的答案,我担心我做了一个可以轻松解决的小错误。我不知道该怎么做,我希望有人能帮我解决这个问题。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FeelsBadMan
{
class Program
{
static void Main(string[] args)
{
while (true)
{
try
{
int i, a, x, h, n;
int[] array = new int[100];
Console.Write("Degree of a polynomial: ");
a = Convert.ToInt32(Console.ReadLine());
Console.Write("Constant term : ");
n = Convert.ToInt32(Console.ReadLine());
for (i = 1; i <= a; i++)
{
Console.Write("Input number x^{0}: ", i);
array[i] = Convert.ToInt32(Console.ReadLine());
}
Console.Write("Input x value: ");
x = Convert.ToInt32(Console.ReadLine());
{
h = array[0];
for (i = 1; i < a; i++)
{
h = (h * x) + array[i] + n;
}
Console.Write("Result: {0}\n", h);
Console.ReadKey();
break;
}
}
catch (OverflowException)
{
Console.WriteLine("Number out of scale! Try again.\n");
}
catch (FormatException)
{
Console.WriteLine("Incorrect format! Try again.\n");
}
}
}
}
}
例如:
Degree of a polynomial:3
Constant term: 5
Input number x^1: 1
Input number x^2: 0
Input number x^3: 1
Input x value: 3
Result: 23
然而,正确答案是35。
答案 0 :(得分:0)
这会输出正确的结果:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FeelsBadMan
{
class Program
{
static void Main(string[] args)
{
while (true)
{
try
{
Console.Write("Degree of a polynomial: ");
Int32 a = Convert.ToInt32(Console.ReadLine());
Console.Write("Constant term : ");
Int32 n = Convert.ToInt32(Console.ReadLine());
List<Int32> polys = new List<Int32>(a + 1);
for (Int32 i = 1; i <= a; ++i)
{
Console.Write("Input number x^{0}: ", i);
polys.Add(Convert.ToInt32(Console.ReadLine()));
}
polys.Insert(0,n);
Console.Write("Input x value: ");
Int32 x = Convert.ToInt32(Console.ReadLine());
Int32 result = array[a];
for (Int32 i = a - 1; i >= 0; --i)
result = (result * x) + polys[i];
Console.Write("Result: {0}\n", result);
Console.ReadKey();
}
catch (OverflowException)
{
Console.WriteLine("Number out of scale! Try again.\n");
}
catch (FormatException)
{
Console.WriteLine("Incorrect format! Try again.\n");
}
}
}
}
}
您在每次迭代中都将常量项包含在结果中,这是主要问题!另外,正如@Peter Duniho指出的那样,霍纳的方法需要从最高阶系数开始并且最低,所以我颠倒了迭代顺序。
最后但并非最不重要的是,您将系统基于固定长度的整数数组,在这种情况下这不是一个好的做法。我改为使用了List<Int32>
代替了{更好},使用等于a + 1
的固定容量进行初始化,以便也处理常数项,一旦所有这些都被附加到索引0多项式已定义。
另外,如果必须发布此代码,请不要忘记添加健全性检查,以确定用户输入是否正确。
答案 1 :(得分:0)
循环中有三个不同的问题:
array[0]
,这是数组的未初始化元素,因此值为0
。这应该设置为多项式的最高阶系数,即array[a]
。直接从the Wikipedia article实现算法,你的循环应该是这样的:
array[0] = n;
int h = array[a];
for (int i = a - 1; i >= 0; i--)
{
h = array[i] + h * x;
}
这将产生预期的结果。