进制转换&字符串

(节选自《算法笔记》)

进制转换

P进制数转十进制数y

1
2
3
4
5
6
int y=0,product=1;
while(x!=0){
y=y+(x%10)*product;//y是结果,x%10为了得到个位数
x=x/10;
product=prodcut*P;//product的值会分别变成1,p,p^2,p^3,p^4…
}

十进制数y转换成Q进制数z

1
2
3
4
5
int z[40],num=0;
do{
z[num++]=y%Q;//除基取余
y=y/Q;
}while(y!=0);

这样z数组从高位z[num-1]到低位z[0]即为Q进制z,进制转换完成。

字符串

回文串

回文串是常常出现的一种考题。

对于回文串的处理:1.根据对称性;2.利用for循环,从后向前遍历(逻辑性比较简单)

思路1.

假设字符串str的下标从0开始,由于“回文串”是正读和反读都一样呃字符串,因此只需要遍历字符串的前一半(注意:不需要取到i==len/2),如果出现字符str[i]不等于其对称位置str[len-1-i],就说明这个字符串不是“回文串”;如果前一半的所有字符str[i]都等于对称位置 str[len-1-i],则说明这个字符串是回文串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cstdio>
#include <cstring>
const int maxn=256;
//判断字符串str是否是“回文串”
bool judge(char str[]){
int len =strlen(str);//字符串长度
forint i=0;i<len/2;i++){//i枚举字符串的前一半
if(str[i]!=str[len-1-i]){
return false;
}

}
return true;
}

例题

百练 2017大数据研究中心夏令营上机考试 B:单词倒排

& PAT B1009 说反话

比较简单的一道题,输入输出格式大概如下:

样例输入

1
I am a student

样例输出

1
student a am I

总之要求是倒序输出。

主要思路,get到一串字符串(包括换行符)

我开始的思路:用string getline(cin,str); 然后根据空格截取字符串,然后倒序输出字符串。

这里最后多输出空格可能会导致格式错误

在网上看到另一个代码感觉也很机智了,直接输入字符存储。(https://blog.csdn.net/vivaespana51/article/details/79742003):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include <iostream>
#include <string.h>
using namespace std;
int main() {
char t[100][100] = {" "};
int n = 0;
while (cin >> t[n]) {
n++;
}
for (int i = n - 1; i >= 0; i--)//逆序输出字符串
printf("%s ", t[i]);
cout << endl;
return 0;
}