PAT團體程序設計大賽---(模擬)


L1-1 古風排版(20 分)

中國的古人寫文字,是從右向左豎向排版的。本題就請你編寫程序,把一段文字按古風排版。

輸入格式:

輸入在第一行給出一個正整數N(<100),是每一列的字符數。第二行給出一個長度不超過1000的非空字符串,以回車結束。

輸出格式:

按古風格式排版給定的字符串,每列N個字符(除了最后一列可能不足N個)。

輸入樣例:

4
This is a test case

輸出樣例:

asa T
st ih
e tsi
 ce s

思路:1.輸入記得防止被吃空格

   2.二維數組逆序來存字符串,一共有N行,那么就一共有strlen(str)/N 列,向上 取整

   3.注意,str的最后一個字符存完后要檢查二維字符數組的第一列是否有N行,如果沒有要用空格補齊

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
char Cmap[1005][1005];
int main()
{
  int n,m;
  char s[1005];
  cin >> n;
  getchar(); //用這個來接收空格 
  gets(s);
  int len = strlen(s);
  m = len/n;
  if(len%n != 0) m++; 
  int i = 0;
  for(int k = m-1; k >= 0; k--){
    for(int j = 0; j < n; j++){
      if(i < len)
        Cmap[j][k] = s[i++];
      else
        Cmap[j][k] = ' '; //當長度超過len時直接賦值空格。 
    }
  }
  for(int j = 0; j < n; j++){ // 最后輸出。 
    for(int k = 0; k < m; k++)
      cout << Cmap[j][k];
    cout << endl;
  }
  return 0;
}
View Code

L1-2 大笨鍾(10 分)

微博上有個自稱“大笨鍾V”的家伙,每天敲鍾催促碼農們愛惜身體早點睡覺。不過由於笨鍾自己作息也不是很規律,所以敲鍾並不定時。一般敲鍾的點數是根據敲鍾時間而定的,如果正好在某個整點敲,那么“當”數就等於那個整點數;如果過了整點,就敲下一個整點數。另外,雖然一天有24小時,鍾卻是只在后半天敲1~12下。例如在23:00敲鍾,就是“當當當當當當當當當當當”,而到了23:01就會是“當當當當當當當當當當當當”。在午夜00:00到中午12:00期間(端點時間包括在內),笨鍾是不敲的。

下面就請你寫個程序,根據當前時間替大笨鍾敲鍾。

輸入格式:

輸入第一行按照hh:mm的格式給出當前時間。其中hh是小時,在00到23之間;mm是分鍾,在00到59之間。

輸出格式:

根據當前時間替大笨鍾敲鍾,即在一行中輸出相應數量個Dang。如果不是敲鍾期,則輸出:

Only hh:mm.  Too early to Dang.

其中hh:mm是輸入的時間。

輸入樣例1:

19:05

輸出樣例1:

DangDangDangDangDangDangDangDang

輸入樣例2:

07:05

輸出樣例2:

Only 07:05.  Too early to Dang.
#include<stdio.h>
#include<string.h>
int main() {
    int h,m;
    scanf("%d:%d",&h,&m);
    if((h==12&&m>0)||(h>12&&h<24)) {
        h-=12;
        int i;
        if(m>0)
            h+=1;
        for(i=0; i<h; i++)
            printf("Dang");
        printf("\n");
    }
    else if(h==24)
        h=0;
    else
        printf("Only %02d:%02d.  Too early to Dang.\n",h,m);
    return 0;
}
View Code

L1-3 宇宙無敵加法器(20 分)

地球人習慣使用十進制數,並且默認一個數字的每一位都是十進制的。而在 PAT 星人開掛的世界里,每個數字的每一位都是不同進制的,這種神奇的數字稱為“PAT數”。每個 PAT 星人都必須熟記各位數字的進制表,例如“……0527”就表示最低位是 7 進制數、第 2 位是 2 進制數、第 3 位是 5 進制數、第 4 位是 10 進制數,等等。每一位的進制 d 或者是 0(表示十進制)、或者是 [2,9] 區間內的整數。理論上這個進制表應該包含無窮多位數字,但從實際應用出發,PAT 星人通常只需要記住前 20 位就夠用了,以后各位默認為 10 進制。

在這樣的數字系統中,即使是簡單的加法運算也變得不簡單。例如對應進制表“0527”,該如何計算“6203 + 415”呢?我們得首先計算最低位:3 + 5 = 8;因為最低位是 7 進制的,所以我們得到 1 和 1 個進位。第 2 位是:0 + 1 + 1(進位)= 2;因為此位是 2 進制的,所以我們得到 0 和 1 個進位。第 3 位是:2 + 4 + 1(進位)= 7;因為此位是 5 進制的,所以我們得到 2 和 1 個進位。第 4 位是:6 + 1(進位)= 7;因為此位是 10 進制的,所以我們就得到 7。最后我們得到:6203 + 415 = 7201。

輸入格式:

輸入首先在第一行給出一個 N 位的進制表(0 < N ≤ 20),以回車結束。 隨后兩行,每行給出一個不超過 N 位的非負的 PAT 數。

輸出格式:

在一行中輸出兩個 PAT 數之和。

輸入樣例:

30527
06203
415

輸出樣例:

7201

思路:1. 先將兩個數的位數給補的一樣,方便與計算,直接用string 這樣前面的000還可以和后面的xxx直接連接起來
   2.從最后一個開始相加,用string直接連起來比較方便,不用*pow(10,x)
   3.進制的轉換,k進制的話直接用兩者之和%k就得到他的十進制數了,注意進位的情況
4.輸出要注意首部為0的情況,用一個tag進行標記,首字母不為0才輸出
   5.坑點 0 0 的情況
#include<iostream>
using namespace std;
int main(){
    string radix,num1,num2;
    cin>>radix>>num1>>num2;
    if(num1.length()>num2.length()){
        string temp="";
        for(int i=0;i<num1.length()-num2.length();i++){
            temp+="0";
        }
        num2=temp+num2;
    }
    if(num1.length()<num2.length()){
        string temp="";
        for(int i=0;i<num2.length()-num1.length();i++){
            temp+="0";
        }
        num1=temp+num1;
    }
     int temp=radix.length()-1;
     int carry=0;  //進位
     string result="";
     //對各個位進行計算
     for(int i= num1.length()-1;i>=0;i--){
        int sum=(num1[i]-'0')+(num2[i]-'0')+carry;
        int r=radix[temp]-'0';
        temp--;
        if(r==0){
            r=10;
        }
        carry=sum/r;
        result=(char)(sum%r+'0')+result;
     }
     //有進位並且還有進制
     while(carry != 0&&temp>=0)
     {
         int sum=carry;
         int r=radix[temp]-'0';
         temp--;
         if(r==0){
            r=10;
         }
         carry=sum/r;
         result=(char)(sum%r+'0') + result;
     }
     if(carry!=0){
        result=(char)(carry+'0')+result;
     }
     int tag=0;
     for(int i=0;i<result.length();i++){
        if(tag==1){
            cout<<result[i];
            continue;
        }
        if(result[i]!='0'){
           if(tag==0) tag=1;
        cout<<result[i];
        }
     }
     if(tag==0) cout<<0;
    return 0;
}
/*
View Code

L1-4 情人節(15 分)

以上是朋友圈中一奇葩貼:“2月14情人節了,我決定造福大家。第2個贊和第14個贊的,我介紹你倆認識…………咱三吃飯…你倆請…”。現給出此貼下點贊的朋友名單,請你找出那兩位要請客的倒霉蛋。

輸入格式:

輸入按照點贊的先后順序給出不知道多少個點贊的人名,每個人名占一行,為不超過10個英文字母的非空單詞,以回車結束。一個英文句點.標志輸入的結束,這個符號不算在點贊名單里。

輸出格式:

根據點贊情況在一行中輸出結論:若存在第2個人A和第14個人B,則輸出“A and B are inviting you to dinner...”;若只有A沒有B,則輸出“A is the only one for you...”;若連A都沒有,則輸出“Momo... No one is for you ...”。

輸入樣例1:

GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.

輸出樣例1:

Magi and Potaty are inviting you to dinner...

輸入樣例2:

LaoLao
FatMouse
whoever
.

輸出樣例2:

FatMouse is the only one for you...

輸入樣例3:

LaoLao
.

輸出樣例3:

Momo... No one is for you ...
思路:1.輸入有技巧
   2.統計一下輸入的名字數目即可
#include<stdio.h>
#include<string.h>
char a[10000][20];
int main()
{
    int cnt=0;
    while(scanf("%s",a[cnt])==1&&a[cnt][0]!='.')
    {
        cnt++;
    }
    if(cnt<2)
    printf("Momo... No one is for you ...\n");
    else if(cnt<14)
    printf("%s is the only one for you...\n",a[1]);
    else 
    printf("%s and %s are inviting you to dinner...\n",a[1],a[13]);
}
View Code

這道超級簡單的題目沒有任何輸入。

你只需要把這句很重要的話 —— I Love GPLT ——豎着輸出就可以了。

所謂“豎着輸出”,是指每個字符占一行(包括空格),即每行只能有1個字符和回車。

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[50]="I Love GPLT";
int main()
{
    int len=strlen(a);
    for(int i=0;i<len;i++){
        printf("%c\n",a[i]);
    }
    return 0;
}
View Code

L1-6 是不是太胖了(5 分)

據說一個人的標准體重應該是其身高(單位:厘米)減去100、再乘以0.9所得到的公斤數。已知市斤是公斤的兩倍。現給定某人身高,請你計算其標准體重應該是多少?(順便也悄悄給自己算一下吧……)

輸入格式:

輸入第一行給出一個正整數H(100 < H ≤ 300),為某人身高。

輸出格式:

在一行中輸出對應的標准體重,單位為市斤,保留小數點后1位。

輸入樣例:

169

輸出樣例:

124.2

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    int H;
    while(scanf("%d",&H) !=EOF){
        printf("%.1lf\n",2*((H-100)*0.9));
    }
    return 0;
}
View Code

L1-7 到底是不是太胖了(10 分)

據說一個人的標准體重應該是其身高(單位:厘米)減去100、再乘以0.9所得到的公斤數。真實體重與標准體重誤差在10%以內都是完美身材(即 | 真實體重 − 標准體重 | < 標准體重×10%)。已知市斤是公斤的兩倍。現給定一群人的身高和實際體重,請你告訴他們是否太胖或太瘦了。

輸入格式:

輸入第一行給出一個正整數N≤ 20)。隨后N行,每行給出兩個整數,分別是一個人的身高H(120 < H < 200;單位:厘米)和真實體重W(50 < W ≤ 300;單位:市斤),其間以空格分隔。

輸出格式:

為每個人輸出一行結論:如果是完美身材,輸出You are wan mei!;如果太胖了,輸出You are tai pang le!;否則輸出You are tai shou le!

坑點:不要直接用浮點數,會有浮點誤差

#include <bits/stdc++.h>
using namespace std;

int main(){
  int n;
  scanf("%d", &n);
  for(int i = 0; i < n; i++){
    int h, w;
    scanf("%d%d", &h, &w);
    w *= 50;
    int sw = (h - 100) * 9;
    if(w >= sw * 11) printf("You are tai pang le!\n");
    else if(w <= sw * 9) printf("You are tai shou le!\n");
    else printf("You are wan mei!\n");
  }
  return 0;
}
View Code

L1-8 外星人的一天(15 分)

地球上的一天是 24 小時。但地球上還有一些精力和勤奮度都遠超一般人的大神級人物,他們的“一天”是以 48 小時為周期運轉的,這種人被人們尊稱為“外星人”。比如普通人的周一早 8:30 是外星人的周一早 4:15;普通人的周二早 9:21 是外星人的周一下午 4:40 —— 對外星人而言,一周的工作時間只有三天(即普通人的周一至周六),周日他們會蒙頭大睡恢復體力,時間對他們是沒有意義的。

在外星人眼里,地球人的時鍾對他們而言實在是太不方便了。本題就請你為外星人們實現一款專用時鍾。

輸入格式:

輸入在一行中給出一個不超過 10 的正整數 N,隨后 N 行,每行給出一個地球人的時刻,格式為:Day hh:mm,其中Day是 [0,6] 區間內的整數,順序代表周日至周六;hh是 24 小時制的小時數,是 [0,23] 區間內的整數;mm是分鍾數,是 [0,59] 區間內的整數。

輸出格式:

對輸入的每一行地球人時刻,輸出對應的外星人時間,格式與輸入相同。其中Day在 [0,3] 區間內,對應周日到周三;分鍾數若不是整數,則向下取整。注意:由於周日的時間對外星人沒有意義,所以直接輸出地球人的時間即可。

輸入樣例:

3
1 08:30
2 09:21
0 21:07

輸出樣例:

1 04:15
1 16:40
0 21:07
#include<bits/stdc++.h>
using namespace std;  
  
int main()  
{  
    int n;  
    int a, b, c;  
    cin >> n;  
    for (int i = 0; i < n; i++)  
    {  
        scanf("%d%d:%d", &a, &b, &c);  
        if (a == 0)  
            printf("%d %02d:%02d\n", a, b, c);  
        else  
        {  
            if (a%2==1)  
            {  
                c = ((b % 2) * 60 + c) / 2;  
                b = b / 2;  
            }  
            else  
            {  
                b = b + 24;  
                c = ((b % 2) * 60 + c) / 2;  
                b = b / 2;  
            }  
            printf("%d %02d:%02d\n", (a + 1) / 2, b, c);  
        }  
    }  
      
}  
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM