c#霍纳行使错误答案

时间:2017-11-11 23:31:25

标签: c#

我的运动有问题。该计划必须使用霍纳计划。我已经尽了最大努力,但我总是得到错误的答案,我担心我做了一个可以轻松解决的小错误。我不知道该怎么做,我希望有人能帮我解决这个问题。

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。

2 个答案:

答案 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)

循环中有三个不同的问题:

  1. 您的初始值设置为array[0],这是数组的未初始化元素,因此值为0。这应该设置为多项式的最高阶系数,即array[a]
  2. 由于某种莫名其妙的原因,在循环的每次迭代中都添加常数项,即最低阶系数。
  3. 最后,但肯定不是最不重要的,你是以错误的顺序计算值,从最低阶系数开始,然后到最高阶。霍纳的方法需要从最高阶系数开始,然后降到最低。
  4. 直接从the Wikipedia article实现算法,你的循环应该是这样的:

    array[0] = n;
    int h = array[a];
    
    for (int i = a - 1; i >= 0; i--)
    {
        h = array[i] + h * x;
    }
    

    这将产生预期的结果。