思考过程
这道题刚开始搞得时候,毫无头绪,因为一直把a+bi看成了一个整体,没有想着把a和b分开运算,然后思维上的难度就比较大。然后某大佬给了示范
(刚开始我还没有想到用&1的办法搞成二进制,我刚开始是直接想用16进制硬刚,有几次就算i-1的多少次方,现在想起来真的好麻烦,而且过于复杂
题目难点:
1.将16进制数转化成二进制。16进制的一位对应2进制中的四位然后将答案存在数组中,一位一位进行调用。(本来大佬给了一种比较简单的方法可以直接把16进制数搞成十进制数cin<<hex<<(十六进制数),但这道题给的数据太大了,超过了long long的范围,所以这个方法不合适在这里用,在别的地方用这个方法可能会比较方便
2.用两个get char()先把前面的0x拿掉,然后再开始处理后面的16进制数
3.在输出的时候要考虑ans1和ans2的各种情况进行分类套路
4.比较难的部分已经贴了图片,要注意的是如果一道代码题可以用笔记算出来,那么这道题的代码的最大的难点可能已经被解决了
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char s[100];
int a[1111],b[100];
void change(char s[])
{
for(int i=0;i<strlen(s);i++)
{
if(s[i]>='0'&&s[i]<='9') b[i]=s[i]-'0';
if(s[i]>='A'&&s[i]<='Z') b[i]=s[i]-'A'+10; //cout<<b[i]<<endl;
for(int j=4*i+3;j>=4*i;j--)
{
a[j]=b[i]%2;
b[i]/=2;
}
} //for(int i=0;i<4*strlen(s);i++) cout<<a[i]; cout<<endl;
}
int main()
{
getchar();
getchar();
//unsigned long long n;
long long ans1=0,ans2=0,p1=-1,p2=1,now1=1,now2=0;
for(int i=1;i<1111;i++) a[i]=0;
gets(s);//puts(s);cout<<endl;
change(s);
for(int i=4*strlen(s)-1;i>=0;i--)
{
if(a[i]&1)
{
ans1+=now1;
ans2+=now2;
}
long long temp1=now1*p1-now2*p2,temp2=now1*p2+now2*p1;
now1=temp1;
now2=temp2;
//n>>=1;
}
if(ans1!=0)
{
if(ans2>1) cout<<ans1<<"+"<<ans2<<"i"<<endl;
if(ans2==1) cout<<ans1<<"+"<<"i"<<endl;
if(ans2==0) cout<<ans1<<endl;
if(ans2==-1) cout<<ans1<<"-i"<<endl;
if(ans2<-1) cout<<ans1<<ans2<<"i"<<endl;
}
if(ans1==0)
{
if(ans2>1||ans2<-1) cout<<ans2<<"i"<<endl;
if(ans2==1) cout<<"i"<<endl;
if(ans2==0) cout<<"0"<<endl;
if(ans2==-1) cout<<"-i"<<endl;
}
return 0;
}
又重新用operator搞了一遍
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
struct cp
{
long long a,b;
cp operator+(const cp &other)
{
cp ans;
ans.a=0,ans.b=0;
ans.a=a+other.a;
ans.b=b+other.b;
return ans;
}
cp operator-(const cp &other)
{
cp ans;
ans.a=0,ans.b=0;
ans.a=a-other.a;
ans.b=b-other.b;
return ans;
}
cp operator*(const cp &other)
{
cp ans;
ans.a=0,ans.b=0;
ans.a=a*other.a-b*other.b;
ans.b=a*other.b+b*other.a;
return ans;
}
}num[1111];
char s[100];
void change(char s[])
{
for(int i=0;i<strlen(s);i++)
{
if(s[i]>='0'&&s[i]<='9') num[i].b=s[i]-'0';
if(s[i]>='A'&&s[i]<='Z') num[i].b=s[i]-'A'+10; //cout<<b[i]<<endl;
for(int j=4*i+3;j>=4*i;j--)
{
num[j].a=num[i].b%2;
num[i].b/=2;
}
} //for(int i=0;i<4*strlen(s);i++) cout<<a[i]; cout<<endl;
}
int main()
{
getchar();
getchar();
//unsigned long long n;
cp p,now,ans,temp;
p.a=-1,p.b=1,ans.a=0,ans.b=0,now.a=1,now.b=0,temp.a=0,temp.b=0;
for(int i=1;i<1111;i++) num[i].a=0;
gets(s);//puts(s);cout<<endl;
change(s);
for(int i=4*strlen(s)-1;i>=0;i--)
{
if(num[i].a&1) ans=ans+now;
temp=now*p;
now.a=temp.a; now.b=temp.b;
//n>>=1;
}
if(ans.a!=0)
{
if(ans.b>1) cout<<ans.a<<"+"<<ans.b<<"i"<<endl;
if(ans.b==1) cout<<ans.a<<"+"<<"i"<<endl;
if(ans.b==0) cout<<ans.a<<endl;
if(ans.b==-1) cout<<ans.a<<"-i"<<endl;
if(ans.b<-1) cout<<ans.a<<ans.b<<"i"<<endl;
}
if(ans.a==0)
{
if(ans.b>1||ans.b<-1) cout<<ans.b<<"i"<<endl;
if(ans.b==1) cout<<"i"<<endl;
if(ans.b==0) cout<<"0"<<endl;
if(ans.b==-1) cout<<"-i"<<endl;
}
return 0;
}