题目
思路①(比较拉跨的思路)
先转换成十进制再转换成2进制之后按复数相乘若干次相加即可。可惜不能AC只能过部分数据。
麻了……题目给的数据太大LL都放不下,过段时间再写一个用字符串处理的情况吧,,,在这个事件上解题太久了,等完全AC再补充其他思路吧
代码
#include<iostream>
#include<stack>
using namespace std;
string alpha = "0123456789ABCDEF";
void transI(stack<int>&bin)
{
long long i = 0;
long long r = 0;
int len = bin.size();
for(int j = len; j > 1; j--)
{
//这时候你从stack取出来的是最高位
//比如说二进制111,两位,那么只需要处理前两位
int temp = bin.top();
if(temp == 0)
{
bin.pop();
continue;
}
if( j != 0 )
{
long long a = -1;
long long b = 1;
int c = -1;
int d = 1;
for(int k = j - 2; k > 0; k--)//两个-1+i相乘本身就有两次了,所以对应的j要多-1而且k要>0
{
long long ta = a;
long long tb = b;
a = (ta * c - tb *d);
b = (tb * c + ta *d);
}
//cout << "a "<<a<<" b "<<b<<endl;
bin.pop();
i += b;
r += a;
}
}
int temp = bin.top();
r += temp;
int puti = 0;
int putr = 0;
int positive = 0;
int one = 0;
if(i)
{
puti = 1;
if(i == 1 || i == -1){one = 1;}
if(i > 0){positive = 1;}
}
if(r){putr = 1;}
if(putr)
{cout << r;}
if(positive && putr)
{cout << '+';}
if(puti && !one)
{cout<< i << "i" ;}
else if(puti && one)
{
cout << ((i > 0)?"i":"-i");
}
}
int main()
{
string hexadecimal;
cin >> hexadecimal;
if(hexadecimal == "0x0")
{
cout << "0";
return 0;
}
int len = hexadecimal.length();
long long decimal = 0;
for(int i = 2; i < len; i++)
{
decimal *= 16;
decimal += alpha.find(hexadecimal[i]);
}
stack<int>bin;
while(decimal)
{
int temp = decimal % 2;
bin.push(temp);
decimal >>= 1;
}
//写-1+i次方的算法计算出每次计算后对应的 r 和 l 所加的大小
//cout << bin.size()<<endl;
transI(bin);
return 0;
}
思路②
题目给了 0 到 f 对应的-1+i进制的复数表现形式,那么我们又发现16进制下,没隔1位相当于对应的进制的四次方,我们恰好发现
(
−
1
+
i
)
4
=
=
−
4
(-1+i)^{4} == -4
(−1+i)4==−4
也就是说,我们把每一个进制下对应的数字字母转化为对应的复数形式,那么就可以通过 ✖n次(-4)来得到对应的位置的虚数
然后依次累加即可
代码
#include<iostream>
#include<stack>
using namespace std;
string alpha = "0123456789ABCDEF";
void transI(stack<char>&bin)
{
int len = bin.size();
long long i = 0;
long long r = 0;
long long complex[16][2] =
{
{0,0},{1,0},{-1,1},{0,1},
{0,-2},{1,-2},{-1,-1},{0,-1},
{2,2},{3,2},{1,3},{2,3},
{2,0},{3,0},{1,1},{2,1}
};
for(int j = 0; j < len; j++)
{
char temp = bin.top();
int temp_int = alpha.find(temp);
long long ti = complex[temp_int][1];
long long tr = complex[temp_int][0];
for(int k = 0; k < j;k++)
{
ti *= -4;
tr *= -4;
}
i += ti;
r += tr;
//cout << bin.top() << endl;
//cout << "ti " << ti <<" tr "<<tr <<" r " << r << " i " << i <<endl<<endl;
bin.pop();
}
int puti = 0;
int putr = 0;
int positive = 0;
int one = 0;
if(i)
{
puti = 1;
if(i == 1 || i == -1){one = 1;}
if(i > 0){positive = 1;}
}
if(r){putr = 1;}
if(putr)
{cout << r;}
if(positive && putr)
{cout << '+';}
if(puti && !one)
{cout<< i << "i" ;}
else if(puti && one)
{
cout << ((i > 0)?"i":"-i");
}
}
int main()
{
string hexadecimal;
cin >> hexadecimal;
if(hexadecimal == "0x0")
{
cout << "0";
return 0;
}
int len = hexadecimal.length();
stack<char>bin;
for(int i = 2; i < len; i++)
{
bin.push(hexadecimal[i]);
}
//cout << endl<<bin.size()<<endl;
transI(bin);
return 0;
}