Bootstrap

C#上机练习66-70

66.数组x中存有20个四位整数,请编制函数,求出正整数的个数tn。以及各位数字之和是偶数的数的个数tc,以及满足条件的这些数的算术平均ta.,将tn,tc,ta在控制台输出。

67.数组x中存有20个四位整数,请编制函数,求出正整数的个数tn。以及百位数字大于十位数字数的个数tc,以及满足条件的这些数的算术平均ta.,将tn,tc,ta在控制台输出。

68.哥德巴赫猜想之一是任何一个大于5的偶数都可以表示为两个素数之和。验证这一论断。

69.用牛顿迭代法求方程2x3+4x2-7x-6=0在x=1.5附近的根。

70.编程序求2~10000以内的完全数(一个数的因子(除了这个数本身)之和等于该数本身)

66、在 AnalyzeNumbers 函数中,我们遍历数组 x 中的每个整数,并根据以下规则进行计数:

  • 如果一个数是正整数,则 tn(正整数的个数)加1,同时该数的值加到正整数的总和中。
  • 对于每个数,我们计算其各位数字之和。如果这个和为偶数,则 tc(各位数字之和为偶数的数的个数)加1。

最后,我们计算正整数的算术平均值 ta,它是正整数总和除以正整数的个数。

Main 方法定义了一个示例数组 x,调用 AnalyzeNumbers 函数进行分析,并输出结果。代码如下:

 private static void Main(string[] args)
 { // 示例数组x,包含20个四位整数
     int[] x = { 1234, 2345, 3456, 4567, 5678, 6789, 7890, 8901, 9012, 1011,1112, 2123, 3134, 4145, 5156, 6167, 7178, 8189, 9190, 123 };

     var results = AnalyzeNumbers(x); // 调用函数进行分析

     // 输出结果
     Console.WriteLine($"正整数的个数 tn: {results.tn}");
     Console.WriteLine($"各位数字之和是偶数的数的个数 tc: {results.tc}");
     Console.WriteLine($"满足条件的数的算术平均值 ta: {results.ta:F2}");
 }

 // 函数用于计算正整数的个数、各位数字之和为偶数的数的个数,以及满足条件的数的算术平均值
 static (int tn, int tc, double ta) AnalyzeNumbers(int[] x)
 {
     int tn = 0; // 正整数的个数
     int tc = 0; // 各位数字之和为偶数的数的个数
     double sumOfPositiveNumbers = 0; // 正整数的和
     int countOfPositiveNumbers = 0; // 正整数的个数

     foreach (int number in x)
     {
         // 检查数是否为正整数
         if (number > 0)
         {
             tn++;
             sumOfPositiveNumbers += number;
             countOfPositiveNumbers++;
         }

         // 检查各位数字之和是否为偶数
         int sumOfDigits = number.ToString().Sum(digit => int.Parse(digit.ToString()));
         if (sumOfDigits % 2 == 0)
         {
             tc++;
         }
     }

     // 计算算术平均值
     double ta = countOfPositiveNumbers > 0 ? sumOfPositiveNumbers / countOfPositiveNumbers : 0;

     return (tn, tc, ta);
 }

67、这个跟上一个差不多,我们只需要改下判断就可以,代码如下:

68、我们可以在100000内找,将检查每一个大于5且小于一个给定上限(在这个示例中为1000000)的偶数,确保它能够被表示为两个素数之和,代码如下:

private static void Main(string[] args)

    int limit = 1000000; // 我们检查的偶数上限
    bool[] isPrime = new bool[limit + 1]; // 用于标记索引值是否为素数的数组

    // 初始化素数标记数组
    for (int i = 2; i <= limit; i++)
    {
        isPrime[i] = true;
    }

    // 筛选出小于或等于limit的素数
    for (int i = 2; i * i <= limit; i++)
    {
        if (isPrime[i])
        {
            for (int j = i * i; j <= limit; j += i)
            {
                isPrime[j] = false;
            }
        }
    }

    // 验证哥德巴赫猜想
    for (int i = 6; i <= limit; i += 2) // 从6开始检查每一个偶数
    {
        bool found = false;
        for (int j = 2; j <= i / 2; j++) // 对于每一个偶数,找到两个素数之和等于它的素数
        {
            if (isPrime[j] && isPrime[i - j]) // 如果两个素数都是素数
            {
                Console.WriteLine($"{i} = {j} + {i - j}"); // 输出结果
                found = true;
                break; // 找到一对素数后,跳出循环
            }
        }

        if (!found)
        {
            Console.WriteLine($"哥德巴赫猜想在 {i} 处失败。");
            break;
        }
    }
}

69、我们定义几个函数,然后调用,代码如下:

Function 方法返回方程 2x^3 + 4x^2 - 7x - 6 的值,Derivative 方法返回方程的导数 6x^2 + 8x - 7 的值。NewtonRaphson 方法通过迭代更新 x 的值,直到满足容差条件或达到最大迭代次数。程序的输出是迭代法找到的根。

private static void Main(string[] args)
{
    double initialGuess = 1.5; // 初始猜测值
    double tolerance = 1e-7; // 容忍误差
    int maxIterations = 1000; // 最大迭代次数

    double root = NewtonRaphson(initialGuess, tolerance, maxIterations);
    Console.WriteLine($"方程 2x^3 + 4x^2 - 7x - 6 = 0 在 x = 1.5 附近的根为: {root}");
}

static double NewtonRaphson(double initialGuess, double tolerance, int maxIterations)
{
    double x = initialGuess;
    double fx = Function(x);
    double dfx = Derivative(x);

    int iteration = 0;
    while (Math.Abs(fx) > tolerance && iteration < maxIterations)
    {
        double xNext = x - fx / dfx;
        fx = Function(xNext);
        dfx = Derivative(xNext);
        x = xNext;
        iteration++;
    }

    if (iteration >= maxIterations)
    {
        Console.WriteLine("未能在迭代次数内找到解,可能需要增加迭代次数或检查初始猜测值。");
    }

    return x;
}

static double Function(double x)
{
    return 2 * Math.Pow(x, 3) + 4 * Math.Pow(x, 2) - 7 * x - 6;
}

static double Derivative(double x)
{
    return 6 * Math.Pow(x, 2) + 8 * x - 7;
}

70、

IsPerfect 函数检查给定的整数 number 是否是完全数。它通过累加所有小于或等于 number 一半的因子来实现这一点。如果因子之和等于 number 本身,则返回 true,表示这是一个完全数;否则返回 false

主方法 Main 中的循环遍历从2开始到10000的所有整数,并调用 IsPerfect 函数来检查每个数是否是完全数。如果是,程序将其输出到控制台

private static void Main(string[] args)
{
    Console.WriteLine("2到10000之间的完全数:");
    for (int i = 2; i <= 10000; i++)
    {
        if (IsPerfect(i))
        {
            Console.WriteLine(i);
        }
    }
}

// 判断一个数是否为完全数的函数
static bool IsPerfect(int number)
{
    int sum = 0;
    for (int i = 1; i <= number / 2; i++) // 只需检查到一半即可
    {
        if (number % i == 0)
        {
            sum += i;
        }
    }
    return sum == number; // 如果因子之和等于数本身,则为完全数
}

;