期末複習pta部分題解
期末複習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);
}