1.IP转换
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
void sovle(int n){
// 将十进制n输出为8位的二进制
for(int i=7; i>=0; i--) { //从高到低输出每一个二进制
if(n & 1<<i) { // 用按位与来判断当前为是1还是0
printf("1");
} else {
printf("0");
}
}
}
void sovle2(int n) {
int a[8];
for(int i=0; i<8; i++) { // 从低到高取出二进制的每一位
a[i] = n%2;
n /= 2;
}
for(int i=7; i>=0; i--) { // 倒着输出
printf("%d", a[i]);
}
}
int main(){
int a[4];
while(scanf("%d.%d.%d.%d", &a[0],&a[1],&a[2],&a[3])==4) {
for(int i=0; i<4; i++) {
if(i) printf(".");
sovle2(a[i]);
}
printf("\n");
}
return 0;
}
2.不重复数
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
bool fun(int n) {
// 判断n是否不存在连续两位相同
while(n>10) {
if(n%10 == n/10%10) return false; // 个位和十位相等
n /= 10; // 擦除个位
}
return true;
}
int main(){
int n;
while(scanf("%d", &n)==1) {
do{
n++;
} while(!fun(n));
printf("%d\n", n);
}
return 0;
}
3.跳码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int n = 5;
int vis[n][n]; // vis[i][j]标记(i,j)结点是否访问
int path[n*n]; // 记录遍历路径
int dir[8][2] = {{-1,-2},{-1,2},{-2,1},{-2,-1},{1,-2},{1,2},{2,-1},{2,1}}; // 8个方向
int cnt = 0; // 记录有多少种方案
int first = 1;
void dfs(int r, int c, int step) {
// dfs访问整个图,当前step步访问结点是(r,c)
vis[r][c] = 1; // 标记(r,c)访问
path[step] = r*n+c+1; // 当前访问
int nr, nc;
if(step==n*n-1) { // 成功访问完所有结点
cnt++; // 方案数+1
if(first) { // 输出第一种
for(int i=0; i<n*n; i++) {
printf("[%d,%d]\n", i+1, path[i]);
}
first = 0;
}
}
for(int i=0; i<8; i++) { // 尝试访问八个邻接结点
nr = r+dir[i][0], nc = c+dir[i][1]; // 下一步位置
if(0<=nr && nr<n && 0<=nc && nc<n && !vis[nr][nc]) { // 位置合法并且没有访问
dfs(nr, nc, step+1);
}
}
vis[r][c] = 0; // 回溯前清空标记
}
int main(){
dfs(0,0,0);
printf("%d\n", cnt);
return 0;
}
4.字符串统计
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1000; // 句子长度小于1000
char s[maxn];
int main(){
// scanf("%s", s); // 遇到空白符(空格、换行、Tab)接回停止输入
while(NULL!=fgets(s, maxn, stdin)) {
// 一次接受一行数据
int len = strlen(s); // 得到字符串的长度
len--; // 去掉换行符
int cnta = 0; // 统计字母个数
int cntWord = 0; // 统计单词数量
int temp[26]; // temp[0]保存A和a出现的次数,1保存B和b,...
memset(temp, 0, sizeof(temp)); // 初始化数组temp
for(int i=0; i<len; i++) { // 遍历字符串
if('a'<=s[i] && s[i]<='z' || 'A'<=s[i] && s[i]<='Z') { // 当前是字母
cnta++;
if(i+1<len && s[i+1]==' ') { // 当前是字母,下一个字符是空格,视为单词的分割
cntWord++;
}
if('a'<=s[i] && s[i]<='z') { // 小写字母
temp[s[i]-'a']++;
} else { // 大写字母
temp[s[i]-'A']++;
}
}
}
printf("字母个数:%d\n", cnta);
// cntWord += (s[len-1]!=' '); // 最后这个单词可能没有统计
// printf("len=%d, %d\n", len, s[len-1]!=' ');
if(s[len-1]!=' ') cntWord++;
printf("单词个数:%d\n", cntWord);
int maxcnt = 0; // 记录最多字母出现次数
for(int i=0; i<26; i++) { // 遍历26个字母
if(temp[i]>maxcnt) maxcnt = temp[i];
}
printf("出现次数最多的字母:");
int first = 1; // 标记第一次输出
for(int i=0; i<26; i++) {
if(temp[i] == maxcnt) {
if(!first) printf(",");
first = 0;
printf("%c", i+'a');
}
}
printf("\n出现次数:%d\n", maxcnt);
}
return 0;
}