入门模拟
-
简单模拟
- PAT B1001 害死人不偿命的(3n+1)猜想
// time: 2018.01.03 // title: PAT B1001 害死人不偿命的(3n+1)猜想 P85 // idea: 利用循环直接模拟即可 #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int main() { int m=0, n; // m 步数 scanf("%d", &n); while(n != 1) { if(n%2 == 0) { n /= 2; // 偶数 } else { n = (3*n+1) / 2; // 奇数 } m++; } printf("%d", m); return 0; }
- PAT B1032 挖掘机技术哪家强
// time: 2018.1.3 // title: PAT B1032 挖掘机技术哪家强 P86 // idea: 用数组储存,依次比较,记录最大值以及相应学校编码 #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int main() { int score[100000] = {0}; int n, k, s; // 记录数, 学校编号,分数 int max = 0, maxk = -1; // 记录最大值和相应学校编码 scanf("%d", &n); for(int i=0; i<n; ++i) { scanf("%d %d", &k, &s); score[k] += s; if(score[k] > max) { // 记录最大值和相应编号 max = score[k]; maxk = k; } } printf("%d %d\n", maxk, max); return 0; }
- PAT B1001 害死人不偿命的(3n+1)猜想
-
查找元素
- codeup 1934 找x
// time: 2018.1.3 // title: codeup 1934 找x // idea: 用一个数组存储n个数,遍历查找x #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxn = 201; int num[maxn] = {0}; int main() { int n, x, k = -1; // n 数值个数 x 查询键值 k 下标 scanf("%d", &n); for(int i=0; i<n; ++i) { // 将输入数据储存在数组中 scanf("%d", num+i); } scanf("%d", &x); for(int i=0; i<n; ++i) { if(num[i] == x) { k = i; break; } } printf("%d\n", k); return 0; }
- codeup 1934 找x
-
图形输出
- PAT B1036 跟奥巴马一起编程
// time: 2018.1.3 // title: PAT B1036 跟奥巴马一起编程 // idea: 当列数col为奇数时,行数row是col/2+1 当列数为偶数时,行数为col/2 // 第1行和第row行输出row个字符C // 其他行输出首尾字符C加col-2个空格 #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int main() { int col, row; // 行 列 char c; // 字符C scanf("%d %c", &col, &c); if(col%2) { // 计算行数row row = col/2+1; // 奇 } else { row = col/2; // 偶 } for(int i=1; i<=row; ++i) { if(i==1 || i==row) { // 输出第一行和最后一行 for(int j=1; j<=col; ++j) { printf("%c", c); } } else { // 输出中间row-2行 printf("%c", c); for(int j=1; j<=col-2;++j) { printf(" "); } printf("%c", c); } printf("\n"); } return 0; }
- PAT B1036 跟奥巴马一起编程
-
日期处理
- codeup 1928 日期差值 *
/* codeup 1928 日期差值 书上代码 思路:简单模拟,在第一个日期没到第二个日期时循环 */ #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int month[13][2] = { // 平年 闰年 每月天数 {0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31} }; bool isLeap(int year) { // 判断是否是闰年 return ((year%4==0 && year%100!=0) || year%400==0); } int main() { int time1, y1, m1, d1; int time2, y2, m2, d2; while(scanf("%d%d", &time1, &time2) != EOF) { if(time1 > time2) { // 若time1在time2之后,交换 int temp = time1; time1 = time2; time2 = temp; } y1 = time1/10000, m1=time1%10000/100, d1=time1%100; y2 = time2/10000, m2=time2%10000/100, d2=time2%100; int ans = 1; // 记录结果 // 第一个日期没到第二个日期时进行循环 while(y1<y2 || m1<m2 || d1<d2) { d1++; if(d1 == month[m1][isLeap(y1)+1]) { m1++; // 日期变为下个月的1号 d1 = 1; } if(m1 == 13) { y1++; // 日期变为下一年一月 m1 = 1; } ans++; // 累计 } printf("%d\n", ans); } return 0; }
- codeup 1928 日期差值 *
-
进制转换
- 对一个P进制的数,如果转换为Q进制,需要分为两步:
- 将P进制数x转换为十进制数y
- 将十进制数y转换为Q进制数z
- PAT B1022 D进制的A+B
/* PAT B1022 D进制的A+B 先计算A+B,再将结果转换为D进制数(除基取余法) */ #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int main() { int a, b, d; scanf("%d%d%d", &a, &b, &d); int sum = a+b; int z[40], num=0; // z储存d进制数的每一位 do { // 除基取余法 z[num++] = sum%d; sum/=d; } while(sum!=0); for(int i=num-1; i>=0; --i) { // 从后往前输出 printf("%d", z[i]); } return 0; }
- 对一个P进制的数,如果转换为Q进制,需要分为两步:
-
字符串处理 *
- codeup 5901 回文串
/* codeup 5901 回文串 思路:遍历字符数组前半部分,比较该字符与其对称字符,若不同,则不是回文串 */ #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int main() { char s[256]; // 储存输入字符串 scanf("%s", &s); int i; // strlen函数获取字符数组长度 for(i=0; i<strlen(s)/2; ++i) { // 遍历字符数组前半部分 if(s[i] != s[strlen(s)-1-i]) { break; } } if(i<strlen(s)/2) { // 有字符不对称情况跳出循环,不是回文串 printf("NO\n"); } else { // 是回文串 printf("YES\n"); } return 0; }
-
PAT B1009 说反话
/* PAT B1009 说反话 思路:先按顺序读入字符串到字符数组中,再按逆序输出 **也可以先用gets把整行数据输入到字符数组,然后按字符遍历,遇到空格则为下一个字符 */ #include <cstdio> #include <string> #include <algorithm> #include <cmath> using namespace std; int main() { char str[81][81]; // 储存字符串 int num = 0; // 计数 while(scanf("%s", str[num]) != EOF) { num++; } for(int i=num-1; i>=0; --i) { printf("%s", str[i]); if(i>0) printf(" "); } return 0; }
- codeup 5901 回文串