回文字符串判断、素数的判断、求最大公约数最小公倍数(c++)

写一下最近用到的或者说刷题时看到的几个常见的问题解法

1、判断是否是回文字符串

2、素数的判断

3、求最大公约数最小公倍数

代码里面的注释都比较清楚了。我就不写太多说明了,直接上代码
1、判断是否为回文串

#include<iostream>

using std::cin; 
using std::cout;
using std::endl;
using std::boolalpha;

//判断是否是回文字符串串
bool judgePalindrome(char* str, int len) {
	// 判断第 i 个字符是否和倒数第 i 个字符相等 
	for (int i = 0; i < len / 2; i++) {            //用len/2(一个整数且丢弃小数部分)之前不用判断len是奇数还是偶数,偶数不用说,奇数的话最中间的一个字符不用比,所以len/2也是符合要求的。
		if (str[i] != str[len - 1 - i]) {          //已经有不同的了,直接返回false。
			return false;    
		}
	}
	return true;                        //如果都相同,那么是回文串。
}
int main() 
{
	//测试是否为回文字符串
    char str[1000];
	bool result=false;
    while (cin.getline(str, 1000)) {	                                                // getline可以录入空格这一个空白符
		result = judgePalindrome(str, strlen(str));
	    cout <<"the "<<str<<" is Palindrome string? :"<<boolalpha<< result << endl;     // boolalpha代表输出ture或false,没有的话输出0或1
	}
	return 0;
}

2、是否是素数,用了两种方法,个人觉得第二种好些

#include<iostream>

using std::cin; 
using std::cout;
using std::endl;
using std::boolalpha;

//判断是否为素数
// 假设 d 为 n 的约数,那么 n/d 也是 n 的约数,因为有: n = d * (n/d),即:min(d, n/d) <= sqrt(n),
// 因此我们只要检测 2 ~ sqrt(n) 范围内所有的整数就可以了,
bool isPrime_1(int n) {
	if (n == 1) {
		return false;
	}
	if (n == 2) {
		return true;
	}
	for (int i = 2; i <= sqrt(n); i++) {
		if (n % i== 0) {
			return false;
		}
	}
	return true;
}

bool isPrime_2(int n) {	
	if (n == 2) {                               // 2 是素数
		return true;
	}
	if (n != 2 && n % 2 == 0) {             	// 如果能被 2 整除,证明 n 不是素数(2 本身除外) 
		return false;
	}
	// 如果不能被 2 整除,那么 n 即为奇数,判断其是否能被奇数整除,前面我们已经处理了 2 和 2 的倍数,因此这个循环的范围就是 [3, sqrt(n)]内的奇数
	for (int i = 3; i <= sqrt(n); i += 2) {     //i <= sqrt(n); 可以换成i*i<n。为什么加2,因为能被偶数整除的,一定能被2整除。上面已经讨论过了
		if (n % i == 0) {
			return false;
		}
	}
}

int main() 
{
	//素数判断  1 既不是素数也不是合数,所以没判断
	for (int i = 2; i <= 20; i++) {	
			cout << i << " 是素数? : " << boolalpha << isPrime_1(i) << endl;        //第一种方法
			cout << i << " 是素数? : " << boolalpha << isPrime_2(i) << endl;        //第二种方法
	}

	return 0;
}

3、最小公倍数,最大公约数

#include<iostream>

using std::cin; 
using std::cout;
using std::endl;
using std::boolalpha;

// 求两个数的最大公约数 
int gcd(int a, int b) {
	if (a == 0) {
		return b;
	}
	return gcd(b % a, a);                      //用了递归的思想,用这种方法可以不用先判断参数a ,b的大小,如果b>a,那么gcd(b % a, a);里面的b % a 肯定小于a,
	                                           //也就是说gcd()中前一个参数小,后一个参数大。那么递归到最后一定有小的数a==0,返回大的数b,b就是最大公约数。
	                                           //如果是b<a;第一次gcd(b % a, a)就等于gcd(b , a);后也变成了前一个参数小,后一个参数大。和上面一样。可自行验证
}
// 求两个数的最小公倍数
int lcm(int a, int b) {
	int gcdValue = gcd(a, b);                  // 先求出最大公约数 
	int lcmValue = a * b / gcdValue;           // 最小公倍数 等于 两个数的积除以最小公约数
	return lcmValue;
}

int main() 
{
	int a, b;
	while (cin >> a >> b) {
		cout << "最大公约数:" << gcd(a, b) << endl;
		cout << "最小公倍数:" << lcm(a, b) << endl;
	}
	return 0;
}

应该都还蛮容易懂,不懂得可以评论。以后有继续更

posted on 2021-06-10 16:59  雾恋过往  阅读(181)  评论(0编辑  收藏  举报

Live2D