最近刷的pat题代码,感觉自己写代码速度还是太慢,总之一步步来吧,自己还是要努力呀!!!
pat上题目代码有的我注释了一些自己的看法与自己写错的地方,为什么会错,希望能帮助到别人(嘻嘻)!
以下是代码。。。
//B1012.数字分类
#include
int main(){
int a[1100]={0};
int i,n,A1=0,A2=0,A3=0,A4=0,A5=0,t=1,c=0,f=0,d=0;
scanf("%d",&n);
for(i=0;i
if(a[i]%5==0&&a[i]%2==0){
f++;
A1+=a[i];
}
if(a[i]%5==1){
t++;
if(t%2==0)
A2+=a[i];
else
A2-=a[i];
}
if(a[i]%5==2){
A3++;
}
if(a[i]%5==3){
c++;
A4+=a[i];
}
if(a[i]%5==4){
d++;
if(a[i]>A5)
A5=a[i];
}
}
if(f!=0)
printf("%d ",A1);
else
printf("N ");
if(t!=1)//注意一下,这是个比较繁琐的,但是为了迎合之前的代码,所以设置成t!=1。。。。尽量不要这样做
printf("%d ",A2);
else
printf("N ");
if(A3!=0)
printf("%d ",A3);
else
printf("N ");
if(c!=0){
printf("%.1f ",(double)A4/c);
}
else
printf("N ");
if(d!=0)
printf("%d",A5);
else
printf("N");
return 0;
}
B1018锤子剪刀布
#include
//#include
int change(char c){//此题主要是用到了将BCJ转化成数字这样可以方便问题的简化与求解!当然套路都是通过大量的做题一个一个总结的
if(c=='B') return 0;
if(c=='C') return 1;
if(c=='J') return 2;
}
int main(){
char mp[3]={'B','C','J'};
int n;
scanf("%d",&n);
int A[3]={0};int B[3]={0};
int hand_A[3]={0},hand_B[3]={0};
char c1,c2;
int k1,k2;
int i,j;
for(int i=0;i
scanf("%c %c",&c1,&c2);
k1=change(c1);k2=change(c2);
if((k1+1)%3==k2){
A[0]++;
B[2]++;
hand_A[k1]++;
}
if((k2+1)%3==k1){
A[2]++;
B[0]++;
hand_B[k2]++;
}
if(k1==k2){
A[1]++;
B[1]++;
//hand_A[k1]++;
//hand_B[k1]++;
}
}
printf("%d %d %d\n",A[0],A[1],A[2]);
printf("%d %d %d\n",B[0],B[1],B[2]);
if(hand_A[0]>=hand_A[1]&&hand_A[0]>=hand_A[2])
i=0;
else if(hand_A[1]>=hand_A[2])
i=1;
else
i=2;
if(hand_B[0]>=hand_B[1]&&hand_B[0]>=hand_B[2])
j=0;
else if(hand_B[1]>=hand_B[2])
j=1;
else
j=2;
printf("%c %c",mp[i],mp[j]);
return 0;
}
//A1042 Shuffling Machine
#include
const int n=54;
char mp[5]={'S','H','C','D','J'};
int start[n+1],change[n+1],next[n+1];
int main(){
int k,i;
scanf("%d",&k);
getchar();
for(i=1;i<=n;i++)
start[i]=i;
for(i=1;i<=n;i++){
int u;
scanf("%d",&u);
change[i]=u;
}
for(int j=0;j
next[change[i]]=start[i];
}
for(i=1;i<=n;i++){
start[i]=next[i];//将next数组赋值给start数组,以方便数组下次使用
}
}
for(i=1;i<=n;i++){
if(i!=1)
printf(" ");//注意一下最后一个不要空格,所以如果你在下面printf里面加空格其实在pat里面编译会出现错误的,错误是格式错误,你会一分得不到,所以在这一定要注意以下
printf("%c%d",mp[(start[i]-1)/13],(start[i]-1)%13+1);
}
return 0;
}
#include
#include
//using namespace std;
int main(){
int k,i,j,sum=0,first,last,t,u;
int a[110000],dist[110000];
scanf("%d",&k);
for(i=1;i<=k;i++){
scanf("%d",&a[i]);
sum+=a[i];
dist[i]=sum;
}
scanf("%d",&j);
for(i=0;i
if(first<=last){
t=dist[last]-dist[first];
u=sum-t;//不是正向的一条边一定是反向的一条边,不存在一个顶点与大于两条的边相连。
if(t<=u)
printf("%d\n",t);
else printf("%d\n",u);
}
else{
std::swap(first,last);//通常不采用std::通常采用using namespace std!
t=dist[last]-dist[first];
u=sum-t;
if(t<=u)
printf("%d\n",t);
else printf("%d\n",u);
}
}
return 0;
}
//A1065.A+B and C
#include
int main(){
int n;
long long A,B,C,t;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&A,&B,&C);
t=A+B;
if(a>0&&b>0&&t<0)
printf("case #%d: true\n",i);//主要是需要考虑溢出的情况,当出现正溢出时表示ab之和一定是大于c的,当出现负溢出时,ab之和一定是小于c的。
if(t>c)
printf("Case #%d: true\n",i);
if(t<=C&&C>0)
printf("Case #%d: false\n",i);
if(A<0&&B<0&&t>=0)
printf("Case #%d: false\n",i);
}
return 0;
}
B1010 一元多项式求导
#include
//当发现你输入到数组的数自己无法找出来操作时,可以遍历整个数组,个人感觉效率有点低!!!
int main(){
int a[1100];
int i,k,e,count=0;
while(scanf("%d%d",&k,&e)!=EOF){
a[e]=k;
}
a[0]=0;
for(i=1;i<=1000;i++){
a[i-1]=a[i]*i;
a[i]=0;
if(a[i-1]!=0)
count++;
}
if(count==0)
printf("0 0");
//for(i=1000;i<=1000;i--){,在这里出现错误,我感觉这是一个非常低级的错误,边界条件一定是i>=0
for(i=1000;i>=0:i--){
if(a[i]!=0){
printf("%d %d",a[i],i);
count--;
if(count!=0)
printf(" ");
}
}
return 0;
}
//A1002A+B for Polynomials
#include
const int max=1111;
int main(){
int i,count=0,k,n;
double e;
double a[max]={ };
scanf("%d",&k);
for(i=0;i
a[n]+=e;
}
scanf("%d",&k);
for(i=0;i
a[n]+=e;
}
for(i=0;i
count++;
}
printf("%d",count);//注意:这里不能在%d后面加空格,再使用我下面注释掉的语句的方法,因为这样写会出现有一种可能,就是输入的两个式子均为0,此时只用输出0即可,后面的不用输出了,但是此时若在%d后面加空格会出现一个多余的空格,所以此方法不可取!!!
for(i=1100-1;i>=0;i--){
if(a[i]!=0){
printf(" %d %.1f",i,a[i]);
/*if(count!=1){
count--;
printf(" ");
}*/
}
}
return 0;
}
总之,个人感觉想学好计算机,最重要的还是敲代码!一起加油吧!