PAT-Basic1-10

【1001】害死人不償命的(3n+1)猜測html

卡拉茲(Callatz)猜測:ios

對任何一個正整數 n,若是它是偶數,那麼把它砍掉一半;若是它是奇數,那麼把 (3n+1) 砍掉一半。這樣一直反覆砍下去,最後必定在某一步獲得 n=1。卡拉茲在 1950 年的世界數學家大會上公佈了這個猜測,傳說當時耶魯大學師生齊動員,拼命想證實這個貌似很傻很天真的命題,結果鬧得學生們無意學業,一心只證 (3n+1),以致於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……git

咱們今天的題目不是證實卡拉茲猜測,而是對給定的任一不超過 1000 的正整數 n,簡單地數一下,須要多少步(砍幾下)才能獲得 n=1?數組

輸入格式:函數

每一個測試輸入包含 1 個測試用例,即給出正整數 n 的值。測試

輸出格式:spa

輸出從 n 計算到 1 須要的步數。code

輸入樣例:3 htm

輸出樣例:5blog

#include<iostream>

using namespace std;

int main()

{

  int n;

  cin>>n;

  for(int i=0;n!=1;i++)

  {

    if(n%2)

      n=(3*n+1)/2;

    else

      n/=2;

  }

  cout<<i<<endl;

  return 0;

}


 

【1002】寫出這個數

讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。

輸入格式:

每一個測試輸入包含 1 個測試用例,即給出天然數 n 的值。這裏保證 n 小於 10^100​。

輸出格式:

在一行內輸出 n 的各位數字之和的每一位,拼音數字間有 1 空格,但一行中最後一個拼音數字後沒有空格。

輸入樣例:1234567890987654321123456789

輸出樣例:yi san wu

#include<iostream>

using namespace std;

int main()

{

  char num[100]={0};

  int digit[100]={0};

  int sum=0;

  fgets(num,100,stdin);

  for(int i=0;num[i]!='\n';i++)

  {

    sum+=num[i];

  }

  for(int j=0;sum!=0;j++)

  {

    digit[j]=sum%10;

    sum/=10;

  }

  for(int k=j-1;k>=0;k--)

  {

    switch(digit[k]){

    case 0:
              {
                printf("ling");
                break;
              }
              case 1:
              {
                printf("yi");
                break;
              }
              case 2:
              {
                printf("er");
                break;
              }
              case 3:
              {
                printf("san");
                break;
              }
              case 4:
              {
                printf("si");
                break;
              }
              case 5:
              {
                printf("wu");
                break;
              }
              case 6:
              {
                printf("liu");
                break;
              }
              case 7:
              {
                printf("qi");
                break;
              }
              case 8:
              {
                printf("ba");
                break;
              }

              case 9:
              {
                printf("jiu");
                break;
              }

    if(k!=0)

      cout<<" ";

   }

  return 0;

}

Tips:fgets函數功能爲從指定的流中讀取數據,每次讀取一行。其原型爲:char *fgets(char *str, int n, FILE *stream);從指定的流 stream 讀取一行,並把它存儲在 str 所指向的字符串內。當讀取 (n-1) 個字符時,或者讀取到換行符時,或者到達文件末尾時,它會中止。

姥姥的題解

#include<iostream>

#include<string>

using namespace std;

int main()

{

  string s;

  cin>>s;

  int sum=0;

  string str[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

  for(int i=0;i<s.length();i++)

    sum+=(s[i]-'0');

  string num=to_string(sum);//將sum轉化爲string類型的num

  for(int i=0;i<num.length();i++)

  {

    if(i!=0)   cout<<" ";

    cout<<str[num[i]-'0'];

  }

  return 0;

}

Tips:用string接收輸入,string的每一位數字累加到sum裏面,再將sum轉化爲string類型的num,對num的每一位輸出對應中文拼音。


 

【1003】我要經過

emmm目前仍是沒敲出來,姥姥的題解也沒有徹底理解,下次再寫

【1004】成績排名

讀入 n(>0)名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。

輸入格式:

每一個測試輸入包含 1 個測試用例,格式爲

1 行:正整數 n 第 2 行:第 1 個學生的姓名 學號 成績 第 3 行:第 2 個學生的姓名 學號 成績 ... ... ... 第 n+1 行:第 n 個學生的姓名 學號 成績 
 

其中姓名學號均爲不超過 10 個字符的字符串,成績爲 0 到 100 之間的一個整數,這裏保證在一組測試用例中沒有兩個學生的成績是相同的。

輸出格式:

對每一個測試用例輸出 2 行,第 1 行是成績最高學生的姓名和學號,第 2 行是成績最低學生的姓名和學號,字符串間有 1 空格。

輸入樣例:

3

Joe Math990112 89

Mike CS991301 100

Mary EE990830 95

輸出樣例:

Mike CS991301

Joe Math990112

#include<iostream>
using namespace std;
int main()
{
    int count=0,score;
    int max=-1,min=101;
    string maxName,minName,maxNum,minNum,name,num;
    cin>>count;
    for(int i=0;i<count;i++)
    {
        cin>>name>>num>>score;
        if(score>max)
        {
            max=score;
            maxName=name;
            maxNum=num;
        }
        if(score<min)
        {
            min=score;
            minName=name;
            minNum=num;
        }
    }
    cout<<maxName<<' '<<maxNum<<endl;
    cout<<minName<<' '<<minNum<<endl;
    return 0;
}


 

【1005】繼續(3n+1)猜測

卡拉茲(Callatz)猜測已經在1001中給出了描述。在這個題目裏,狀況稍微有些複雜。

當咱們驗證卡拉茲猜測的時候,爲了不重複計算,能夠記錄下遞推過程當中遇到的每個數。例如對 n=3 進行驗證的時候,咱們須要計算 三、五、八、四、二、1,則當咱們對 n=五、八、四、2 進行驗證的時候,就能夠直接斷定卡拉茲猜測的真僞,而不須要重複計算,由於這 4 個數已經在驗證3的時候遇到過了,咱們稱 五、八、四、2 是被 3「覆蓋」的數。咱們稱一個數列中的某個數 n 爲「關鍵數」,若是 n 不能被數列中的其餘數字所覆蓋。

如今給定一系列待驗證的數字,咱們只須要驗證其中的幾個關鍵數,就能夠沒必要再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。

輸入格式:

每一個測試輸入包含 1 個測試用例,第 1 行給出一個正整數 K (<100),第 2 行給出 K 個互不相同的待驗證的正整數 n (1<n100)的值,數字間用空格隔開。

輸出格式:

每一個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後一個數字後沒有空格。

輸入樣例:

6

3 5 6 7 8 11

輸出樣例:

7 6

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int arr[10000];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int count=0,n,flag=0;
    cin>>count;
    vector<int> v(count);
    for(int i=0;i<count;i++)
    {
        cin>>n;
        v[i]=n;
        while(n!=1)
        {
            if(n%2)
                n=3*n+1;
            n/=2;
            arr[n]=1;
        }
    }
    sort(v.begin(),v.end(),cmp);//sort函數默認升序排序,用cmp函數實現降序排序
    for(int i=0;i<count;i++)
    {
        if(arr[v[i]]==0)
        {
            if(flag==1)
                cout<<" ";
            cout<<v[i];
            flag=1;
        }
    }
    return 0;
    
}

Tips:sort函數默認升序排序,用cmp函數實現降序排序


 

【1006】換個格式輸出整數

讓咱們用字母 B 來表示「百」、字母 S 表示「十」,用 12...n 來表示不爲零的個位數字 n<10),換個格式來輸出任一個不超過 3 位的正整數。例如 234 應該被輸出爲 BBSSS1234,由於它有 2 個「百」、3 個「十」、以及個位的 4。

輸入格式:

每一個測試輸入包含 1 個測試用例,給出正整數 n(<1000)。

輸出格式:

每一個測試用例的輸出佔一行,用規定的格式輸出 n。

輸入樣例 1:234

輸出樣例 1:BBSSS1234

輸入樣例 2:23

輸出樣例 2:SS123

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int i,j,k,count;
    i=n%10;
    j=(n%100)/10;
    k=n/100;
    while(k--)
        cout<<"B";
    while(j--)
        cout<<"S";
    if(i)
    {
        for(int m=1;m<i+1;m++)
            cout<<m;
    }
    return 0;
}


 

【1007】素數對猜測

d

輸入格式:

輸入在一行給出正整數N

輸出格式:

在一行中輸出不超過N的知足猜測的素數對的個數。

輸入樣例:20

輸出樣例:4

#include<iostream>
using namespace std;
bool isPrime(int n)
{
    for(int x=2;x*x<=n;x++)//必需要包含x*x=n的狀況
        if(n%x==0)
            return false;
    return true;
}
int main()
{
    int n,count=0;
    cin>>n;
    for(int i=5;i<=n;i++)//別忘了n自己也多是質數
        if(isPrime(i)&&isPrime(i-2))
            count++;
    cout<<count;
    return 0;
}


 

【1008】數組元素循環右移問題

輸入格式:

每一個輸入包含一個測試用例,第1行輸入N(1N100)和M(0);第2行輸入N個整數,之間用空格分隔。

輸出格式:

在一行中輸出循環右移M位之後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。

輸入樣例:

6 2

1 2 3 4 5 6

輸出樣例:

5 6 1 2 3 4

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    m=m%n;
    vector<int> arr(n);
    for(int i=0;i<n;i++)
        cin>>arr[i];
    reverse(begin(arr),begin(arr)+n);//sort(arr.begin(),arr.end(),bmp);
    reverse(begin(arr),begin(arr)+m);
    reverse(begin(arr)+m,begin(arr)+n);
    for(int j=0;j<n-1;j++)
        cout<<arr[j]<<" ";
    cout<<arr[n-1];
    return 0;
}

Tips:sort(arr.begin(),arr.end(),bmp);

數組長度爲n,要想把數組循環右移m位,只須要先將整個數組a倒置,再將數組前m位倒置,最後將數組後n-m位倒置便可完成循環右移m位。

reverse()函數能夠實現將一個數組或者vector中元素倒置,這個函數再algorithm頭文件中

若是m>n,那麼循環右移m位至關於循環右移m%n位,由於那些n倍數位的移動是多餘的,因此在使用m以前,先將m%n。


 

【1009】說反話

給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。

輸入格式:

測試輸入包含一個測試用例,在一行內給出總長度不超過 80 的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用 1 個空格分開,輸入保證句子末尾沒有多餘的空格。

輸出格式:

每一個測試用例的輸出佔一行,輸出倒序後的句子。

輸入樣例:Hello World Here I Come

輸出樣例:Come I Here World Hello

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    string s;
    stack<string> st;
    while(cin>>s)
        st.push(s);
    cout<<st.top();
    st.pop();
    while(!st.empty())
    {
        cout<<' '<<st.top();
        st.pop();
    }
    return 0;
}


 

【1010】一元多項式求導

輸入格式:

以指數遞降方式輸入多項式非零項係數和指數(絕對值均爲不超過 1000 的整數)。數字間以空格分隔。

輸出格式:

以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。注意「零多項式」的指數和係數都是 0,可是表示爲 0 0

輸入樣例:3 4 -5 2 6 1 -2 0

輸出樣例:12 3 -10 1 6 0

#include<iostream>
using namespace std;
int main()
{
    int a,b,flag=0;
    while(cin>>a>>b)
    {
        if(b!=0)
        {
            if(flag==1)
                cout<<" ";
            cout<<a*b<<" "<<b-1;
            flag=1;
        }
    }
    if(flag==0)
        cout<<"0 0";
    return 0;
}算不超過#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    m=m%n;
    vector<int> arr(n);
    for(int i=0;i<n;i++)
        cin>>arr[i];
    reverse(begin(arr),begin(arr)+n);//sort(arr.begin(),arr.end(),bmp);
    reverse(begin(arr),begin(arr)+m);
    reverse(begin(arr)+m,begin(arr)+n);
    for(int j=0;j<n-1;j++)
        cout<<arr[j]<<" ";
    cout<<arr[n-1];
    return 0;N的知足猜測的素​​),請計算不超過N的知足猜測的素數對的個

本站公眾號
   歡迎關注本站公眾號,獲取更多信息