C++编程学习阶段性总结

例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);
	}
}

结果如下:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武当豆豆

为国家GDP快速增长做贡献

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值