简单模拟
问题 A 剩下的树
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
int L, M, sum, left, right, i;
while(scanf("%d%d", &L, &M), L!=0){
int road[10001] = {};
sum = 0;
while(M--){
scanf("%d%d", &left, &right);
//fill函数的赋值范围(区间)first和last(上面代码中的left, right)是左闭右开,也就是[First,Last)
fill(road + left, road + right + 1, 1);
}
for(int i = 0; i <= L; i++){
if(road[i] == 0) sum++;
}
printf("%d\n", sum);
}
return 0;
}
【PAT B1032】 挖掘机技术哪家强
#include<stdio.h>
const int maxn = 100010;
int school[maxn] = {0};
int main(){
int n, schId, score;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %d", &schId, &score);
school[schId] += score;
}
int k = 1, MAX = -1;
for(int i = 0; i < n; i++){
if(school[i] > MAX){
MAX = school[i];
k = i;
}
}
printf("%d %d", k, MAX);
return 0;
}
【PAT B1001】 害死人不偿命的3n+1猜想
#include<stdio.h>
int main(){
int n, step = 0;
scanf("%d", &n);
while(n != 1){
if(n % 2 == 0) n = n / 2;
else n = (3 * n + 1) / 2;
step++;
}
printf("%d", step);
return 0;
}
本节习题
http://codeup.cn/contest.php?cid=100000575
问题 A 剩下的树-2
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
int L, M, sum, left, right;
while(scanf("%d%d", &L, &M), L!=0){
sum = L + 1;
int min, max;
scanf("%d%d", &left, &right);
min = left;
max = right;
M--;
while(M--){
scanf("%d%d", &left, &right);
if(left <= max){ //区间与前面的连续(有重叠)
if(left < min) min = left;
if(right > max) max = right;
} else { //区间与前面的不连续(有间隔)
sum += (left - max + 1) - 2; //先加上间隔中的树
if(left < min) min = left;
if(right > max) max = right;
}
}
sum -= (max - min + 1);
printf("%d\n", sum);
}
return 0;
}
问题 B A+B
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
int long A, B;
char a[20], b[20];
while(scanf("%s %s", &a, &b) != EOF){
//将字符串a中的","去掉
int len_a = strlen(a);
int k = 0; //记录","的个数
for(int i = 0; i < len_a; i++){
if(a[i] != ',') continue;
else{
k++;
for(int j = i; j < len_a - 1; j++){
a[j] = a[j + 1];
}
}
}
a[len_a-k] = '\0';
A = atoi(a); // atoi函数将字符串转为int型,需导入stdlib.h头文件
//将字符串b中的","去掉
int len_b = strlen(b);
k = 0; //记录","的个数
for(int i = 0; i < len_b; i++){
if(b[i] != ',') continue;
else{
k++;
for(int j = i; j < len_b - 1; j++){
b[j] = b[j + 1];
}
}
}
b[len_b-k] = '\0';
B = atoi(b);
printf("%d\n", A + B);
}
return 0;
}
问题 C 特殊乘法
#include<stdio.h>
int main(){
int a, b, p;
while(scanf("%d%d", &a, &b) != EOF){
p = 0;
for(int i = a; i > 0; i /= 10){
for(int j = b; j > 0; j /= 10){
p += (i % 10) * (j % 10);
}
}
printf("%d\n", p);
}
return 0;
}
问题 D 比较奇偶数个数
#include<stdio.h>
int main(){
int n, temp, odd_count = 0, even_count = 0;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d", &temp);
if(temp % 2) odd_count++;
else even_count++;
}
if(even_count > odd_count) printf("NO\n");
else printf("YES\n");
}
return 0;
}
问题 E Shortest Distance (20)2
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int num[maxn], n, tot, ans;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
num[i] = num[i - 1] + x;
tot += x;
}
int k;
scanf("%d", &k);
while (k--)
{
int x, y;
scanf("%d%d", &x, &y);
if (x > y)swap(x, y);
int dis = num[y - 1] - num[x - 1];
ans = min(dis, tot - dis);
printf("%d\n", ans);
}
return 0;
}
问题 E Shortest Distance (20)
#include<stdio.h>
int main(){
int n, m, p1, p2, total = 0;
scanf("%d", &n);
int distance[n];
for(int i = 0; i < n; i++){
scanf("%d", &distance[i]);
total += distance[i];
}
scanf("%d", &m);
for(int i = 0; i < m; i++){
scanf("%d%d", &p1, &p2);
int d1 = 0, d2 = 0;
if(p1 > p2){
int temp = p1;
p1 = p2;
p2 = temp;
}
for(int i = p1; i < p2; i++){
d1 += distance[i - 1];
}
d2 = total - d1;
if(d1 > d2) printf("%d\n", d2);
else printf("%d\n", d1);
}
return 0;
}
问题 F A+B和C (15)-2
#include<iostream>
using namespace std;
#define N 10
int main(void){
int T = 0;
int long A[N], B[N], C[N];
cin >> T;
for (int i = 0; i < T; i++) {
cin >> A[i] >> B[i] >> C[i];//注意这种输入方式
}
for(int j = 0;j < T; j++){
(A[j] > C[j] - B[j]) ? cout<<"Case #"<<(j+1)<<": true"<<endl:cout<<"Case #"<<(j+1)<<": false"<<endl;
}
return 0;
}
问题 F A+B和C (15)
#include<stdio.h>
int main(){
int n;
long int a[11], b[11], c[11];
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d%d%d", &a[i], &b[i], &c[i]);
}
for(int i = 0; i < n; i++){
if(a[i] > c[i] - b[i]) printf("Case #%d: ture\n", i + 1);
else printf("Case #%d: false\n", i + 1);
}
return 0;
}
问题 G 数字分类 (20)
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
int num[1001], A[5] = {0}, a1 = 1, a3 = 0;
for(int i = 0; i < n; i++){
scanf("%d", &num[i]);
if(num[i] % 5 == 0 && num[i] % 2 == 0){
A[0] += num[i];
}
else if(num[i] % 5 == 1){
A[1] += a1 * num[i];
a1 *= -1;
}
else if(num[i] % 5 == 2)
A[2] += 1;
else if(num[i] % 5 == 3){
a3++;
A[3] += num[i];
}
else if(num[i] % 5 == 4 && num[i] > A[4])
A[4] = num[i];
}
for(int i = 0; i < 5; i++){
if(i == 3 && a3 > 0) printf("%.1f", (double)A[3]/a3);
else if(A[i] != 0) printf("%d", A[i]);
else printf("N");
if(i < 4) printf(" ");
}
return 0;
}
问题 G 数字分类 (20)-2
#include<stdio.h>
int main()
{
int i,n,a[1001],sum1,sum2,count1,count2;
scanf("%d",&n);
sum1=sum2=count1=count2=0;
double avg,sum3=0;
int flag=1,max=0,t=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]%5==0&&a[i]%2==0)
sum1+=a[i];
if(a[i]%5==1){
sum2+=a[i]*flag;
flag=flag*-1;
t++;
}
if(a[i]%5==2)
count1++;
if(a[i]%5==3){
sum3+=a[i];
count2++;
}
if(a[i]%5==4)
{
if(a[i]>max)
max=a[i];
}
}
avg=sum3/count2;
if(sum1==0)
printf("N ");
else
printf("%d ",sum1);
if(t==0)
printf("N ");
else
printf("%d ",sum2);
if(count1==0)
printf("N ");
else
printf("%d ",count1);
if(count2==0)
printf("N ");
else
printf("%.1lf ",avg);
if(max==0)
printf("N");
else
printf("%d",max);
return 0;
}
问题 H 部分A+B (15)
#include<stdio.h>
int main(){
long int A, B, P_A, P_B;
int D_A, D_B;
while(scanf("%d%d%d%d", &A, &D_A, &B, &D_B) != EOF ){
P_A = 0;
P_B = 0;
while(A){
if(A % 10 == D_A) P_A = (P_A * 10 + A % 10);
A /= 10;
}
while(B){
if(B % 10 == D_B) P_B = (P_B * 10 + B % 10);
B /= 10;
}
printf("%d\n", P_A + P_B);
}
return 0;
}
问题 I 锤子剪刀布 (20)
#include<stdio.h>
#include<string.h>
int main(){
int n, A[3] = {0}, B[3] = {0}, s1[3] = {0}, s2[3] = {0};
char a, b;
scanf("%d", &n);
while(n--){
getchar();
scanf("%c %c", &a, &b);
if(a == 'C'){
if(b == 'C'){
A[1]++;
B[1]++;
} else if (b == 'J'){
A[0]++;
B[2]++;
s1[0]++;
} else if (b == 'B'){
A[2]++;
B[0]++;
s2[2]++;
}
} else if(a == 'J'){
if(b == 'C'){
A[2]++;
B[0]++;
s2[0]++;
} else if (b == 'J'){
A[1]++;
B[1]++;
} else if (b == 'B'){
A[0]++;
B[2]++;
s1[1]++;
}
} else if(a == 'B'){
if(b == 'C'){
A[0]++;
B[2]++;
s1[2]++;
} else if (b == 'J'){
A[2]++;
B[0]++;
s2[1]++;
} else if (b == 'B'){
A[1]++;
B[1]++;
}
}
}
printf("%d %d %d\n", A[0], A[1], A[2]);
printf("%d %d %d\n", B[0], B[1], B[2]);
int max_s1 = 0, max_s2 = 0, p, q;
for(int i = 0; i < 3; i++){
if(s1[i] > max_s1){
max_s1 = s1[i];
p = i;
}
if(s2[i] > max_s2){
max_s2 = s2[i];
q = i;
}
}
char CJB[3];
strcpy(CJB, "CJB");
printf("%c %c", CJB[p], CJB[q]);
return 0;
}
问题 I 锤子剪刀布 (20)2
#include <stdio.h>
int judge(char x,char y) //判断输赢
{
if(x=='C')
{
if(y=='C')
return 0;
else if(y=='J')
return 1;
else if(y=='B')
return 2;
}
if(x=='J')
{
if(y=='C')
return 2;
else if(y=='J')
return 0;
else if(y=='B')
return 1;
}
if(x=='B')
{
if(y=='C')
return 1;
else if(y=='J')
return 2;
else if(y=='B')
return 0;
}
}
int aa(int c,int j,int b) //判断出哪个获胜最多并输出
{
if(b>=c)
{
if(b>=j)
printf("B");
else
printf("J");
}
else
{
if(c>=j)
printf("C");
else
printf("J");
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
char a,b;
int jw,jl,je,yw,yl,ye,jc,jj,jb,yc,yj,yb;
jw=jl=je=yw=yl=ye=jc=jj=jb=yc=yj=yb=0;
for(int i=0;i<n;i++)
{
getchar();
scanf("%c %c",&a,&b);
if(judge(a,b)==0) //平局
{
je++;
ye++;
}
if(judge(a,b)==1) //甲赢
{
jw++;
yl++;
if(a=='C')
jc++;
else if(a=='J')
jj++;
else if(a=='B')
jb++;
}
if(judge(a,b)==2) //甲输
{
jl++;
yw++;
if(b=='C')
yc++;
else if(b=='J')
yj++;
else if(b=='B')
yb++;
}
}
printf("%d %d %d\n",jw,je,jl);
printf("%d %d %d\n",yw,ye,yl);
aa(jc,jj,jb);
printf(" ");
aa(yc,yj,yb);
printf("\n");
return 0;
}
/*
写的超级长,改了超级久,写的很烂,又臭又长...
最后发现就一个错误,在第60行少加了一句getchar();
至于为什么要加这一句,请移步https://blog.csdn.net/weixin_44562957/article/details/104117402
*/
查找元素
【codeup 1934】找x
#include<cstdio>
const int maxn = 210;
int a[maxn];
int main(){
int n, x;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &x);
int k;
for(k = 0; k < n; k++){
if(a[k] == x){
printf("%d\n", k);
break;
}
}
if(k == n){
printf("-1\n");
}
}
return 0;
}
本节习题
http://codeup.cn/contest.php?cid=100000576
【问题 A 统计同成绩学生人数
#include<cstdio>
const int maxn = 10010;
int a[maxn];
int main(){
int n, x;
while(scanf("%d", &n), n != 0){
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &x);
int k = 0;
for(int i = 0; i < n; i++){
if(a[i] == x) k++;
}
printf("%d\n", k);
}
return 0;
}
问题 B 找x-2
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct Student
{
char no[100];//题目中,学号前有数字0,所以用char来存储
char name[100];
char sex[5];
int age;
bool operator < (const Student & A) const
{
return strcmp(no,A.no)<0;
}
} buf[1001];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0; i<n; i++)
{
scanf("%s %s %s %d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
}
sort(buf,buf+n);//按照学号从小到大排序
int t;
scanf("%d",&t);
while(t--)
{
int ans=-1;
char x[30];
scanf("%s",x);
int top=n-1,base=0;
while(top>=base)
{
int mid=(top+base)/2;
int tmp=strcmp(buf[mid].no,x);
if(tmp==0)
{
ans=mid;
break;
}
else if(tmp>0)
{
top=mid-1;
}
else
{
base=mid+1;
}
}
if(ans==-1)
{
printf("No Answer!\n");
}
else
{
printf("%s %s %s %d\n",buf[ans].no,buf[ans].name,buf[ans].sex,buf[ans].age);
}
}
}
return 0;
}
问题 D 查找
#include<stdio.h>
int main(){
int n, m, x, a[101];
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &m);
for(int i = 0; i < m; i++){
scanf("%d", &x);
int j;
for(j = 0; j < n; j++){
if(a[j] == x){
printf("YES\n");
break;
}
}
if(j == n) printf("NO\n");
}
}
return 0;
}
问题 E 学生查询
#include<stdio.h>
struct student{
int no;
char name[20];
char gender[20];
int age;
}stu[20];
int main(){
int m, n, x;
while(scanf("%d", &m) != EOF){
while(m--){
getchar();
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %s %s %d", &stu[i].no, &stu[i].name, &stu[i].gender, &stu[i].age);
}
scanf("%d", &x);
x -= 1;
if(x < n) printf("%d %s %s %d\n", stu[x].no, stu[x].name, stu[x].gender, stu[x].age);
}
}
return 0;
}
图形输出
【PAT B11036】跟奥巴马一起编程
#include<stdio.h>
int main(){
int row, col;
char c;
scanf("%d %c", &col, &c); //列数 字符
if(col % 2 == 1) row = col / 2 + 1; // col为奇数,向上取整
else row = col / 2;
//第一行
for(int i = 0; i < col; i++){
printf("%c", c);
}
printf("\n");
for(int i = 2; i < row; i++){
printf("%c", c); //每行的第一个字符
for(int j = 0; j < col -2; j++){
printf(" "); //col-2个空格
}
printf("%c\n", c); //每行最后一个字符
}
//第row行
for(int i = 0; i < col; i++){
printf("%c", c);
}
return 0;
}
本节习题
http://codeup.cn/contest.php?cid=100000577
问题 A 输出梯形
#include<stdio.h>
//notice: 题目并没有说明有多组数据,然而……
int main(){
int h;
while(scanf("%d", &h) != EOF){
for(int i = 0; i < h; i++){
for(int j = 0; j < 2 * (h - i - 1); j++){
printf(" ");
}
for(int k = 0; k < h + 2 * i; k++){
printf("*");
}
printf("\n");
}
}
return 0;
}
问题 B Hello World for U
#include<stdio.h>
#include<string.h>
int main(){
char s[100];
int len, side, mid;
while(scanf("%s", s) != EOF){
len = strlen(s);
side = (len + 2) / 3;
mid = len - 2 * side;
for(int i = 0; i < len; i++){
if(i < side - 1){
printf("%c", s[i]);
for(int j = 0; j< mid; j++){
printf(" ");
}
printf("%c\n", s[len - i -1]);
}
else if(i < len - side + 1) printf("%c", s[i]);
}
printf("\n");
}
return 0;
}
问题 C 等腰梯形
#include<stdio.h>
#include<string.h>
int main(){
int n, h;
scanf("%d", &n);
while(n--){
scanf("%d", &h);
for(int i = 0; i < h; i++){
for(int j = 0; j < h - i - 1; j++) printf(" ");
for(int k = 0; k < h + 2 * i; k++) printf("*");
printf("\n");
}
}
return 0;
}
问题 D 沙漏图形 tri2str
#include<stdio.h>
#include<string.h>
int main(){
int n;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
for(int k = i; k > 0; k--) printf(" ");
for(int j = 0; j < n - i; j++){
printf("*");
if(j < n - i - 1) printf(" ");
}
printf("\n");
}
for(int i = n - 2; i >= 0; i--){
for(int k = i; k > 0; k--) printf(" ");
for(int j = 0; j < n - i; j++){
printf("*");
if(j < n - i - 1) printf(" ");
}
printf("\n");
}
}
return 0;
}
日期差值
【codeup 1928】日期差值
#include<cstdio>
int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
{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){ //第一个日期晚于第二个日期则交换
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++; //天数加1
if(d1 == month[m1][isLeap(y1)] + 1){ //满当月天数
m1++; //日期变为下个月1号
d1 = 1;
}
if(m1 == 13){ //月份满12个月
y1++;
m1 = 1;
}
ans++; //累计
}
printf("%d\n", ans); //输出结果
}
return 0;
}
本节习题
http://codeup.cn/contest.php?cid=100000578
问题 A 日期差值
#include<stdio.h>
bool isleap(int year)
{
bool leap = false;
if((year%4==0&&year%100!=0)||year%400==0)
leap = true;
return leap;
}
int main()
{
struct date{
int y,m,d;
}a,b;
int date1,date2;
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}
};//2D数组,分别表示平年闰年的每个月的天数
while(scanf("%d%d",&date1,&date2)!=EOF){
if(date1>date2){
int t=date1;date1=date2;date2=t;
}
int result=0;
struct date a={date1/10000,date1/100%100,date1%100};
struct date b={date2/10000,date2/100%100,date2%100};
if(a.y!=b.y){//异年
result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数
result += b.d; //月初到 b.d的天数
for(int i=a.y+1;i<b.y;i++){//计算中间年的天数
if(isleap(i)){
result+=366;
}
else result+=365;
}
while(a.m+1<=12){//a.m的下一个月开始到本年的12月的天数
result+=month[a.m+1][isleap(a.y)];
a.m++;
}
for(int i = 1;i<b.m;i++){//1月开始到b.m-1月的天数
result+=month[i][isleap(b.y)];
}
}
else if(a.m!=b.m){//同年异月
result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数
result += b.d;//月初到 b.d的天数
for(int i=a.m+1;i<b.m;i++){//中间月的天数
result+=month[i][isleap(a.y)];
}
}
else{//同年同月
result += b.d-a.d+1;
}
printf("%d\n",result);
}
return 0;
}
问题 B Day of Week
#include<cstdio>
#include<cstring>
int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
{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}
};
char week[10][20] = { {},{"Monday"}, {"Tuesday"}, {"Wednesday"}, {"Thursday"}, {"Friday"},
{"Saturday"}, {"Sunday"}
};
int enM2month(char s[]){
if(strcmp(s, "January") == 0) return 1;
else if(strcmp(s, "February") == 0) return 2;
else if(strcmp(s, "March") == 0) return 3;
else if(strcmp(s, "April") == 0) return 4;
else if(strcmp(s, "May") == 0) return 5;
else if(strcmp(s, "June") == 0) return 6;
else if(strcmp(s, "July") == 0) return 7;
else if(strcmp(s, "August") == 0) return 8;
else if(strcmp(s, "Septempber") == 0) return 9;
else if(strcmp(s, "October") == 0) return 10;
else if(strcmp(s, "November") == 0) return 11;
else if(strcmp(s, "December") == 0) return 12;
else return false;
};
int main(){
int y1, m1, d1;
char enM1[15];
while(scanf("%d %s %d", &d1, enM1, &y1) != EOF){
m1 = enM2month(enM1);
if (m1 == 1 || m1 == 2) {//对1、2月进行修正;
m1 += 12;
y1--;
}
int j = (d1 + 2 * m1 + 3 * (m1 + 1) / 5 + y1 + y1 / 4 - y1 / 100 + y1 / 400) % 7 + 1;
printf("%s\n", week[j]); //输出结果
}
return 0;
}
问题 B Day of Week-2
#include <cstdio>
#include <cstring>
// 使用基姆拉尔森计算公式来计算对应的星期;公式中1、2月份对应上一年的13、14月份,计算结果从0~6分别对应星期一~七;
char month[15][20] = { {}, {"January"}, {"February"}, {"March"}, {"April"}, {"May"},
{"June"}, {"July"}, {"August"}, {"September"}, {"October"}, {"November"}, {"December"}
};
char week[15][20] = { {"Monday"}, {"Tuesday"}, {"Wednesday"}, {"Thursday"}, {"Friday"},
{"Saturday"}, {"Sunday"}
};
int main()
{
int d, y, k;
char m[15];
while (scanf ("%d %s %d", &d, m, &y) != EOF) {
for (int i = 0; i < 13; i++) {
if (strcmp (month[i], m) == 0) k = i;
}
if (k == 1 || k == 2) { //对1、2月进行修正;
k += 12;
y--;
}
int j = (d + 2 * k + 3 * (k + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
printf ("%s\n", week[j]); //0~6分别对应星期一到天;
}
return 0;
}
问题 C 打印日期
#include<cstdio>
int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
{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 y1, m1, d1, n;
while(scanf("%d%d", &y1, &n) != EOF){
m1 = 1, d1 = 0;
while(n--){
d1++; //天数加1
if(d1 == month[m1][isLeap(y1)] + 1){ //满当月天数
m1++; //日期变为下个月1号
d1 = 1;
}
if(m1 == 13){ //月份满12个月
y1++;
m1 = 1;
}
}
printf("%04d-%02d-%02d\n", y1, m1, d1); //输出结果
}
return 0;
}
问题 D 日期类
#include<cstdio>
int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
{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);
}
struct Date{
int y, m, d;
};
int main(){
Date day;
int m;
scanf("%d", &m);
while(m--){
scanf("%d%d%d", &day.y, &day.m, &day.d);
int n = 1;
while(n--){
day.d++; //天数加1
if(day.d == month[day.m][isLeap(day.y)] + 1){ //满当月天数
day.m++; //日期变为下个月1号
day.d = 1;
}
if(day.m == 13){ //月份满12个月
day.y++;
day.m = 1;
}
}
printf("%04d-%02d-%02d\n", day.y, day.m, day.d); //输出结果
}
return 0;
}
问题 E 日期累加
#include<cstdio>
int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
{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);
}
struct Date{
int y, m, d;
};
int main(){
Date day;
int m, n;
scanf("%d", &m);
while(m--){
scanf("%d%d%d%d", &day.y, &day.m, &day.d, &n);
while(n--){
day.d++; //天数加1
if(day.d == month[day.m][isLeap(day.y)] + 1){ //满当月天数
day.m++; //日期变为下个月1号
day.d = 1;
}
if(day.m == 13){ //月份满12个月
day.y++;
day.m = 1;
}
}
printf("%04d-%02d-%02d\n", day.y, day.m, day.d); //输出结果
}
return 0;
}
进制转换
【PAT B1022】D进制A+B
#include<cstdio>
int main(){
int a, b, d;
scanf("%d%d%d", &a, &b, &d);
int sum = a + b;
int ans[31], num = 0; //ans存放D进制的每一位
do{
ans[num++] = sum % d;
sum /= d;
} while(sum != 0);
for(int i = num - 1; i >= 0; i--){ //从高位到低位进行输出
printf("%d", ans[i]);
}
return 0;
}
本节习题
http://codeup.cn/contest.php?cid=100000579
问题 A 又一版 A+B
#include<cstdio>
int main(){
long long int a, b, sum;
int m;
while(scanf("%d", &m), m != 0){
scanf("%d%d", &a, &b);
int z[100], num = 0;
sum = a + b;
do{
z[num++] = sum % m;
sum /= m;
} while(sum != 0);
for(int i = num - 1; i >= 0; i--){
printf("%d", z[i]);
}
printf("\n");
}
return 0;
}
问题 B 找x
#include<cstdio>
#include<string.h>
#include<stdlib.h>
/*notice:
自己运行样例很正确,但是在codeup上测试就是答案错误,一直在找问题,最后花钱下载了测试数据和源码。
发现数据里的名字一列最长有70多位远远超出我设置的数组大小,用string应该不用考虑这个问题
*/
struct student{
char no[100];
char name[100];
char sex[5];
int age;
};
const int maxn = 1010;
student stu[maxn];
int main(){
int n, m;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%s %s %s %d", &stu[i].no, &stu[i].name, &stu[i].sex, &stu[i].age);
}
scanf("%d", &m);
int x = 0;
char str[4];
for(int i = 0; i < m; i++){
scanf("%s", str);
x = atoi(str) - 1;
if(x < n) printf("%s %s %s %d\n", stu[x].no, stu[x].name, stu[x].sex, stu[x].age);
else printf("No Answer!\n");
}
}
return 0;
}
问题 B 数制转换
#include<stdio.h>
#include<string.h>
int main()
{
int a,b;
char num[40];
while(scanf("%d%s%d",&a,num,&b)!=EOF)
{
char res[50];
long c=0;
int len=strlen(num);
//printf("num=%s\n",num);
for(int i=0;i<len;i++)
{
if(num[i]<='9'&&num[i]>='0')
{
c=num[i]-'0'+c*a;
//printf("c=%d;\n",c);
}
else if(num[i]>='A'&&num[i]<='F')
{
c=num[i]-'A'+10+c*a;
}
else if(num[i]>='a'&&num[i]<='f')
{
c=num[i]-'a'+10+c*a;
}
}
//printf("c=%ld\n",c);
int p,j=0;
do
{
p=c%b;
res[j++]=(p<10)?(p+'0'):((p-10)+'A');
c/=b;
}while(c>0);
//printf("j-1=%d\n",j-1);
//printf("strlen(res)-1=%d\n",strlen(res)-1);
for(int i=j-1;i>=0;i--)
{
printf("%c",res[i]);
}
printf("\n");
}
return 0;
}
问题 C 进制转换
#include<stdio.h>
int main(){
char n[40], buf[200]; //n分别将大数、二进制数以字符串形式存储
int num[40], len, i, len_str, c, tmp, j; //int型数组sum存储大数的每一位数字
while (scanf("%s", n) != EOF){
for (len = 0; n[len]; len++){ //到字符串n的结束位(-1)时退出循环
num[len] = n[len] - '0';
}
i = 0, len_str = 0;
while (i < len){
buf[len_str++] = num[len - 1] % 2 + '0'; // 大数的最后一位是奇数存"1",偶数存"0"
c = 0; //高位借位
for (j = i; j < len; j++){ //将int数组n处理成大数除2后的结果(笔算除法)
tmp = num[j]; // 暂存最高位
num[j] = (num[j] + c) / 2; // 最高位与借位相加除2
if (tmp & 1){//二进制位与运算,判断tmp是否为奇数
c = 10; //为奇数则向后余10
}
else
c = 0;
}
if (num[i] == 0) //最高为为0则后移
i++;
}
for (int j = len_str - 1; j >= 0; j--){
printf("%c", buf[j]);
}
printf("\n");
}
return 0;
}
问题 D 八进制
#include<stdio.h>
int main(){
int n;
while(scanf("%d", &n) != EOF){
int ans[10], k = 0;
do{
ans[k++] = n % 8;
n /= 8;
} while(n != 0);
for(int i = k - 1; i >= 0; i--) printf("%d", ans[i]);
printf("\n");
}
return 0;
}
字符串处理
【codeup 5901】回文串
#include<cstdio>
#include<cstring>
const int maxn = 256;
// 判断字符串str是否是“回文串”
bool judge(char str[]){
int len = strlen(str);
for(int i = 0; i < len / 2; i++){
if(str[i] != str[len - i - 1]){
return false;
}
}
return true;
}
int main(){
char str[maxn];
while(gets(str)){
bool flag = judge(str);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
【PAT B1009】说反话
#include<cstdio>
#include<cstring>
int main(){
char str[90];
gets(str);
int len = strlen(str), r = 0, h = 0; //r为行,h为列
char ans[90][90]; //ans[0]~ans[r]存放单词
for(int i = 0; i < len; i++){
if(str[i] != ' '){ //如果不是空格,则存放至ans[r][h],并令h++
ans[r][h++] = str[i];
} else {
ans[r][h] = '\0'; //文末结束符\0
r++;
h = 0;
}
}
for(int i = r; i >= 0; i--){ //倒着输出单词
printf("%s", ans[i]);
if(i > 0) printf(" ");
}
return 0;
}
本节习题
http://codeup.cn/contest.php?cid=100000580
问题 A 字符串连接
#include<stdio.h>
int main(){
char a[110], b[110];
while(scanf("%s %s", a, b) != EOF){
char c[210];
int i = 0;
for(; a[i] != '\0'; i++) c[i] = a[i];
int j = 0;
for(; b[j] != '\0'; j++) c[i + j] = b[j];
c[i + j] = '\0';
printf("%s\n", c);
}
return 0;
}
问题 B 首字母大写-2
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
char str[200] = " ";//初始化为含有一个空格的字符串,而不是空字符串
while(gets(str + 1) != NULL){
for(int i = 1; i < strlen(str); i++)
if((str[i-1] == ' ' || str[i-1] == '\t') && str[i] >= 'a' && str[i] <= 'z')
str[i] -= 32;
for(int i = 1; i < strlen(str); i++)
printf("%c", str[i]);
printf("\n");
}
return 0;
}
问题 C 字符串的查找删除-2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MATCH 100
#define MAX 1000
int fail[MATCH];
void compute_prefix(char *p)
{
int i, m, k;
m = strlen(p);
k = 0;
for (i = 2; i <= m; i ++) {
while (k > 0 && p[k] != p[i - 1]) {
k = fail[k - 1];
}
if (p[k] == p[i - 1]) {
k = k + 1;
}
fail[i - 1] = k;
}
}
int kmp_match(char *p, char *s, char *flag)
{
int i, m, n, k, j;
// 初始化匹配数组
memset(flag, -1, sizeof(flag));
// 初始化fail数组
compute_prefix(p);
m = strlen(p);
n = strlen(s);
k = j = 0;
for (i = 0; i < n; i ++) {
while (k > 0 && p[k] != s[i]) {
k = fail[k - 1];
}
if (p[k] == s[i]) {
k = k + 1;
}
if (k == m) {
flag[j] = i - m + 1;
j ++;
k = fail[k - 1];
}
}
return j;
}
int main()
{
char p[MATCH], t[MAX][MAX], s[MAX][MAX], flag[MAX];
int i, m, num, index, j, k, sign;
// 处理模式串
scanf("%s", p);
getchar();
m = strlen(p);
for (i = 0; i < m; i ++) {
if (p[i] >= 'A' && p[i] <= 'Z') {
p[i] = tolower(p[i]);
}
}
// 接收文本串
for (index = 0; gets(t[index]); index ++) {
if (strcmp(t[index], "}") == 0) {
break;
}
}
// 复制文本串转小写
for (i = 0; i <= index; i ++) {
for (j = 0; j < strlen(t[i]); j ++) {
if (t[i][j] >= 'A' && t[i][j] <= 'Z') {
s[i][j] = tolower(t[i][j]);
}else {
s[i][j] = t[i][j];
}
}
}
// 按行kmp匹配
for (i = 0; i <= index; i ++) {
// 判断是否是匹配点
num = kmp_match(p, s[i], flag);
for (j = 0; j < strlen(t[i]);) {
for (k = 0, sign = 1; k < num; k ++) {
if (flag[k] == j) {
sign = 0;
break;
}
}
if (sign) {
if (t[i][j] != ' ') {
printf("%c", t[i][j]);
}
j ++;
}else {
j += m;
}
}
printf("\n");
}
printf("\n");
return 0;
}
问题 B 首字母大写
#include<stdio.h>
int main(){
char a[110];
while(gets(a) != NULL){
if('a' <= a[0] && a[0] <= 'z') a[0] = a[0] - 32;
for(int i = 1; a[i] != '\0'; i++){
if((a[i - 1] == ' ' || a[i - 1] == '\t' || a[i - 1] == '\r' || a[i - 1] == '\n') && ('a' <= a[i] && a[i] <= 'z')){
a[i] = a[i] - 32;
}
}
printf("%s\n", a);
}
return 0;
}
问题 B 首字母大写-3
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char c[105];
while (gets(c) != NULL) {
int len = strlen(c);
//处理字符串的每行的第一个字母,大写字母 = 小写字母-32
if (c[0] >= 97 && c[0] <= 122) {
c[0] = c[0] - 32;
}
for (int i = 1; i < len - 1; i++) {
//可能存在多个空格,所以使用while进行判断
while (c[i] == ' ') {
i++;
if (c[i] >= 97 && c[i] <= 122) {
c[i] -= 32;
}
}
}
printf("%s\n", c);
}
return 0;
}
问题 C 字符串的查找删除
#include <cstdio>
#include <cstring>
char del[1000], str[1001][1001], ans[1001][1001];
int main()
{
int index = 0;
gets (del);
int len1 = strlen (del);
while (gets (str[index++])) //读入数据;
for(int i = 0; i < len1; i++){ //将del全部转化为小写字母;
if(del[i] >= 'A' && del[i] <= 'Z') {
del[i] = del[i] - 'A' + 'a';
}
}
for(int i = 0; i < index; i++) {
int len2 = strlen (str[i]);
for (int j = 0; j < len2; j++) {
ans[i][j] = str[i][j]; //用另一数组存储原数据,然后将其转化为小写字母;
if (str[i][j] >= 'A' && str[i][j] <= 'Z') {
str[i][j] = str[i][j] - 'A' + 'a';
}
}
for (int j = 0, k = 0; j < len2; ) {
if (str[i][j + k] == del[k]) { //判断是否与短字符第一个字符相同;
k++;
if (k == len1) { //若完全相同则跳过;
j = j + k;
k = 0;
}
}
else {
if (str[i][j] != ' ') printf ("%c", ans[i][j]); //输出原字符;
j++;
k = 0;
}
}
printf ("\n");
}
return 0;
}
问题 D 单词替换
#include <cstdio>
#include <cstring>
char del[1000], replace[1000], str[1001];
int main(){
while(gets(str) != NULL){
gets(del); //读入数据;
int len1 = strlen(del);
gets(replace);
int len2 = strlen (str);
for(int j = 0, k = 0; j < len2; ){
if(str[j + k] == del[k]){ //判断是否与短字符第一个字符相同;
k++;
if (k == len1){ //若完全相同则跳过并输出替换字符串;
j = j + k;
k = 0;
printf("%s", replace);
}
}
else{
printf ("%c", str[j]); //输出原字符;
j++;
k = 0;
}
}
printf("\n");
}
return 0;
}
问题 E 字符串去特定字符
#include<stdio.h>
#include<string.h>
int main(){
char s[100001], c;
while(gets(s)){
scanf("%c", &c);
int len = strlen(s);
for(int i = 0; i < len; i++){
if(s[i] != c) {
printf("%c", s[i]);
}
}
printf("\n");
getchar();
}
return 0;
}
问题 F 数组逆置
#include<stdio.h>
#include<string.h>
int main(){
char s[100001];
while(gets(s)){
int len = strlen(s);
for(int i = len - 1; i >= 0; i--){
printf("%c", s[i]);
}
printf("\n");
}
return 0;
}
问题 G 比较字符串
#include<stdio.h>
#include<string.h>
int main(){
char a[51], b[51];
int n;
scanf("%d", &n);
while(n--){
scanf("%s", a);
scanf("%s", b);
int len1 = strlen(a), len2 = strlen(b);
if(len1 == len2) printf("%s is equal long to %s\n", a, b);
else if(len1 > len2) printf("%s is longer than %s\n", a, b);
else printf("%s is shorter than %s\n", a, b);
}
return 0;
}
问题 H 编排字符串
#include<stdio.h>
#include<string.h>
int main(){
char s[4][21];
int m, i = 0, k; // i记录输入字符串个数 k为每次输入后要输出字符串的个数
scanf("%d", &m);
while(m--){
scanf("%s", s[(i++) % 4]);
if(i >= 4) k = 4;
else k = i;
for(int no = 1, j = i - 1; k > 0; k--, no++, j--){
printf("%d=%s", no, s[j % 4]);
if(k != 1) printf(" ");
}
printf("\n");
}
return 0;
}
问题 I 【字符串】回文串
#include<stdio.h>
#include<string.h>
int main(){
char str[256];
while(scanf("%s", str) != EOF){
int len = strlen(str);
int i = 0;
for( ; i < len / 2; i++){
if(str[i] != str[len - i - 1]){
printf("NO\n");
break;
}
}
if(i == len / 2) printf("YES\n");
}
return 0;
}