1. 程式人生 > 其它 >期末複習pta部分題解

期末複習pta部分題解

技術標籤:筆記c語言

期末複習pta部分題解

下面根據分值進行

目錄標題

逆序的三位數

7-2 逆序的三位數 (10分)
程式每次讀入一個正3位數,然後輸出按位逆序的數字。注意:當輸入的數字含有結尾的0時,輸出不應帶有前導的0。比如輸入700,輸出應該是7。
輸入格式:
每個測試是一個3位的正整數。
輸出格式:
輸出按位逆序的數。
輸入樣例:
123
輸出樣例:

321

實現逆序輸出 由於是三位數可以分別求個十百位通過判斷進行組合輸出 這裡我用了一個逆序輸出的函式方便於逆序輸出的使用

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int inverse(int n)
{
    int a=0;
    while(n)
    {
        a=a*10+n%10;// %10求得尾數 加尾數不斷*10使其進位
        n/=10;// 除10 更新尾數
    }
    return a;
}
int main
() { int n,m; cin>>n; m=inverse(n); cout<<m; }

位1的個數

7-32 位1的個數 (10分)
輸入一個非負整數,求它變成二進位制後1的個數(提示:用bin函式)。
輸入格式:
輸入一個正整數。
輸出格式:
輸出1的個數。
輸入樣例1:
在這裡給出一組輸入。例如:
37
輸出樣例1:
在這裡給出相應的輸出。例如:
3
輸入樣例2:
在這裡給出一組輸入。例如:
0
輸出樣例2:
在這裡給出相應的輸出。例如:
0

思路:用bin函式轉化為2進位制並存儲 再進行統計1的個數

#include<stdio.h>
#include<string.h> int main() { char str[100000]; int n; scanf("%d",&n); bin(n,str); return 0; } void bin(int n, char str[]) { int l=0,t=0; while(n>0)//不斷對2取餘轉化為2進位制 { str[l]=n%2; l++; n/=2; } for(int i=l-1;i>=0;i--) { if(str[i]!=0) { t++; } } printf("%d",t); }

釐米換算英尺英寸

7-3 釐米換算英尺英寸 (15分)
如果已知英制長度的英尺foot和英寸inch的值,那麼對應的米是(foot+inch/12)×0.3048。現在,如果使用者輸入的是釐米數,那麼對應英制長度的英尺和英寸是多少呢?別忘了1英尺等於12英寸。
輸入格式:
輸入在一行中給出1個正整數,單位是釐米。
輸出格式:
在一行中輸出這個釐米數對應英制長度的英尺和英寸的整數值,中間用空格分開。
輸入樣例:
170
輸出樣例:
5 6

理解公式讀懂題意即可

int main()
{
    int foot,inch;
	int meter;
	scanf("%d",&meter);
	foot = meter/30.48;
	inch = (meter-30.48*foot)/30.48*12;
	printf("%d %d\n",foot,inch);
	return 0;
}

整數四則運算

沒什麼特別的注意輸出格式就可以了

輸出最小的正整數

7-17 輸出最小的正整數 (15分)
輸入n個整數,找出最小的正整數並輸出。
輸入格式:
第一行輸入一個正整數n(n<1000),第二行輸入n個整數,用空格隔開。
輸出格式:
輸出一個整數為n個輸入的整數中最小的正整數,如果沒有找到,輸出"not found"。
輸入樣例:
3
8 5 9
輸出樣例:
5

通過迴圈歷遍陣列元素 滿足條件更新即可

#include <iostream>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
  int n;
  cin>>n;
  int a[1005];
  for(int i=0;i<n;i++)
  cin>>a[i];
  int m=a[0];
  for(int i=0;i<n;i++)
  {
     if(a[i]<m&&a[i]>0)
     {
         m=a[i];
     }
  }
  if(m<=0) printf("not found");
  else cout<<m;
}

組合成最小的三位數

7-18 組合成最小的三位數 (15分)
輸入一個三位數的正整數,將數字位置重新排列,組成一個儘可小的三位數。
輸入格式:
輸入一個三位的正整數。
輸出格式:
輸出組合之後最小的三位值正整數。
輸入樣例:
315
輸出樣例:
135

由於是三位數所以可以直接求得各位數字 將小數往前排就行(注意一下各位上的數為0的情況即可)

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
   int n;
   cin>>n;
   int a=n%10;
   int b=n/10%10;
   int c=n/100;
   int m1=a,m2=a,sum=a+b+c;
   m1=min(a,min(b,c));//c++自帶的min和max函式求最大最小值
   m2=max(a,max(b,c));//c語言可以通過比較求最大最小值
   int z=sum-m1-m2;//求中間值
   if(m1!=0)printf("%d",m1*100+z*10+m2);
   else
   {
       if(z!=0)printf("%d",z*100+m1*10+m2);
       else printf("%d",m2*100+m1*10+z);
   }
}

輸出10個不重複的英文字母

7-27 輸出10個不重複的英文字母 (15分)
隨機輸入一個字串,把最左邊的10個不重複的英文字母(不區分大小寫)挑選出來。 如沒有10個英文字母,顯示資訊“not found”
輸入格式:
在一行中輸入字串
輸出格式:
在一行中輸出最左邊的10個不重複的英文字母或顯示資訊“not found"
輸入樣例1:
在這裡給出一組輸入。例如:
poemp134
輸出樣例1:
在這裡給出相應的輸出。例如:
not found
輸入樣例2
在這裡給出一組輸入。例如:
This is a test example
輸出樣例2:
在這裡給出相應的輸出。例如:
Thisaexmpl

定義一個字串陣列 由於是要輸出10個不重複的字母 所以再定義一個數組記錄一下字母出現次數 注意題目說不區分大小寫

#include <iostream>
#include<cmath>
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
    string s;//也可以寫成 char s[1005];
    char c[1005];
    memset(c,0,sizeof(c));
    int a[1005]={0};
    getline(cin,s);//如果是C語言可以用gets(s);
    int len=s.size();//求字串長度 c語言中是strlen函式
    int m;   int k=0;int n=0;
    for(int i=0;i<len;i++)
    {
      if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
       {
           if(isupper(s[i]))//如果是大寫字母
           m=s[i]-'A';//轉化為小寫對應對應數字記錄次數
           else
           m=s[i]-'a';
           a[m]++;
           if(a[m]==1)//滿足不重複進行儲存
            {
               c[n]=s[i];
               //cout<<c[n];
               n++;
               k++;
            }
           //cout<<a[m]<<"*";
        }
    }
    //cout<<k<<endl;
    if(k<10) printf("not found");
    else
    {
      for(int i=0;i<10;i++)
      cout<<c[i];   
    }
}

顯示指定範圍的素數並求和

7-28 顯示指定範圍的素數並求和 (15分)
本題要求顯示給定整數M和N區間內素數並對它們求和。
輸入格式:
在一行輸入兩個正整數M和N(1≤M≤N≤1000)。
輸出格式:
顯示指定範圍的素數,素數間空一格,每五個換一行。 單獨一行輸出素數的個數及素數的和。
輸入樣例:
在這裡給出一組輸入。例如:
4 30
輸出樣例:
在這裡給出相應的輸出。例如:
5 7 11 13 17
19 23 29
amount=8 sum=124

判斷是否為素數 滿足條件輸出 注意格式即可

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int prime(int n)//判斷素數函式
{
    int i,k;
    if(n==1)
        return 0;
    k=(int)sqrt(n);
    for(i=2;i<=k;i++)
    {
        if(n%i==0)
            return 0;
    }
    return 1;
}
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    int amount=0,sum=0;
    for(int i=m;i<=n;i++)
    {
        if(prime(i)==1)
        {
            cout<<i<<" ";
            amount++;
            sum+=i;
            if(amount%5==0)
            cout<<endl;
        }
    }
    printf("\n");
    printf("amount=%d sum=%d",amount,sum);
}

程式設計實現兩個分數相加

7-29 程式設計實現兩個分數相加。 (15分)
輸入兩個分數,例如3/4+1/2,輸出3/4+1/2=5/4。 執行程式時,如下圖所示:
在這裡插入圖片描述
輸入樣例1:
3/4+1/2
輸入樣例2:
1/6+1/2
輸出樣例1:
3/4+1/2=5/4
輸出樣例2:
1/6+1/2=2/3

按照自己計算分數相加的思想寫就行 要用到最大公約數函式

#include <stdio.h>
#include<math.h>
int main()
{
	int n,i;
	int f,a,b,c,d,x,y;
	scanf("%d/%d",&a,&b);
	x=a;y=b;
	int t=gcd(a,b);
	if(a!=0)
	{
		a/=t;
		b/=t;
	}
		scanf("%d/%d",&c,&d);
		f=b*d/gcd(b,d);
		a=a*f/b+c*f/d;
		b=f;
		int t1=gcd(a,b);
		if(t1!=0)
		{
			a/=t1;
			b/=t1;
		}
	printf("%d/%d+%d/%d=%d/%d\n",x,y,c,d,a%b+(a/b)*b,b);
	return 0;
}
int gcd(int a,int b)//最大公約數函式
{
	if(a%b==0)
	return b;
	else
	return gcd(b,a%b);
}

求π的近似值

7-33 求π的近似值 (15分)
用公式求π的近似值:π
​2
​​ /6=1+1/2
​2
​​ +1/3
​2
​​ +1/4
​2
​​ +。。。
當求和項小於誤差時,結束求和。
輸入格式:
在一行輸入誤差範圍
輸出格式:
在一行輸出π的近似值(保留6位小數)。
輸入樣例:
在這裡給出一組輸入。例如:
0.00000001
輸出樣例:
在這裡給出相應的輸出。例如:
3.141497

由題目要求可知 當求和的最後一項小於輸入結果時 迴圈停止 輸出求和值

#include<stdio.h>
#include<math.h>
int main()
{
	int i;
	double n,x,sum=0.0;
	scanf("%lf",&n);
	for(i=1; ;i++)
    {
        x=1.0/i/i;
        sum+=x;
        if(x<=n)
            break;
    }
    sum=sqrt(sum*6);
    printf("%.6f",sum);
}

運算子與表示式

7-34 運算子與表示式 (15分)
輸入一個三位整數,按照對稱原則擴充為5位整數。
輸入格式:
輸入一個三位整數。 注意:如果輸入的不是三位數(兩位或者四位)則不處理,沒有任何輸出。
輸出格式:
當輸入三位整數時則輸出一個5位整數,將這個三位數的前後各增加一位,分別複製三位數的百位和各位。 當輸入資料不是三位時,沒有輸出資訊。
輸入樣例:
123
輸出樣例:
11233

簡單題 按題目要求來即可

#include<stdio.h>
int main()
{
	int n,a,b,s;
	scanf("%d",&n);
	if(n<=100||n>=1000)
        return 0;
    else
    {
        a=n/100;
        b=n%10;
        s=a*10000+n*10+b;
        printf("%d",s);
    }
}

逆序輸出數字

7-41 逆序輸出數字 (15分)
程式每次讀入一個正整數,然後輸出按位逆序的數字。注意:當輸入的數字含有結尾的0時,輸出不應帶有前導的0。
輸入格式:
輸入一個正整數。
輸出格式:
輸入樣例:
在這裡給出一組輸入。例如:
71800
輸出樣例:
在這裡給出相應的輸出。例如:
817

同上面的逆序輸出 用逆序函式然後輸出即可

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int inverse(int n)
{
    int a=0;
    while(n)
    {
        a=a*10+n%10;
        n/=10;
    }
    return a;
}
int main()
{
   int n,m;
   cin>>n;
   m=inverse(n);
   cout<<m;
}

相鄰數對

7-42 相鄰數對 (15分)
給定n個不同的整數,問這些數中有多少對整數,它們的值正好相差1。
輸入格式:
輸入的第一行包含一個整數n,表示給定整數的個數。 第二行包含所給定的n個整數。
輸出格式:
輸出一個整數,表示值正好相差1的數對的個數。
輸入樣例:
6
10 2 6 3 7 8
輸出樣例:
3
樣例說明:
值正好相差1的數對包括(2, 3), (6, 7), (7, 8)。   
評測用例規模與約定:
1<=n<=1000,給定的整數為不超過10000的非負整數。

由題目要求可知兩個數只要滿足相差1則為一個相鄰數對
所以可以通過雙重迴圈尋找並記錄

#include<stdio.h>
int main()
{
    int i,j,c=0,m,n,a[10000];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
    {
        m=a[i]+1;
        for(j=0;j<n;j++)
        {
            if(m==a[j])
                c++;
        }
    }
    printf("%d",c);
}