这里多项式需要要考虑进位。
1、多项式加法✔
直接遍历数组N,等于0不输出
c[i] = a[i] + b[i];
1002 A+B for Polynomials
#include <iostream>
using namespace std;
const int N = 1010;
double a[N], b[N], c[N];
int read_data(double x[N]) {
int k, n;
double coef;
cin >> k;
for (int i = 0; i < k; i++) {
cin >> n >> coef;
x[n] = coef;
}
return k;
}
int add() {
int k = 0;
for (int i = 0; i < N; i++) {
c[i] = a[i] + b[i];
if (c[i]) k++;
}
return k;
}
int main() {
int k, k1, k2;
k1 = read_data(a);
k2 = read_data(b);
k = add();
cout << k;
for (int i = N - 1; ~i; i--)
if (c[i]) printf(" %d %.1lf", i, c[i]);
return 0;
}
2、多项式乘法✔
c[i+j] += a[i] * b[j]
1009 Product of Polynomials
#include<iostream>
using namespace std;
const int N = 1000+10;
double a[N],b[N],c[2*N];
int main(){
int m;
cin>>m;
while(m--){
int n;
double k;
cin>>n>>k;
a[n]=k;
}
cin>>m;
while(m--){
int n;
double k;
cin>>n>>k;
b[n]=k;
}
for(int i=0;i<N;i++ ){
for(int j=0;j<N;j++){
c[i+j] += a[i]*b[j];
}
}
m=0;
for(int i=0;i<2*N;i++){
if(c[i]) m++;
}
cout<<m;
for(int i=2*N-1;i>=0;i--){
if(c[i]) printf(" %d %.1f",i,c[i]);
}
cout<<endl;
}
3、数字加倍✔
#include<iostream>
#include<cstring>
using namespace std;
const int N=30;
int a[N];
int b[N];
int map[10];
int ans[10];
bool check(){
for(int i=0;i<10;i++){
if(map[i]!=ans[i]) return false;
}
return true;
}
int main(){
string s;
cin>>s;
int n=s.size();
for(int i=0;i<n;i++){
a[n-i-1] = s[i]-'0';
map[a[n-i-1]] +=1;
}
int t=0;
for(int i=0;i<n;i++){
b[i]=(2*a[i]+t )%10;
t= (2*a[i]+t )/10;
ans[b[i]]+=1;
}
if(check() &&t==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
if(t==1) cout<< 1;
for(int i=n-1;i>=0;i--){
cout<<b[i];
}
cout<<endl;
}
4、回文数1✔
高精度加法
1024 Palindromic Number
#include<iostream>
#include<vector>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> add(vector<int> &a,vector<int> &b){
vector<int> c;
int t=0;
for(int i=0;i<a.size();i++){
c.push_back( (a[i] + b[i] + t )%10) ;
t = (a[i] + b[i] + t )/10;
}
if(t==1) c.push_back(1);
return c;
}
int main(){
string s;
int k;
cin>>s>>k;
vector<int> v;
for(int i=s.size()-1;i>=0;i--) v.push_back(s[i]-'0');
for (int i=0;i<=k;i++){
vector<int> a=v;
reverse(a.begin(),a.end());
if(a==v || i==k) {
for(int i=v.size()-1;i>=0;i--) cout<<v[i];
cout<<endl;
cout<<i<<endl;
break;
}
else {
v = add(a,v);
}
}
}
5、哈利波特加法✔
也是高精度加法;
有个坑的点是第一位的进位问题不是1e7,改成1e8过了。
1058 A+B in Hogwarts
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10;
int a[3],b[3];
int c[3];
int main(){
scanf("%d.%d.%d %d.%d.%d",&a[2],&a[1],&a[0],&b[2],&b[1],&b[0]);
int t=0;
int p[3] = {29,17,100000000+1};
for(int i=0;i<3;i++){
int temp = (a[i] + b[i] +t );
c[i] = temp % p[i];
t = temp / p[i] ;
}
printf("%d.%d.%d\n",c[2],c[1],c[0]);
if(t>0)
cout<<c[9999999999999];
}
6、回文数2✔
与回文数1相同,只是中间过程需要输出。
1136 A Delayed Palindrome
#include<iostream>
#include<vector>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> add(vector<int> &a,vector<int> &b){
vector<int> c;
int t=0;
for(int i=0;i<a.size();i++){
c.push_back( (a[i] + b[i] + t )%10) ;
t = (a[i] + b[i] + t )/10;
}
if(t==1) c.push_back(1);
for(int i=b.size()-1;i>=0;i--) cout<<b[i];
cout<<" + ";
for(int i=a.size()-1;i>=0;i--) cout<<a[i];
cout<<" = ";
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
cout<<endl;
return c;
}
int main(){
string s;
cin>>s;
vector<int> v;
for(int i=s.size()-1;i>=0;i--) v.push_back(s[i]-'0');
for (int i=0;i<10;i++){
vector<int> a=v;
reverse(a.begin(),a.end());
if(a==v) {
for(int i=v.size()-1;i>=0;i--) cout<<v[i];
cout<<" is a palindromic number."<<endl;
return 0;
}
else {
v = add(a,v);
}
}
cout<<"Not found in 10 iterations."<<endl;
}