引言
实际编程中,很多编程语言都帮我们实现了一些常用的较简单的算法,当然,在一些需求中,我们也需要自己实现一些算法,这里总结一些常用的算法,采用 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+&#