26進位制乘法(模擬高精度)
阿新 • • 發佈:2019-01-10
題意:給你倆26進位制數(a對應0,b對應1…),求乘積
比賽的時候我的第一想法是把兩個數都變成10進位制,然後直接乘,乘出來再轉換為10進位制…然後就發現爆了unsigned long long….一臉懵逼。後來機智地發現GCC的__int128可以水過去…然後就沒有然後了…
不過,要是資料再大一點估計就GG了,所以還是要了解一下正解…其實也不難,就是模擬一下高精度演算法就行了….
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main()
{
int ans[60]={0},i,j,k;
string str1,str2;
cin>>str1>>str2;
for(i=0;i<str1.size();i++)//必須從0開始...否則並不能從最末位開始覆蓋
for(j=0;j<str2.size();j++)//模擬高精度的方式還是要記一下....
ans[i+j]+=(int)(str1[0]-'a')*(str2[0]-'a');
int jin=0;
for(i=0;i<str1.size()+str2.size();i++){
if (jin)ans[i]+=jin;
jin=ans[i]/26;ans[i]%=26;
}
if(ans[str1.size()+str2.size()-1])
cout<<(char)(ans[str1.size()+str2.size()-1]+'a');
for(i=str1.size()+str2.size()-2;i>=0;i--)
cout<<(char)(ans[i]+'a');
cout<<endl;
return 0;
}