例1:求最大公倍数和最小公约数
写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用两个函数,并输出结果,两个整数由键盘输入
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a, b, c, d;
int max_common_divisor(int a, int b);
int min_common_multiple(int a, int b);
cout << "请输入两个整数:";
cin >> a >> b;
c = max_common_divisor(a, b);
d = min_common_multiple(a, b);
cout << "最大公约数为:" << c << endl;
cout << "最小公倍数为:" << d << endl;
return 0;
}
//求最大公约数
/*
//优化前代码
int max_common_divisor(int a, int b)
{
int c, d, e, f;
//if (a >= b)
// c = a / b;
c = (a <= b) ? a : b;
for (int i = 1; c >= i; i++)
{
d = a % i;
e = b % i;
if (d == 0 && e == 0) //`if (d == e == 0)`。在C++中,这实际上先计算`d==e`,得到一个布尔值(0或1),然后再与0比较.
f = i;
}
return f;
}
*/
//优化后代码
int max_common_divisor(int a, int b)
{
int temp;
if (a == 0 || b == 0) return 0;
a = abs(a);
b = abs(b);
if (a < b)
{
temp = a;
a = b;
b = temp;
}
while (b != 0)
{
temp = a % b;
a = b;
b = temp;
}
return a;
}
//求最小公倍数
int min_common_multiple(int a, int b)
{
int c, d;
int max_common_divisor(int a, int b);
if (a == 0 || b == 0) return 0;
a = abs(a);
b = abs(b);
c = max_common_divisor(a,b);
d = a * b / c; //最小公倍数为两数之积除最大公约数
return d;
}
结果如下:

例2:判断一个数是否为素数
写出一个判别素数的函数,在主函数中输入一个整数,输出是否为素数的信息。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
void prime_number(int a);
int a;
cout << "请输入一个整数:";
cin >> a;
prime_number(a);
return 0;
}
void prime_number(int a)
{
int b, c;
b = int(sqrt(a));
for (int i = 2; i <= b; i++)
{
c = a % i;
if (c == 0)
{
cout << a << "不是素数!" << endl;
return; //结束函数,不执行后面的代码
}
}
cout << a << "是素数!" << endl;
}
结果如下:

例3:就多个数的阶乘的和
求a!+b!+c!的值,用一个函数fac(n)求n!。a,b,c的值由主函数输入,最终得到的值在主函数中输出。
#include <iostream>
using namespace std;
int main()
{
int a, b, c, sum = 0;
int fac(int n);
cout << "请输入a,b,c的值:";
cin >> a >> b >> c;
sum = fac(a) + fac(b) + fac(c);
cout << "a! + " << "b! + " << "c! = " << sum << endl;
return 0;
}
int fac(int n)
{
int s;
if (n == 1)
s = 1;
else
s = n * fac(n - 1);
return s;
}
结果如下:

例4:哥德巴赫猜测
验证哥德巴赫猜想,输入一个偶数,输出两个素数之和。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
void goldbach(int n);
cout << "请输入一个偶数:";
cin >> n;
goldbach(n);
return 0;
}
//判断素数函数
bool is_prime(int n)
{
int s;
s = sqrt(n);
if (n <= 1) return false;
if (n == 2) return true;
if (n >= 3)
{
for (int i = 2; i <= s; i++)
{
if (n % i == 0)
return false;
}
return true;
}
}
void goldbach(int n)
{
int count = 0;
for (int i = 2; i <= n / 2; i++)
{
if (is_prime(i) && is_prime(n - i))
{
cout << n << " = " << i << " + " << n - i << endl;
count++;
}
}
cout <<"整数 "<<n<<" 共有 " << count << " 组素数和!" << endl;
}
结果如下:

例5:汉诺塔问题
Hanoi(汉诺)塔问题。古代有一座梵塔,塔内有三个座A,B,C,开始时,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移动到C座,但每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上,在移动过程中可以借助B座,编写程序打印出移动步骤
思路:先把A座上前63个盘子移动到B,再把第64个盘子移动到C,然后把B座上63个盘子移动到C。如何把B座上63个盘子移到C,把B当成A即可,重复操作
#include <iostream>
using namespace std;
int t;
int main()
{
int n;
void hanoi(int n, char start, char end, char change);
cout << "请输入盘子总数:";
cin >> n;
cout << "开始移动···"<<endl;
hanoi(n, 'A', 'C', 'B');
cout << "共移动" << t << "次" << endl;
return 0;
}
void hanoi(int n, char start, char end, char change)
{
if (n == 1)
cout << "将" << start << "盘中第" << n << "个盘子移动到" << end << "盘!" << endl;
else
{
hanoi(n - 1, start, change, end);
cout << "将" << start << "盘中第" << n << "个盘子移动到" << end << "盘!" << endl;
hanoi(n - 1, change, end, start);
}
t++;
}
结果如下:

注意:即使每秒移动一百万次,将64个盘子移动完成,需要2的64次方减一次,也需要近六千年才能完成,不建议使用较大的数尝试。
例6:将一个整数转换为字符串
用递归法将一个整数n转换为字符串,n的位数不确定,可以是任意位的整数。
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
string result;
int main()
{
int n;
void int_to_string(int n);
cout << "请输入一个整数:";
cin >> n;
int_to_string(n);
cout << "输出结果为:" << result << endl;
return 0;
}
void int_to_string(int n)
{
if (n == 0)
{
result = '0';
}
else if (n < 0)
{
result = result + '-';
n = -n;
int_to_string(n);
}
else if (n < 10)
{
result = result + char('0'+n);
}
else
{
int_to_string(n / 10);
result = result + char('0'+ n % 10);
}
}
结果如下:


1309

被折叠的 条评论
为什么被折叠?



