细节:数组和常量开在main函数外;注意循环变量的值;c语言for循环条件里不能直接声明int型变量。
入门模拟
1.PAT B1001
#include <cstdio>
int main()
{
int n, step = 0;
scanf("%d", &n);
while (n != 1) {
if (n & 1) { //0 false 其他为true 判断是不是奇数
n = (3 * n + 1) / 2;
}
else
{
n = n / 2;
}
step++;
}
printf("%d", step);
return 0;
}
2.PAT B1032
#include <cstdio>
const int maxn = 1000001;
int school[maxn] = { 0 };
int main()
{
int N,M,i,number, score;
scanf("%d", &N);
M = N;
while (N--)
{
scanf("%d%d", &number, &score);
school[number - 1] += score;
}
int MAX = -1,k = 0 ;
for ( i = 0; i < M; i++)
{
if (school[i] > MAX) {
MAX = school[i];
k = i + 1;
}
}
printf("%d %d", k, MAX);
return 0;
}
简单查找
3.codeup 1934
#include <cstdio>
const int max_size = 210;
int arr[max_size];
int main() {
int N,i,sample,flag = -1;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%d",&arr[i]);
}
scanf("%d",&sample);
for (i = 0; i < N; i++)
{
if(arr[i] == sample)
{
flag = i;
}
}
printf("%d",flag);
return 0;
}
图形输出
4 PAT B1036
注意:
scanf("%d%c",&N,&element);会读取空格
scanf("%d %c",&N,&element);为正确写法
#include <cstdio>
int main() {
int N;
char element;
scanf("%d %c",&N,&element);
int i,j;
const int colum = N;
const int row = (N & 1==1 ? N/2 +1 : N/2);
for (i = 0; i < row; i++) {
for (int j = 0; j < colum; ++j) {
if (i == 0 || i == row - 1 || j == 0 || j == colum - 1) {
printf("%c", element);
} else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
日期处理
5.codeup 1928
日期处理要注意平年闰年大月小月2月的天数等细节,代码思路类似定时器。一开始思路走偏了,按照平常自己计算的思路算了,很久都没有想对。
#include <cstdio>
//leap year :month[1],common year:month[0];
int month[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31}
,{31,29,31,30,31,30,31,31,30,31,30,31}};
//闰年有普通闰年和世纪闰年
bool isLeap(int year)
{
return (year&4==0 && year % 100 !=0) || (year % 400 == 0);
}
void swap(int* p,int* q)
{
int temp = *p;
*p = *q;
*q = temp;
}
int main() {
int date1,date2,sum=0,date,cur_month;
scanf("%d %d",&date1,&date2);
//交换使date1>=date2
if(date1>date2) swap(&date1,&date2);
//使日期不断加1指导和另一个相等为止,类似定时器的原理
for (date = date1;date<=date2; date++)
{
sum++;
cur_month = date/100 %100;
//满12月
if(cur_month > 12) date = date + 10000 - 1200;
int days = month[isLeap(date/10000)][cur_month -1];
//满月份中的天数
if (date % 100 > days) date = date - days + 100;
}
printf("%d",sum);
return 0;
}
进制转换
6. P进制->Q进制
分两步:1 P进制->10进制y 2 10进制y->Q进制
中间进制为2应该更方便一些。错了,并不方便。
#include <cstdio>
int Pto10(int num,int P)
{
int res = 0,p=1;
while (num!=0)
{
res += (num % 10 ) * p;//实际表示%P
num = num/10; //此处为去掉P进制的最后一位
p *= P;
}
return res;
}
int toQ(int num,int Q,int Z[])
{
int power = 0;
while(num!=0)
{
Z[power] = num % Q;
num /= Q;
power++;
}
return power;
}
int Pto2(int num,int P)
{
int res = 0,p=1;
while (num!=0)
{
res += (num&1) * p;
num >>1;
p *= 10;
}
return res;
}
7. PAT B1022
#include <cstdio>
void swap(int* p,int* q)
{
int temp = *p;
*p = *q;
*q = temp;
}
int toQ(int num,int Q,int Z[])
{
int power = 0;
while(num!=0)
{
Z[power] = num % Q;
num /= Q;
power++;
}
return power;
}
int main() {
int Z[40],a,b,D,i;
scanf("%d %d %d",&a,&b,&D);
int res = a+b;
i=toQ(res,D,Z)-1;
for (;i>=0;i--)
{
printf("%d",Z[i]);
}
return 0;
}
字符串处理
8. codeup 5901
#include <cstdio>
#include <cstring>
const int maxl = 256;//字符最大长度+1
bool judge(char str[])
{
int i,length = strlen(str);
for ( i = 0; i < length/2; ++i) {
if(str[i]!=str[length-1-i])
return false;
}
return true;
}
int main()
{
char str[maxl];
scanf("%s",str);
if (judge(str))
{
printf("YES");
}else
{
printf("NO");
}
return 0;
}
9 PAT B1009
第一次用多点测试的EOF,很nice
#include <cstdio>
const int maxl = 90;//字符最大长度+1
int main()
{
char str[maxl][maxl];
int num=0,i;
while(scanf("%s",str[num])!=EOF) //多点测试核心结构
{
num++;
}
for(i = num - 1; i >= 0; i--) {
printf("%s",str[i]);
if(i>0) printf(" ");
}
return 0;
}