程序设计实验五

第一题

题目:

1、利用循环实现“计算斐波那契数列第n项”的函数,F(n)=F(n-1)+F(n-2),其中 F(1)=F(2)=1n>=3。(假设所求斐波那契项不超出整型数据表示范围)注:不可使用全局变量。

#include <iostream>

int Fibonacci(int n)
{
if (n == 1 || n == 2)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}

int main()
{
int n;
std::cout << "输入n的值(n>=3)" << std::endl;
std::cin >> n;
if (n >= 1)
{
std::cout << "数列第n项是" << Fibonacci(n);
}
return 0;
}

第二题

题目:

2、使用函数求数列的前n项的值。

#include <iostream>

int sum(int n)
{
int sum = 0;
int a = 0;
for (int i = 0; i < n; i++)
{
a = 10 * a + 1;
sum += a;
}
return sum;
}

int main()
{
int n;
std::cin >> n;
std::cout << sum(n) << std::endl;
return 0;
}

第三题

题目:

3、利用级数展开式计算 cos(x),直到某一项的绝对值小于0.000001为止。

#include <iostream>
#include <cmath>
#include <iomanip>

double series_expansion(double x,int n)
{
if (n == 0)
return 1;
else
return (-1) * series_expansion(x, n - 1) * pow(x, 2) / (2 * n) / (2 * n - 1);
}

int main()
{
double x, sum = 0;
std::cin >> x;
int n=0;
while (abs(series_expansion(x, n)) >= 1e-6)
{
sum += series_expansion(x, n++);
}
std::cout <<sum;
}

第四题

题目:

求方程 ax2+bx+c=0的根,用3个函数分别求当b2-4ac>0、b2-4ac=0 以及 b2-4ac<0 三种情况下的根,并输出结果。其中,a,b,c的值在main()中通过键盘输入。

#include <iostream>
#include <cmath>

void root1(double a, double b, double c)
{
double x1 = ((-b) + sqrt(pow(b, 2) - 4 * a * c)) / 2 * a;
double x2 = ((-b) - sqrt(pow(b, 2) - 4 * a * c)) / 2 * a;
std::cout << x1 << x2 << std::endl;
}

void root2(double a, double b, double c)
{
double x = ((-b) + sqrt(pow(b, 2) - 4 * a * c)) / 2 * a;
std::cout << x << std::endl;
}

void root3(double a, double b, double c)
{
std::cout << "无解" << std::endl;
}

int main()
{
double a, b, c;
std::cout << "输入a,b,c的值:";
std::cin >> a >> b >> c;
if ((b * b - 4 * a * c) > 0)
root1(a, b, c);
if ((b * b - 4 * a * c) == 0)
root2(a, b, c);
if ((b * b - 4 * a * c) < 0)
root3(a, b, c);
return 0;
}

第五题

题目:

5、求 aXb和 a”的值。其中b的值在程序中给出,a和m的值由键盘输入,且a为全局变量。写一个 power函数求a”的值,在主函数中求aXb,并调用power 函数得到a”的
值。

使用extern:

#include <iostream>

extern int power(int a,int b);
int main()
{
int a, b = 4;
int m;
std::cin >> a >> m;
std::cout << "a*b=" << a * b << std::endl;
std::cout << "a^m=" << power(a, m) << std::endl;
return 0;
}

使用headfile:

#include <iostream>
#include "func.h"

int main()
{
int a, b = 4;
int m;
std::cin >> a >> m;
std::cout << "a*b=" << a * b << std::endl;
std::cout << "a^m=" << power(a, m) << std::endl;
return 0;
}

第六题

题目:

6、写一个函数 goldbach(n)验证哥德巴赫猜想:一个不小于6的偶数可以表示为两个素数之和。

#include <iostream>
#include "func.h"

int main()
{
int n;
std::cout << "input n:";
std::cin >> n;
goldbach(n);
return 0;
}

第七题

题目:

7、编写两个函数 hcf(x,y)和 lcd(x,y),键盘输入两个整数x和y,分别求这两个整数的最大公约数和最小公倍数。

#include <iostream>
#include "func.h"

int main()
{
int x, y;
std::cin >> x >> y;
std::cout << "最大公约数是" << hcf(x, y);
std::cout << "最小公倍数是" << lcd(x, y);
}

第八题

题目:

8、写一个递归函数 Digitsum(n),输入一个非负整数,返回组成它的数字之和。不可使用全局变量。

#include <iostream>
#include "func.h"

int main()
{
int n;
std::cin >> n;
std::cout << Digisum(n);
return 0;
}

第九题

题目:

9、 Hanoi(汉诺)塔问题(具体题目及要求参见课后题9)。

#include <iostream>
#include "func.h"

int main()
{
char a = 'A', b = 'B', c = 'C';
int n;
std::cin >> n;
Hanoi(n, a, b, c);
return 0;
}

函数文件

头文件:

#pragma once

int power(int a, int b);
int prime(int n);
void goldbach(int n);
int hcf(int x, int y);
int lcd(int x, int y);
int Digisum(int n);
void Hanoi(int n, char a, char b, char c);

函数源文件:

#include <iostream>
#include "func.h"
#include <cmath>

int Digisum(int n)
{
if (n != 1)
return (n % 10 + Digisum(n / 10));
}

void goldbach(int n)
{
for (int i = 2; i <= n / 2; i++)
{
for (int j = 2; j <= n; j++)
{
if (i + j == n)
if (prime(i) && prime(j))
{
std::cout << n << "=" << i << "+" << j << std::endl;
}
}
}
}

void Hanoi(int n, char a, char b, char c)
{
if (n == 0)
std::cout << a << "->" << c << std::endl;
else
{
Hanoi(n - 1, a, c, b);
std::cout << a << "->" << c << std::endl;
Hanoi(n - 1, b, a, c);
}
}

int hcf(int x, int y)
{
if (y == 0)
return x;
return hcf(y, x % y);
}

int lcd(int x, int y)
{
return x * y / hcf(x, y);
}

int power(int a, int b)
{
int sum = 1;
for (int i = 1; i <= b; i++)
{
sum *= a;
}
return sum;
}

int prime(int n)
{
if (n <= 1)
return 0;
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
return 0;
}
return 1;
}