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; // 如果因子之和等于数本身,则为完全数
}