題目
- A.最近距離(簽到題)
- 題目
- 思路:
- 代碼:
- B.這是一道特別簡單的題目(簡單數學題)
- 題目:
- 思路:
- 代碼:
- C.M78星云的字符轉換(基礎題)
- 題目:
- 思路:
- 代碼:
- D.M78星云的排隊事故(前綴和板子題)
- 題目:
- 思路:
- 代碼:
- F.不服氣的潔潔學姐(gcd)
- 題目:
- 思路:
- 代碼:
- E.來自M78星云的小測驗(進制轉換+回文)
- 題目:
- 思路:
- 代碼:
- G.來自M78星云的減法運算(模擬題/彩蛋題)
- 題目:
- 思路:
- python解法(最簡單的解法):
- 代碼:
- c/c++解法(大模擬):
- 代碼:
A.最近距離(簽到題)
題目

思路:
只需要判斷AB直線是否垂直坐標軸且F點在AB線段之間即可,若不符合:代表A、B點之間的最短路徑不止一條,最終結果就為A、B兩點的橫縱坐標差的絕對值之和;如果符合,則代表A、B點之間的最短路徑只有一條,則A到B點是需要繞過F點,則在不符合的條件上加上繞路的距離2,
代碼:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int Ax,Ay,Bx,By,Fx,Fy;
//讀入A、B、F點坐標
scanf("%d %d",&Ax,&Ay);
scanf("%d %d",&Bx,&By);
scanf("%d %d",&Fx,&Fy);
int ans = abs(Bx - Ax) + abs(By - Ay);//計算A、B點的橫縱坐標差的絕對值之和
if(Ax == Bx && Bx == Fx && Fy > min(Ay,By) && Fy < max(Ay,By)) ans += 2;
//判斷是否AB線段垂直與x軸且F點在AB線段之間
if(Ay == By && By == Fy && Fx > min(Ax,Bx) && Fx < max(Ax,Bx)) ans += 2;
//判斷是否AB線段垂直與y軸且F點在AB線段之間
printf("%d\n",ans);
}
return 0;
}
B.這是一道特別簡單的題目(簡單數學題)
題目:

思路:
讓你判斷一個數是否有除1以外的奇數因數,只需要將數進行完全的因數分解(分解為全為質數相乘的形式),
發現,只有當因數全為2(換句話說就是這個數是2n)時,沒有除1以外的奇數因子,
代碼:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n;
cin >> n;
//如果n為整數,就不斷/2知道其為奇數
while(n % 2 == 0 ){
n /= 2;
}
//只需要判斷這個奇數是否為1,為1證明這個數完全分解的因子全為2,反之亦然
if(n != 1) cout<<"YES";
else cout<<"NO";
return 0;
}
C.M78星云的字符轉換(基礎題)
題目:

思路:
通過ASCLL碼轉換,將小寫字符轉化為大寫字母,如果忘了大小寫字母相差多少位的,可以輸出一下小寫字母減大寫字母來看一下,
代碼:
#include<stdio.h>
#include<string.h>
int main()
{
char str[1010];
//字串讀入方式
scanf("%s",str);
//strlen函式求字串長度
for(int i = 0 ; i < strlen(str) ; i ++){
//根據ASCLL碼小寫字母比大寫字母大32來轉換大小寫字母
if(str[i] >= 'a' && str[i] <= 'z') str[i] -= 32;
}
printf("%s",str);
return 0;
}
D.M78星云的排隊事故(前綴和板子題)
題目:

思路:
基礎前綴和知識運用,先進行排序,再求區間 [l,r] 的和即求 [1,r] - [1,l - 1] 的值即可,
代碼:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e3 + 10;
int arr[N];
int q[N];//前綴和陣列 ,q[i]代表[1,i]區間中所有值的和
int n,l,r;
int main()
{
scanf("%d",&n);
for(int i = 1 ; i <= n ; i ++){
scanf("%d",&arr[i]);
}
sort(arr + 1 , arr + 1 + n);//sort排序函式,也可以自己寫冒泡代替
//求前綴和陣列
for(int i = 1 ; i <= n ; i ++) q[i] = q[i - 1] + arr[i];
scanf("%d %d",&l,&r);
printf("%d",q[r] - q[l - 1]);
return 0;
}
F.不服氣的潔潔學姐(gcd)
題目:

思路:
不限次數對陣列任意區間減去相同的值,最終使陣列所有值相同,假定減去的值為K,對陣列任意 arri 可假設其減少了n次K值后變為定值s,即 arri - nK = s, 陣列中每個值在變化前后均滿足此式,求K的最大值,即求陣列中所有減少量nK的最大公約數(gcd),對于每一個數減少的量一定使K的倍數或為0,于是相鄰兩個數做差 |arra - arrb |= |(aK + s) - (bK + s) |= |(a-b)K|,所以只需要對所有相鄰的兩個數的差值的絕對值(不為0,為0沒意思)求最大公約數即可,
代碼:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int arr[N],q[N];
int n;
int gcd(int a , int b)
{
if(b == 0) return a;
return gcd(b,a%b);
}
int main()
{
scanf("%d",&n);
for(int i = 0 ; i < n ; i ++) scanf("%d",&arr[i]);
int k = 0;
//相鄰兩位做差,得到K的倍數
for(int i = 0 ; i + 1 < n ; i ++)
if(arr[i + 1] - arr[i])//將所有不為0的差值的絕對值存入q陣列
q[k++] = abs(arr[i + 1] - arr[i]);
int ans = q[0];
//對k個K的倍數求最大公約數,得到結果
for(int i = 1 ; i < k ; i ++) ans = gcd(ans , q[i]);
//若ans == 0 ,代表arr陣列中所有值相等,K最大值趨于無窮
if(ans == 0) printf("-1");
else printf("%d",ans);
return 0;
}
E.來自M78星云的小測驗(進制轉換+回文)
題目:

思路:
將數字轉化為m進制后用字串形式存盤,然后用雙指標一頭一尾向中間跑,不斷進行比較判斷是否為回文即可,
代碼:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e4 + 10;
int n , m;
char q[20] = "0123456789ABCDEF";
bool check(int a)
{
char s[100];//存盤a轉換為m進制后的字串
int k = 0;//記錄轉換為字串后的位數
a = a * a;
//進行進制轉換
while(a){
s[k ++] = q[a % m];
a /= m;
}
//從頭尾向中間比較是否字符相同,若存在不同則不為回文
int i = 0, j = k - 1;
while(i < j){
if(s[i] == s[j]) i++,j--;
else return false;//不滿足回文回傳false
}
return true;
}
int main()
{
scanf("%d %d",&n,&m);
int ans = 0;
for(int i = 1 ; i <= n ; i ++){
if(check(i)) ans ++;//記錄滿足回文的數量
}
printf("%d",ans);
}
G.來自M78星云的減法運算(模擬題/彩蛋題)
題目:

思路:
python解法(最簡單的解法):
由于python的整數沒有范圍限制,之間定義兩個數做差即可,
代碼:
a = int(input().strip())
b = int(input().strip())
print(a-b)
c/c++解法(大模擬):
用陣列模擬計算程序,
代碼:
#include<bits/stdc++.h>
using namespace std;
//判斷A是否大于B
bool check(string str1 , string str2)
{
int len1 = str1.length(),len2 = str2.length();
if(len1 != len2) return len1 > len2;
for(int i = len1 - 1 ;i >= 0 ; i --)
if(str1[i] != str2[i]) return str1[i] > str2[i];
return true;
}
int main()
{
string str1,str2;
cin>>str1>>str2;
int ans[1000];
bool s = true;
if(!check(str1,str2)){
//如果A<B,交換A,B,并用s記錄結果為負
swap(str1,str2);
s = false;
}
int i = str1.length() - 1, j = str2.length() - 1;
int k = 0,cn = 0; //k代表是否借位
//A - B的模擬計算程序
while(i >= 0 && j >= 0){
if(str1[i] + k < str2[j]){
ans[cn ++] = str1[i] - str2[j] + 10 + k ;
k = -1;
}else{
ans[cn++] = str1[i] - str2[j] + k ;
k = 0;
}
i--,j--;
}
//A的位數多余B,要將A多余位數加上
while(i >= 0){
if(str1[i] - '0' + k >= 0){
ans[cn++] = str1[i] - '0' + k;
k = 0;
}else{
ans[cn++] = str1[i] - '0' + k + 10;
k = -1;
}
i--;
}
//同理B的位數多余A,要將B多余位數加上
while(j >= 0){
if(str2[j] - '0' + k >= 0){
ans[cn++] = str2[j] - '0' + k;
k = 0;
}else{
ans[cn++] = str2[j] - '0' + k + 10;
k = -1;
}
j--;
}
if(!s) cout<<"-";
while(!ans[cn - 1] && cn > 1) cn--;
for(int i = cn - 1 ; i >= 0 ; i --) cout<<ans[i];
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/352285.html
標籤:其他
