回文字符串判断、素数的判断、求最大公约数最小公倍数(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;
}
应该都还蛮容易懂,不懂得可以评论。以后有继续更