i-1进制——Roj_1014

思考过程
这道题刚开始搞得时候,毫无头绪,因为一直把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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值