PAT B1001害死人不偿命的(3n+1) 猜想
#include<stdio.h> int main() { int n,countnum=0; scanf("%d",&n); while(n!=1) { if(n%2==0) { n=n/2; } else { n=(3*n+1)/2; } countnum++; } printf("%d",countnum); return 0; }
PAT B1032 挖掘机技术哪家强
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int n; int a,b,maxnum=0; int score[100005]; scanf("%d",&n); memset(score,0,sizeof(score)); for(int i=1;i<=n;i++) { scanf("%d %d",&a,&b); score[a]+=b; if(score[a]>score[maxnum]) maxnum=a; } printf("%d %d",maxnum,score[maxnum]); return 0; }
PAT B1036 跟奥巴马一起编程
注意行数是(num+1)/2
#include<stdio.h> using namespace std; int main() { int num; char c; scanf("%d %c",&num,&c); for(int i=1;i<=(num+1)/2;i++) { if(i==1||i==(num+1)/2) { for(int j=1;j<=num;j++) printf("%c",c); if(i==1) printf(" "); } else { printf("%c",c); for(int j=2;j<num;j++) printf(" "); printf("%c ",c); } } return 0; }
codeup 1928日期差值(非PAT 比较有锻炼意义的模拟)
这个先按年调整再一个一个加(截至到year2-year1<=1),注意不是在等于12或者当月日期的时候%,是大于,不然会出现0
按照年加的时候,如果3月以后看下一年是否闰,如果2.28及之前看本年,如果正好2.29,就是365,另外调整day为28。
另外这个逢400又闰注意
最后的叠加不要再用月算了,更麻烦!(不仅要考虑每个月,还要考虑20200501和20210103这种跨的,直接大小于号也不好比浪费时间)直接一个一个加就可以
还有就是codeup是多输入在一起的。
这种稍微复杂一点的模拟都不能一次过,需要加强
#include<stdio.h> int pd[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};//0对应平年 int run(int year) { if((year%4==0 && year%100!=0)||year%400==0) return 1; return 0; } int main() { int year1,year2,month1,month2,day1,day2; int num1,num2; while(scanf("%d%d",&num1,&num2)!=EOF) { if(num1>num2) { int temp=num2; num2=num1; num1=temp; } day1=num1%100; num1=num1/100; month1=num1%100; num1=num1/100; year1=num1; day2=num2%100; num2=num2/100; month2=num2%100; num2=num2/100; year2=num2; int ansday=1; while(year2-year1>1) { if(month1==2 && day1==29) { day1=28; year1++; ansday+=365; } else if(month1>3) { year1++; ansday+=365+run(year1); } else { ansday+=365+run(year1); year1++; } } while(day1!=day2 ||month1!=month2 || year1!=year2) { ansday++; day1++; if(day1>pd[run(year1)][month1]) { day1=day1%pd[run(year1)][month1]; month1++; if(month1==13) { year1++; month1=1; } } //printf("%d %d %d ",year1,month1,day1); } printf("%d ",ansday); } return 0; }
PAT B1022 D进制的A+B
注意为0的情况,要么使用do while保证即使是0也执行,要么特判0(注意不能用c判断,因为经过while处理的c一定是0).
P进制转10进制,每次取(x%10)最后一位*当前p加上现有num,之后p=p*P x=x/10。(INIT p=1,num=0)
10进制转p进制,每次%p作为结果存进去,最后倒序输出。注意为0的情况。
#include<stdio.h> #include<string.h> int main() { int a,b,d; scanf("%d %d %d",&a,&b,&d); int c=a+b; int num[100]; int count=0; memset(num,0,sizeof(num)); while(c) { num[count++]=c%d; c=c/d; } if(a+b==0) count=1; for(int i=count-1;i>=0;i--) printf("%d",num[i]); return 0; }
PAT B1009 说反话
可以利用%s不读空格,使用EOF来分割,注意,%s遇到的第一个让他停止的空格会被下次%s忽略,但如果用getchar也能读。
这种只能用于PAT这类一次一个输入数据的。
注意!目前gets在评测机里面会出现CE,不要再使用。正常如果多输入可以一直读取然后用回车啥的判断。结果一样。暂时不写了。
单独读取字符然后用EOF判断也是可以的。(这道题因为换行的原因出现了格式错误,暂时无法纠正)
#include<stdio.h> #include<string.h> int main() { char str[100][100]; int i=0; while(scanf("%s",str[i])!=EOF) { i++; } i=i-1; for(i;i>0;i--) { printf("%s ",str[i]); } printf("%s",str[0]); return 0; }