背景
最近在恶补数据结构和算法相关的知识,查询到一本比较好的书籍算法笔记,然后就开始学习了,学完第二章C/C++语言基础后,做了第三章的题目,虽然书上已经有题解了,但是还是想发表这篇文章,原因是通过记录下来我的学习过程,以提醒和鼓励自己。
第三章题解
#include <stdio.h>
#include <cstring>
int main() {
}
/**
* 说反话
* @return
*/
int reverseWords() {
char strOri[80] = {};
char words[40][80] = {};
gets(strOri);
int rowNum = 0;
int colNum = 0;
for (int i = 0; i < strlen(strOri); ++i) {
//不是空格的就放入二维数组,直到遇到空格,改成下一行
if (strOri[i] != ' ') {
words[rowNum][colNum] = strOri[i];
colNum++;
} else {
rowNum++;
colNum = 0;
}
}
//倒叙输出二维数组的单词
for (int i = rowNum; i >= 0; i--) {
printf("%s ", words[i]);
}
}
/**
* 判断回环字符串
* @return
*/
int loopback() {
char str[256] = {};
scanf("%s", str);
int length = strlen(str);
for (int i = 0; i < length / 2; ++i) {
if (str[i] != str[length - i - 1]) {
printf("%s", "NO");
return 0;
}
}
printf("%s", "YES");
return 0;
}
/**
* 进制转换
* @return
*/
int baseChange() {
//a,b<= 2^30 -1,1<n<=10
//a+b<= 2^31 -2
//int 范围:2^31-1,所以a+b可以用int来接收
int a, b, d;
scanf("%d%d%d", &a, &b, &d);
int sum = a + b;
int resultNumber[32] = {0};
//除基取余
int i = 0;
for (;; ++i) {
resultNumber[i] = sum % d;
if (sum / d == 0) {
break;
}
sum = sum / d;
}
for (int j = i; j >= 0; j--) {
printf("%d", resultNumber[j]);
}
return 0;
}
/**
* 日期计算器
* @return
*/
int dateCal() {
int date1, date2;
scanf("%d%d", &date1, &date2);
if (date1 > date2) {
int tmp = date1;
date1 = date2;
date2 = tmp;
}
int yy1 = date1 / 10000, mm1 = date1 % 10000 / 100, dd1 = date1 % 100;
int yy2 = date2 / 10000, mm2 = date2 % 10000 / 100, dd2 = date2 % 100;
//第一个日期不断加N天,直到等于第二个日期
int n = 0;
while (true) {
//构建新日期串
dd1 = dd1 + 1;
int ddlast = 0;
bool is31 = mm1 % 2 == 1 || mm1 == 8;
if (is31) {
ddlast = 31;
} else if (mm1 == 2) {
//判断是否闰年
bool isRun = (yy1 % 4 == 0 && yy1 % 100 != 0) || (yy1 % 400 == 0) ? true : false;
if (isRun) {
ddlast = 29;
} else {
ddlast = 28;
}
} else {
ddlast = 30;
}
if (dd1 > ddlast) {
dd1 = 1;
mm1 = mm1 + 1;
}
if (mm1 > 12) {
mm1 = 1;
yy1 = yy1 + 1;
}
if (!(dd1 == dd2 && mm1 == mm2 && yy1 == yy2)) {
n += 1;
} else {
break;
}
}
printf("%d", n + 2);
return 0;
}