目录
高精度
1002 A+B for Polynomials
单词:
polynomials 多项式
exponents 指数
coefficients 系数
解析:
哈希表思想
数组的下标看作指数,下标对应的内容表示系数
注意点:
保留一位小数:%.1lf
#include <iostream>
using namespace std;
const int N = 1010;
double a[N], b[N], c[N];
int main(){
int k;
cin >> k;
while (k -- ){ // 读入第一个多项式
int n;
double v;
cin >> n >> v;
a[n] = v;
}
cin >> k;
while (k -- ){ // 读入第二个多项式
int n;
double v;
cin >> n >> v;
b[n] = v;
}
// 求和
for (int i = 0; i < N; i ++ ) c[i] = a[i] + b[i];
k = 0;
for (int i = 0; i < N; i ++ )
if (c[i])
k ++ ;
cout << k;
for (int i = N - 1; i >= 0; i -- )
if (c[i])
printf(" %d %.1lf", i, c[i]);
return 0;
}
1009 Product of Polynomials
解析:
与1002类似,多开一个数组存结果
注意点:
#include <iostream>
using namespace std;
const int N = 1010;
double a[N], b[N], c[N * 2];
void input(double a[]){
int k;
cin >> k;
while (k -- ){
int n;
double v;
cin >> n >> v;
a[n] = v;
}
}
int main(){
input(a);
input(b);
// 做乘法
for (int i = 0; i < N; i ++ )
for (int j = 0; j < N; j ++ )
c[i + j] += b[i] * a[j];
int k = 0;
for (int i = 0; i < N * 2; i ++ )
if (c[i])
k ++ ;
cout << k;
for (int i = N * 2 - 1; i >= 0; i -- )
if (c[i])
printf(" %d %.1lf", i, c[i]);
return 0;
}
1023 Have Fun with Numbers
单词:
permutation 排列
解析:
1.高精度加法(用模板)
2.判断将其加倍以后得到的数字是否可以由原数字的各数位重新排列得到
只需要将两个序列进行排序,看排序后的是否相同
注意点:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> add(vector<int> a, vector<int> b){
vector<int> c; //结果c
int t = 0; // 进位位
for(int i = 0; i < a.size() || i < b.size(); i++){ //用t来表示A0 + B0 + t;
if(i < a.size()) t += a[i];
if(i < b.size()) t += b[i]; //执行完这两步 t = A + B + t
c.push_back(t % 10);
t /= 10; //进位位判断
}
if(t != 0) c.push_back(1); //最高位还有进位,就再加一
return c;
}
int main(){
string a;
cin >> a;
vector<int> A;
for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
auto c = add(A,A);
auto d = c; //复制一份c
sort(A.begin(),A.end()); //比较前后两个序列里的元素 是否相同
sort(d.begin(),d.end()); //可通过排序之后 判断序列是否一样即可
if(A != d){
cout << "No" << endl;
}else{
cout << "Yes" << endl;
}
for(int i = c.size() - 1; i >= 0; i--){
cout << c[i];
}
return 0;
}
1024 Palindromic Number
解析
1.高精度加法(模板)
2.判断回文数 (vector)
注意点
n的范围是10的10次方,用高精度加法做,long long会溢出
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//判断是否是回文数
bool is_reverse(vector<int>& num){
for (int i = 0, j = num.size() - 1; i < j; i ++, j -- )
if (num[i] != num[j])
return false;
return true;
}
//高精度加
vector<int> add(vector<int> A,vector<int> B){
vector<int> c;
int t = 0;
for(int i = 0; i < A.size() || i < B.size(); i++){
if(i < A.size()) t += A[i];
if(i < B.size()) t += B[i];
c.push_back(t % 10);
t /= 10;
}
if(t) c.push_back(1);
return c;
}
int main(){
string a;
int k;
cin >> a >> k;
vector<int> A;
for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
for(int i = 0; i < k; i++){
if(is_reverse(A)){ //是回文数
for(int j = 0; j < A.size(); j++) cout << A[j];
cout << endl << i;
return 0;
}
vector<int> B = A; //不是回文数就反转,相加
reverse(B.begin(),B.end());
A = add(A,B);
}
for(int i = A.size() - 1; i >= 0; i--) cout << A[i];
cout << endl << k;
return 0;
}
1058 A+B in Hogwarts
注意点:
可以用scanf格式化读入
#include <iostream>
using namespace std;
int main(){
int a, b, c, d, e, f;
scanf("%d.%d.%d %d.%d.%d", &a, &b, &c, &d, &e, &f);
a += d, b += e, c += f; //对应位相加
b += c / 29, c %= 29; //是否需要进位
a += b / 17, b %= 17;
printf("%d.%d.%d\n", a, b, c);
return 0;
}
1136 A Delayed Palindrome
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
bool is_reverse(vector<int> A){
for (int i = 0, j = A.size() - 1; i < j; i ++, j -- )
if (A[i] != A[j])
return false;
return true;
}
void print(vector<int> A){
for (int i = A.size() - 1; i >= 0; i -- ) cout << A[i];
}
vector<int> add(vector<int> A, vector<int> B){
vector<int> C;
for (int i = 0, t = 0; i < A.size() || i < B.size() || t; i ++ ){
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
return C;
}
int main(){
string a;
cin >> a;
vector<int> A;
for(int i = a.size() - 1; i >= 0; i--){
A.push_back(a[i] - '0');
}
for (int i = 0; i < 10; i ++ ){
if (is_reverse(A)) break;
vector<int> B(A.rbegin(), A.rend());
print(A), cout << " + ", print(B), cout << " = ";
A = add(A, B);
print(A), cout << endl;
}
if (is_reverse(A)) print(A), cout << " is a palindromic number." << endl;
else puts("Not found in 10 iterations.");
return 0;
}
进位制
1010 Radix
单词:
radix 进制
知识点:
秦九韶算法
步骤:
1. n1先转化成十进制 target。 target用long long 存
2. 遍历target+1 找到某个进制下的n2等于target。
n2不一定是小于36进制的!
3.一个个遍历会超时,可以用二分
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL; //n1转成10进制 最大不超过long long类型 ,ll可存18位
int get(char c){
if (c <= '9') return c - '0';
return c - 'a' + 10;
}
LL calc(string n, LL r){
LL res = 0;
for (auto c : n){
if ((double)res * r + get(c) > 1e16) return 1e18; //秦九韶算法
res = res * r + get(c);
}
return res;
}
int main()
{
string n1, n2;
cin >> n1 >> n2;
int tag, radix;
cin >> tag >> radix;
if (tag == 2) swap(n1, n2);
LL target = calc(n1, radix);
LL l = 0, r = max(target, 36ll);
for (auto c : n2) l = max(l, (LL)get(c) + 1);
while (l < r){
LL mid = l + r >> 1;
if (calc(n2, mid) >= target) r = mid;
else l = mid + 1;
}
if (calc(n2, r) != target) puts("Impossible");
else cout << r << endl;
return 0;
}
1015 Reversible Primes
解析:
1.读入一个数,判断是否是质数
2.再反转,看是否是质数
注意点:
#include <iostream>
using namespace std;
typedef long long LL;
bool is_prime(int n){
if (n == 1) return false;
for (int i = 2; i <= n / i; i ++ )
if (n % i == 0)
return false;
return true;
}
bool check(int n, int d){
if (!is_prime(n)) return false;
LL r = 0;
while (n){
r = r * d + n % d;
n /= d;
}
return is_prime(r);
}
int main(){
int n, d;
while (cin >> n >> d, n >= 1){
if (check(n, d)) puts("Yes");
else puts("No");
}
return 0;
}
1027 Colors in Mars
#include <iostream>
using namespace std;
char get(int x){
if (x <= 9) return '0' + x;
return 'A' + x - 10;
}
int main(){
int a[3];
for (int i = 0; i < 3; i ++ ) scanf("%d", &a[i]);
cout << '#';
for (int i = 0; i < 3; i ++ ) cout << get(a[i] / 13) << get(a[i] % 13);
return 0;
}
1100 Mars Numbers
#include <iostream>
#include <sstream>
using namespace std;
char names[][5] = { //第一个空格可以省略不写,第二个不能省
"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec",
"tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou",
};
int get(string word){
for (int i = 0; i < 25; i ++ )
if (names[i] == word){
if (i < 13) return i;
return (i - 12) * 13;
}
// return -1; // 一定不会执行
}
int main(){
int n;
cin >> n;
getchar(); //用getline时,一定要先用getchar把上一行末尾的回车读掉
while (n -- ){
string line;
getline(cin, line);
stringstream ssin(line); //用sstream读入一行string
if (line[0] <= '9'){ //在从ssin读具体的单词
int v;
ssin >> v; //ssin可以直接读成int
if (v < 13) cout << names[v] << endl;
else{
cout << names[12 + v / 13];
if (v % 13 == 0) cout << endl;
else cout << ' ' << names[v % 13] << endl;
}
}else{
int res = 0;
string word;
while (ssin >> word) res += get(word); //ssin也可以直接读成string
cout << res << endl;
}
}
return 0;
}
1019 General Palindromic Number
单词
Palindromic 回文的
注意点:
需要特判 0 (AcWing上需要,PAT不用)
#include <iostream>
#include <vector>
using namespace std;
vector<int> nums;
bool check(){ //判断回文数
for (int i = 0, j = nums.size() - 1; i < j; i ++, j -- ) //双指针
if (nums[i] != nums[j])
return false;
return true;
}
int main(){
int n, b;
cin >> n >> b;
if (!n) nums.push_back(0);
while (n) nums.push_back(n % b), n /= b;
if (check()) puts("Yes");
else puts("No");
cout << nums.back();
for (int i = nums.size() - 2; i >= 0; i -- ) cout << ' ' << nums[i];
return 0;
}