PAT 乙級1046-1050

//1046 划拳 
/* 
#include<stdio.h>
int main(){
int n,a,b,c,d;
int i;
int flag1=0,flag2=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d %d %d",&a,&b,&c,&d);
if(a+c==b&&a+c!=d)  flag1++;
else if(a+c==d&&a+c!=b) flag2++;

printf("%d %d",flag2,flag1);
return 0;
 
} */


// 1047 編程團體賽
/*
#include<stdio.h>
int main(){
   int n,s[1000]={0};
   int i,a,b,c,max=0;
   int flag;
   scanf("%d",&n);
   for(i=0;i<n;i++)
  {
    scanf("%d-%d",&a,&b);
   scanf("%d",&c);
   s[a]+=c;
   if(max<s[a])
    {
      max=s[a];
 flag=a;
     }
}
 printf("%d %d",flag,max);
 return 0;
}*/


//1048 數字加密 
 //這題目真tm坑! 題目根本沒說結果是多少位,按理說既然A只是加密用的數,B纔是 需要加密的數,應該按照B的位數來輸出, 
 /* 
#include<stdio.h>//但題目是------按照最多位的輸出,。 
#include<string.h>
int main(){
char num[10]={'0','1','2','3','4','5','6','7','8','9'};
char a[101];
char b[101];
char c;
int i=0,aaa,bbb,flag=1;
int temp;
int max;
    while((c=getchar())!=' ')
    {
     a[i]=c;
 i++; 
}
aaa=i;//A的長度 
//getchar();
i=0;
while((c=getchar())!='\n')
{
b[i]=c;
i++; 
}
bbb=i;//B的長度 
//A或B比較短的一方,需要將每位數後移,不夠補零,達到長度一樣。1234567-123456789》》》00123456789-123546789 
if(aaa>bbb) {//如果A長度大於B                      //   123456789-123456》》》123456789-000123456 
for(i=0;i<=bbb;i++)
    b[aaa-i]=b[bbb-i];
for(i=0;i<aaa-bbb;i++)
 b[i]='0';
max=aaa;
    
}
else{//B>A 
for(i=0;i<=aaa;i++)
    a[bbb-i]=a[aaa-i];
for(i=0;i<bbb-aaa;i++)
 a[i]='0';
max=bbb;
 
}
   
    for(i=max-1;i>=0;i--)
    {
    if(flag)//奇數 
      {  temp=a[i]-'0'+b[i]-'0';
     flag=0;
     temp%=13;
     if(temp==10) b[i]='J';
     else if(temp==11) b[i]='Q';
     else if(temp==12) b[i]='K';//這裏一定注意別寫錯了,大小寫K好難區分啊。。。 
     else b[i]=num[temp];  
  }
    else  {//偶數 
    temp=b[i]-'0'-(a[i]-'0');
    if(temp<0) temp+=10;
    b[i]=num[temp];
    flag=1;
}
 }


for(i=0;i<max;i++)//直接用%s打印會出錯,亂碼。可能是數組長度確定,打印可能將沒有值得位打印出來 
 printf("%c",b[i]);
 //printf("\n%s \n%s",a,b);
return 0;

}*/ 




//1049 數列的片段和
 /* 
#include<stdio.h>
int main(){
int n;
int i;
double temp,sum=0.0,flag=1.0;//必須用double,否則過不去最後兩個測試點 
scanf("%d",&n);


while(n>0){
scanf("%lf",&temp);//用了double,這裏就要用%lf,不然輸入的數據只會保存到float長度,造成答案錯誤 
sum+=temp*n*flag;
flag+=1.0;
n--;
}
printf("%.2f",sum);
return 0;
} */ 




//1050 螺旋矩陣
//這題好難啊。。。 想想還是用C++吧,C++起碼可以一邊寫一邊初始化,不用把所有變量都先定義好 
#include<iostream>
#include <algorithm> 
#include<cmath>
using namespace std; 
/*int cmp(const void *i,const void *j){
return *(int *)j-*(int *)i;
}*/


bool compare(int a,int b){
  return a>b;// 從大到小。大於號從大到小,小於號從小到大 
}


int main(){
int N;
int i;
int yes=1;//用於判斷是不是質數 
scanf("%d",&N);
if(N<4) yes=1;//小於4不用看就是質數 
    else
  {
for(i=2;i<=sqrt(N);i++)
 if(N%i==0) yes=0;}//被小於平方根的數整除就不是質數 
int a[N]; 
for(i=0;i<N;i++)
scanf("%d",&a[i]);
// qsort(a,N,sizeof(a[0]),cmp);
     sort (a,a+N,compare);
  //   for(i=0;i<N;i++)
// printf("%d ",a[i]);
if(yes) {
for(i=0;i<N;i++)
    printf("%d\n",a[i]);
}
 else{//不是質數 
   int hang,lie;
lie=sqrt(N);//向下取整---sqrt(17)=4 
if(lie*lie==N) hang=lie;//被整除行列相等 
else {
hang=lie+1;
while(hang*lie!=N){
if(hang*lie>N) lie--;
else if(hang*lie<N) hang++;
}
}
int s[hang][lie];
i=0;
int x=0,k=0,y=0,flag=0;
while(i<N){//這裏就是核心===怎麼螺旋排列。解釋不清楚,我是先設置四個flag用來拐彎 
if(flag==0&&y<lie-k) {
 s[x][y]=a[i];
 y++;
if(y==lie-k-1)  {flag=1;i++;}//拐彎,這時要i++;避免下一次輸入的時候仍然是輸入這一次的a[i]值 

    }
if(flag==1&&x<hang-k){
s[x][y]=a[i];
x++;
if(x==hang-k-1) {flag=2;i++;}

}
if(flag==2&&y>=k){
s[x][y]=a[i];
y--;
if(y==k) { flag=3;k++;i++;}
  


}
if(flag==3&&x>=k){
s[x][y]=a[i];
x--;
if(x==k) {flag=0;}//最後一次不用


}i++;
 
}
for(i=0;i<hang;i++)
  for(k=0;k<lie;k++)
   if(k<lie-1) printf("%d ",s[i][k]);
   else printf("%d\n",s[i][k]);
}
return 0;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章