1005. Spell It Right (20)

题目:

https://www.patest.cn/contests/pat-a-practise/1005

大概描述:

求各位数的累加和,并将结果用英文输出

使用语言:

C

解题思想:

考虑到数可能较大,用一般的int ,long 无法存储,想到建立链表进行存储,后来又想到来一位加一位,简化了程序。

题目得分:

20(可以用链表再试试)

提交次数:

2

做题时间:

1个小时

具体代码如下:

#include<stdio.h>
#include<math.h>
int lengt(int m){
 int i=0;
 while(m!=0){
 m/=10;
 i++;
 }
 return i;

}
int poww(int n){
 int nu=1;
 while(n!=0){
 nu*=10;
 n--;
 }
 return nu;
}


int main(){
 char d;
 int m=0;int t=0;
 int n=0;
 int y=0;
 d=getchar();
 while(d!='\n'){
 m+=(d-48);
 d=getchar();
 }
/*printf("%d ",m);
 */
 n=lengt(m);
 /* printf("%d ",n);
 */y=poww(n);
 /*printf("%d ",y);
*/y=y/10;
 if(y==0) printf("zero");
 while(y!=0){
 t=m/y;
 switch(t){
 case 0:printf("zero");break;
 case 1:printf("one");break;
 case 2:printf("two");break;
 case 3:printf("three");break;
 case 4:printf("four");break;
 case 5:printf("five");break;
 case 6:printf("six");break;
 case 7:printf("seven");break;
 case 8:printf("eight");break;
 case 9:printf("nine");break;
 }
 m=m%y;
 y=y/10;/*printf("%d ",y);
 */ if(y!=0)
 printf(" ");
}
return 0;
}

1006 Sign In and Sign Out (25)

题目:

https://www.patest.cn/contests/pat-a-practise/1006

大概描述:

比较输出最值

使用语言:

C

解题思想:

刚开始采用,二维字符数组,后来使用结构体,c语言中的一些语法记不清了,而且这题考虑的也不全面

题目得分:

10(待重做)

提交次数:

2

做题时间:

大半天

具体代码如下:

#include<stdio.h>
struct student{
 char id[16];
 int startF;
 int startS;
 int startT;
 int endF;
 int endS;
 int endT;
};

int main(){
int numb;int i;int j=0;
/*结构体的使用
*/
struct student st[100];
scanf("%d",&numb);
for(i=0;i<numb;i++){
 scanf("%s",&st[i].id);
 scanf("%d%:%d:%d %d:%d:%d",&st[i].startF,&st[i].startS,&st[i].startT,&st[i].endF,&st[i].endS,&st[i].endT);
}
for(i=0;i<numb;i++){
 if(st[i].startF<st[j].startF)
 j=i;
 if(st[i].startF==st[j].startF&&st[i].startS<st[j].startS)
 j=i;
 if(st[i].startF==st[j].startF&&st[i].startS==st[j].startS&&st[i].startT<st[i].startT)
 j=i;

}
printf("%s ",st[j].id);
j=0;
for(i=0;i<numb;i++){
 if(st[i].endF>st[j].endF)
 j=i;
 if(st[i].endF==st[j].endF&&st[i].endS>st[j].endS)
 j=i;
 if(st[i].endF==st[j].endF&&st[i].endS==st[j].endS&&st[i].endT<st[i].endT)
 j=i;

}
printf("%s",st[j].id);


return 0;
}

1003 Emergency (25)

题目:

https://www.patest.cn/contests/pat-a-practise/1003

大概描述:

求图中两点最短路径问题,输出要求,最短路径的方案数和点的权值之和

使用语言:

C

解题思想:

采用dijkstra算法找到最短路径(具体思路,等25分再细说)

题目得分:

13(待重做)

提交次数:

4

做题时间:

大半天

具体代码如下:

#include<stdio.h>
int main(){

int cityNum=0;int p=0;int k=0;
int roadNum=0;
int citySta=0;
int cityEnd=0;
int cityPeo[500]={0};
int roadSize[500][500]={0};
int obj[500][3]={0};
int i,j;int x,y;

scanf("%d %d %d %d",&cityNum,&roadNum,&citySta,&cityEnd);

for(i=0;i<cityNum;i++){
scanf("%d",&cityPeo[i]);
}

for(i=0;i<roadNum;i++){
scanf("%d",&x);
scanf("%d",&y);
scanf("%d",&roadSize[x][y]);
}

if(cityEnd==citySta){
 printf("1 %d",cityPeo[cityEnd]);
 return 0;
}
x=citySta;
for(i=0;i<cityNum;i++){
 if(roadSize[i][x]!=0){
 obj[i][0]=roadSize[i][x];
 roadSize[i][x]=0;
 obj[i][1]=1;
 obj[i][2]+=cityPeo[x];
 obj[i][2]+=cityPeo[i];
 }
 if(roadSize[x][i]!=0){
 obj[i][0]=roadSize[x][i];
 roadSize[x][i]=0;
 obj[i][1]=1;
 obj[i][2]+=cityPeo[x];
 obj[i][2]+=cityPeo[i];
 }
}
/*for(k=0;k<3;k++){
for(i=0;i<cityNum;i++){
 printf("%d ",obj[i][k]);
}
printf("\n");
}
printf("************************\n");
*/
for(p=0;p<cityNum;p++){
for(i=0;i<cityNum;i++){
 if(obj[i][0]!=0){
 y=i;
 for(k=0;k<cityNum;k++){
 if(roadSize[k][y]!=0){
 if(obj[k][0]==0){
 obj[k][0]=obj[y][0]+roadSize[k][y];
 roadSize[k][y]=0;
 obj[k][1]=1;
 }
 else{
 if((roadSize[k][y]+obj[y][0])<obj[k][0]){
 obj[k][0]=roadSize[k][y]+obj[y][0];
 roadSize[k][y]=0;
 obj[k][2]=obj[y][2]+cityPeo[k];
 }
 if((roadSize[k][y]+obj[y][0])==obj[k][0]){
 obj[k][1]++;
 if(obj[k][2]<(obj[y][2]+cityPeo[k]))
 obj[k][2]=obj[y][2]+cityPeo[k];
 }
 }
 }
 roadSize[k][y]=0;
 if(roadSize[y][k]!=0){
 if(obj[k][0]==0){
 obj[k][0]=obj[y][0]+roadSize[y][k];
 roadSize[y][k]=0;
 obj[k][1]=1;
 }
 else{
 if((roadSize[y][k]+obj[y][0])<obj[k][0]){
 obj[k][0]=roadSize[y][k]+obj[y][0];
 roadSize[y][k]=0;
 obj[k][2]=obj[y][2]+cityPeo[k];
 }
 if((roadSize[y][k]+obj[y][0])==obj[k][0]){
 obj[k][1]++;
 if(obj[k][2]<(obj[y][2]+cityPeo[k]))
 obj[k][2]=obj[y][2]+cityPeo[k];

}
 }
 }
 roadSize[y][k]=0;
 }
}

}
/*for(k=0;k<3;k++){
for(i=0;i<cityNum;i++){
 printf("%d ",obj[i][k]);
}
printf("\n");
}
printf("************************\n");
*/
}
printf("%d %d",obj[cityEnd][1],obj[cityEnd][2]);
return 0;
}

1002 A+B for Polynomials (25)

题目:

https://www.patest.cn/contests/pat-a-practise/1002

大概描述:

就是将多项式A,B相加,其中的数字表示项数,系数及指数,并且对输出也有要求,最后不为空格,且按照指数由大到小排序

使用语言:

C

解题思想:

采用的是将多项式A,B的指数用两个10个单位的数组进行存储,他们的系数都放在一个数组中,这个数组的长度为20,然后依次取出数组中的指数查找他之后的是否具有相同的,有相同的,就把指数变为-1,从而失效,最终得到相加后的指数组和系数组。悲剧就在此时发生,他的结果要求按照指数由大到小输出。于是又将之前的结果进行排序。代码变得复杂了。其实在有了思路后我在网上也搜了,还有其他的思路且更为简便。就是直接构造一个长为最大指数的数组,对号入座,也省去排序的尴尬。

题目得分:

17(待重做)

提交次数:

3

做题时间:

大半天

具体代码如下:

#include<stdio.h>
//悲剧scanf的用法都记不清了

void budlesort (int* a,float* b,int key){
 int i=0;int j=0;int m;float n;
 for(i=0;i<key;i++){
 for(j=key-1;j>i;j--){
 if(a[j-1]<a[j]){
 m=a[j-1];
 a[j-1]=a[j];
 a[j]=m;
 n=b[j-1];
 b[j-1]=b[j];
 b[j]=n;
 }

 }

 }



}
int main(){
 int a[10]={0};
 int b[10]={0};
 float c[20]={0};
 int k1=0;int i=0;int key1=0;int key2=0;int key3=0;
 int k2=0;int j=0;int aa=0;int bb=0; int fin[20]={0};
 scanf("%d",&k1);
 // printf("OOOk\n");
 for(i=0;i<k1;i++){
 scanf("%d",&a[i]);
 scanf("%f",&c[i]);
 // printf("****");
 }
 //printf("*************************************");

 scanf("%d",&k2);
 //printf("OOOk\n");
 for(i=0;i<k2;i++){
 scanf("%d",&b[i]);
 scanf("%f",&c[i+10]);
 //printf("****");
 }
 // printf("*************************************"); printf("\n");
 /* for(i=0;i<k1;i++){
 printf("%d ",a[i]);
 }
 printf("\n");
 for(i=0;i<k2;i++){
 printf("%d ",b[i]);
 } printf("\n");
 for(i=0;i<20;i++){
 printf("%f",c[i]);
 }
*/
 for(i=0;i<k1;i++){
 for(j=i+1;j<k1;j++){
 if(a[i]==a[j]){
 c[i]+=c[j];
 a[j]=-1;
 }
 }
 for(j=0;j<k2;j++){
 if(a[i]==b[j]){
 c[i]+=c[j+10];
 b[j]=-1;
 }
 }
 }
 /* printf("\n");
 for(i=0;i<k1;i++){
 printf("%d ",a[i]);
 }
 printf("\n");
 for(i=0;i<k2;i++){
 printf("%d ",b[i]);
 } printf("\n");
 for(i=0;i<20;i++){
 printf("%f",c[i]);
 }
 */
 for(i=0;i<k2;i++){
 for(j=i+1;j<k2;j++){
 if(b[i]==b[j]&&b[i]!=-1){
 c[i+10]+=c[j+10];
 b[j]=-1;
 }
 }
 }

 for(i=0;i<k1;i++){
 if(a[i]!=-1){
 key1++;
 }
 }
 for(i=0;i<k2;i++){
 if(b[i]!=-1){
 key1++;
 }
 }

 printf("%d ",key1);
 for(i=0;i<k1;i++){

 /*if(a[i]!=-1){
 printf("%d ",a[i]);
 printf("%.1f",c[i]);key2++;
 if(key2!=key1)
 printf(" ");
 }*/
 if(a[i]!=-1){
 fin[aa++]=a[i];
 c[bb++]=c[i];
 }
 }
 for(i=0;i<k2;i++){
 /*if(b[i]!=-1){
 printf("%d ",b[i]);
 printf("%.1f",c[i+10]);
 key2++;
 if(key2!=key1)
 printf(" ");
 }
 */
 if(b[i]!=-1){
 fin[aa++]=b[i];
 c[bb++]=c[i+10];
 }
 }
budlesort (fin,c,key1);
 for(i=0;i<key1;i++){
 printf("%d ",fin[i]);
 printf("%.1f",c[i]);
 if(i<key1-1)
 printf(" ");
 }



 return 0;
}

 

新的编码(25分)

#include<stdio.h>
void adda(int sign,float data,float a[]){
 int i=0;
 for(;i<=1000;i++){
 if(i==sign){
 a[i]=a[i]+data;
 break;
 }
 }


}
int main(){
float a[1001]={0};
int k=0;float data=0;int numb=0,sign=0;int i=0;int y=0,n=0;
int t=0;
for(;y<2;y++){
scanf("%d",&k);
for(i=0;i<k;i++){
 scanf("%d",&sign);
 scanf("%f",&data);
 adda(sign,data,a);

}
}

for(i=0;i<1001;i++){
 if(a[i]!=0){
 n++;
 }

}


printf("%d",n);
if(n!=0)
 printf(" ");
for(i=1000;i>=0;i--){
 if(a[i]!=0){
 printf("%d ",i);
 t++;
 printf("%.1f",a[i]);
 if(t!=n)
 printf(" ");
 }

}
return 0;
}

1001 A+B Format (20)

题目:

https://www.patest.cn/contests/pat-a-practise/1001

大概描述:

就是将在-1000000到1000000内的两数相加,并且按照-199,820/199,820/1,199820的格式输出

使用语言:

C

解题思想:

将结果的每一位拆分到数组中存储(由于有一些时间没有用c语言编程了,可能对于c语言使用的不够灵活)

题目得分:

20

提交次数:

3

做题时间:

30分钟

具体代码如下:

#include<stdio.h>
int clength(int m){
 int i=0;
 if(m==0)
 return i;
 do{
 m=m/10;
 i++;
 }while(m!=0);
 // printf("i=%d",i);
 return i;

}

int main(){
int a=0; int b=0;int c=0;int d=0;
int i=0;int zu[7]={0};int j=0;
scanf("%d %d",&a,&b);
c=a+b;
d=clength(c);
if(c<0){
 j=1;
 c=-c;
}
if(c==0){
 printf("0");
 return 0;
}

for(i=d-1;i>=0;i--){
 zu[i]=c%10;
 c=c/10;
}

if(j==1)
 printf("-");

for(i=0;i<d;i++){
 if((i==d-3||i==d-6)&&i!=0)
 printf(",");
 printf("%d",zu[i]);
// printf("*%d",i);
}
 return 0;

}