编程常用算法 --- C/C++ 语言实现(不定期更新)

这篇博客总结了C/C++实现的一些常用算法,包括判断回文数/字符串、十进制数字转字符串、字符串转十进制数、进制转换、求最小公倍数和最大公约数以及判断素数。所有算法都不包含输入数据的合理性检查。
摘要由CSDN通过智能技术生成

引言

实际编程中,很多编程语言都帮我们实现了一些常用的较简单的算法,当然,在一些需求中,我们也需要自己实现一些算法,这里总结一些常用的算法,采用 C/C++ 语言实现,不定期更新。

这里的代码假设输入数据都是符合要求的,没有对输入的数据的合理性进行检测,这里要注意一下。

1、判断回文数/回文字符串

回文串即为正着读和倒着读都一样的字符串。这算是一个比较简单的问题了,数字和字符串是一样的,把数字也当成字符串输入就好了,当然也可以采用数字转字符串算法,之后会介绍。下面是代码:


/**
 * Judge whether string is a palindrome string
 * Environment: Dev-C++ 5.11
 * Author: 指点 
 */
#include <iostream>
#include <cstring>
#define MAXN 10010
using namespace std;


bool judgePalindrome(char *str, int len) {
    // 判断第 i 个字符是否和倒数第 i 个字符相等 
    for (int i = 0; i < len/2; i++) {
        if (str[i] != str[len-1-i]) {
            return false;
        }
    }
    return true;
}

int main() {
    char str[MAXN];
    // 采用这种输入方式可以录入空格
    while (cin.getline(str, MAXN)) {
        cout << (judgePalindrome(str, strlen(str)) ? "true" : "false") << endl; 
    }

    return 0;
} 

这里写图片描述

2、十进制数字转换为字符串

对于这个问题,其实标准库里面就有实现,C++ 中 cstdlib (C语言里面对应的是 stdlib.h )头文件中的 itoa函数就是其中一个例子,当然 cstdio (C语言里面对应的是 stdio.h)头文件中的 sprintf 函数也算是一种比较灵活的实现,读者可以查一下其相关用法。那么如果要我们自己实现呢?
处理这个问题步骤多了点,但是逻辑并不复杂:如果是正常的数字,那么就分为正数和负数,注意一下负数的处理,再注意一下小数部分和整数部分分开处理就好了:


/**
 * translate demical number to string 
 * Environment: Dev-C++ 5.11
 * Author: 指点 
 */
#include <iostream>
#include <cstring>
#define MAXN 100
using namespace std;

/**
 * 递归分解整数,使得字符串中储存的数字顺序和整数各位数字顺序一样 
 * 请注意这里参数 currentIndex 必须传引用(或者也可以用指针)
 */ 
void sloveInteger(char *result, int& currentIndex, int integer) {
    if (!integer) {
        return ;
    }
    sloveInteger(result, currentIndex, integer/10);
    result[currentIndex++] = integer%10 + '0';
}

// 分解小数 
void sloveDemical(char *result, int& currentIndex, double demical) {
    // 如果存在小数,那么储存一个小数点 
    if (demical) {
        result[currentIndex++] = '.';
    }
    // 不断把最接近小数点的那位小数变成整数(乘 10)并且储存,直到小数部分为 0 
    while (demical) {
        demical *= 10;
        result[currentIndex++] = (int)demical + '0';
        // 除去当前数字的整数部分 
        demical -= (int)demical;
    }
} 

char *transNumberToString(double number) {
    char *result = new char[MAXN];
    memset(result, 0, sizeof(char)*MAXN);
    int currentIndex = 0;

    // 如果数字为负数,那么先储存负号,然后转为正数处理 
    if (number < 0) {
        result[currentIndex+&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值