1 条题解

  • 0
    @ 2025-7-27 21:07:18

    这道题特别难,访问了一位大佬的帖子,汲取了代码精华,才最终做出! 代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define ull unsigned int
    #define N 65536
    int memory[N];
    ull code[N] = {
    
    };
    /*
    0 Input
    1 Output
    2 Write
    3 Copy
    4 Calculate (& | ~ ^ << >>)
    5 Calculate (+ - * / %)
    6 Goto
    7 If-goto
    8 x++
    9 x--
    f Exit
    */
    signed main()
    {
    	for(int i=0;;i=(i+1)%N)
    	{
    		int op=code[i]>>60;
    		if(op==0)		//Input
    		{
    			int p=code[i]&65535;
    			cin >> memory[ (code[i]>>56)&1 ? memory[p] : p ];
    		}
    		else if(op==1)	//Output
    		{
    			int p=code[i]&65535, val = memory[ (code[i]>>56)&1 ? memory[p] : p ];
    			if((code[i]>>57)&1)
    			{
    				cout<<char(val&127);
    			}
    			else
    			{
    				cout<<val;
    			}
    		}
    		else if(op==2)	//Write
    		{
    			int p = (code[i]>>32)&65535, val = code[i]&((1ll<<32)-1);
    			memory[ (code[i]>>56)&1 ? memory[p] : p ] = val;
    		}
    		else if(op==3)	//Copy
    		{
    			int pf = (code[i]>>16)&65535, pt = code[i]&65535;
    			int val = memory[ (code[i]>>55)&1 ? memory[pf] : pf ];
    			memory[ (code[i]>>56)&1 ? memory[pt] : pt ] = val;
    		}
    		else if(op==4)	//Calculate (& | ~ ^ << >>)
    		{
    			int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535;
    			int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ],
    			val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ], val3;
    			int op2 = (code[i]>>52)&15;
    			if(op2==0)
    			{
    				val3=val1&val2;
    			}
    			else if(op2==1)
    			{
    				val3=val1|val2;
    			}
    			else if(op2==2)
    			{
    				val3=~val2;
    			}
    			else if(op2==3)
    			{
    				val3=val1^val2;
    			}
    			else if(op2==4)
    			{
    				val3=((val2>>6)?0:val1<<val2);
    			}
    			else
    			{
    				val3=((val2>>6)?0:val1>>val2);
    			}
    			memory[ (code[i]>>56)&1 ? memory[p3] : p3 ] = val3;
    		}
    		else if(op==5)	//Calculate (+ - * / %)
    		{
    			//想要乘方的建议自己写一个快速幂, 应该是能写的 
    			int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535;
    			int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ],
    			val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ], val3;
    			int op2 = (code[i]>>52)&15;
    			if(op2==0)
    			{
    				val3=val1+val2;
    			}
    			else if(op2==1)
    			{
    				val3=val1-val2;
    			}
    			else if(op2==2)
    			{
    				val3=val1*val2;
    			}
    			else if(op2==3)
    			{
    				val3=(val2?val1/val2:0);
    			}
    			else
    			{
    				val3=(val2?val1%val2:0);
    			}
    			memory[ (code[i]>>56)&1 ? memory[p3] : p3 ] = val3;
    		}
    		else if(op==6)	//Goto
    		{
    			int p=code[i]&65535;
    			i = (code[i]>>56)&1 ? memory[p] : p;
    			i = (i+N-1)%N;
    		}
    		else if(op==7)	//If-goto (> < == >= <= !=)
    		{
    			int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535;
    			int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ],
    			val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ];
    			int op2 = (code[i]>>52)&15;
    			bool flag;
    			if(op2==0)
    			{
    				flag=(val1>val2);
    			}
    			else if(op2==1)
    			{
    				flag=(val1<val2);
    			}
    			else if(op2==2)
    			{
    				flag=(val1==val2);
    			}
    			else if(op2==3)
    			{
    				flag=(val1>=val2);
    			}
    			else if(op2==4)
    			{
    				flag=(val1<=val2);
    			}
    			else
    			{
    				flag=(val1!=val2);
    			}
    			if(flag)
    			{
    				i = (code[i]>>56)&1 ? memory[p3] : p3;
    				i = (i+N-1)%N;
    			}
    		}
    		else if(op==8)	//x++
    		{
    			int p=code[i]&65535;
    			memory[ (code[i]>>56)&1 ? memory[p] : p ]++;
    		}
    		else if(op==9)	//x--
    		{
    			int p=code[i]&65535;
    			memory[ (code[i]>>56)&1 ? memory[p] : p ]--;
    		}
    		else if(op==15)	//Exit
    		{
    			break;
    		}
    		else
    		{
    			cout<<"\n\nError: Invalid code\n\n";
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    12
    已通过
    6
    上传者