8.19华为OD机试真题 新系统 - 大整数位序反转 (Java/Py/C/C++/Js/Go)

📅 2026/8/21 6:46:36
8.19华为OD机试真题 新系统 - 大整数位序反转 (Java/Py/C/C++/Js/Go)
大整数位序反转2026 华为OD机试真题 8月19日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述小华是一名嵌入式开发工程师在处理芯片寄存器数据时经常需要对超多位数据进行位翻转操作。寄存器中的数据可能是几百位甚至更长。给定一个十进制大整数最多 100 位请将其二进制表示中的所有位顺序全部翻转最低位变成最高位次低位变成次高位以此类推然后输出翻转后的十进制表示。输入描述一个十进制大整数字符串形式范围0 ~ 10^100 - 1输入不带前导零除非为0。输出描述翻转后的十进制整数字符串形式不能有前导零除非输出为0。示例1输入1输出1说明1 的二进制为1翻转后仍为1对应十进制 1。示例2输入2输出1说明2 的二进制为10翻转为01即1对应十进制 1。示例3输入4输出1说明4 的二进制为100翻转为001即1对应十进制 1。解题思路核心思想将输入的十进制大整数转成二进制字符串反转这个二进制字符串再把反转后的二进制字符串转回十进制字符串。需要注意0的二进制反转后仍然是0。算法步骤读取一行十进制大整数字符串。如果输入为0直接输出0。将十进制大整数转成二进制表示。反转二进制字符串。将反转后的二进制字符串转回十进制并输出。复杂度分析设输入十进制位数为d二进制位数为b。时间复杂度使用内置大整数时为O(b)级别C 语言字符串模拟约为O(d*b)空间复杂度O(b)Javaimportjava.math.BigInteger;importjava.util.*;publicclassMain{publicstaticStringsolve(Stringn){BigIntegernumnewBigInteger(n);if(num.equals(BigInteger.ZERO)){// 0 的二进制反转后仍然是 0return0;}// 转为二进制字符串后反转位序Stringbinarynum.toString(2);StringreversednewStringBuilder(binary).reverse().toString();// 反转后的二进制再转回十进制字符串returnnewBigInteger(reversed,2).toString();}publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);Stringnscanner.nextLine().trim();System.out.println(solve(n));}}Pythondefsolve(n):numint(n)ifnum0:# 0 的二进制位序反转后仍然是 0return0# 去掉 0b 前缀后反转二进制位binarybin(num)[2:]reversed_binarybinary[::-1]# 将反转后的二进制转回十进制字符串returnstr(int(reversed_binary,2))ninput().strip()print(solve(n))JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});rl.on(line,line{console.log(solve(line.trim()));rl.close();});functionsolve(n){constnumBigInt(n);if(num0n){// 特殊处理 0避免空二进制串return0;}// BigInt 可直接转为二进制字符串constbinarynum.toString(2);constreversedbinary.split().reverse().join();// 按二进制逐位还原为十进制大整数letans0n;for(constchofreversed){ansans*2nBigInt(ch);}returnans.toString();}C#includebits/stdc.h#includeboost/multiprecision/cpp_int.hppusingnamespacestd;usingboost::multiprecision::cpp_int;stringsolve(conststringn){cpp_int num0;for(charch:n){numnum*10(ch-0);}if(num0){// 0 的二进制反转后仍为 0return0;}// 不断取最低位得到的顺序正好是反转后的二进制string reversedBinary;while(num0){reversedBinary.push_back((num1)?1:0);num1;}// 将反转后的二进制重新转成十进制大整数cpp_int ans0;for(charch:reversedBinary){ansans*2(ch-0);}returnans.convert_tostring();}intmain(){string n;cinn;coutsolve(n)endl;return0;}Gopackagemainimport(bufiofmtmath/bigosstrings)funcsolve(nstring)string{num:new(big.Int)num.SetString(n,10)ifnum.Sign()0{// 0 的位序反转结果仍然为 0return0}// 取二进制字符串并反转binary:num.Text(2)bytes:[]byte(binary)fori,j:0,len(bytes)-1;ij;i,ji1,j-1{bytes[i],bytes[j]bytes[j],bytes[i]}// 反转后的二进制转回十进制ans:new(big.Int)ans.SetString(string(bytes),2)returnans.String()}funcmain(){reader:bufio.NewReader(os.Stdin)line,_:reader.ReadString(\n)fmt.Println(solve(strings.TrimSpace(line)))}C语言#includestdio.h#includestring.h#includectype.hintisZero(constchar*s){returnstrcmp(s,0)0;}intdivideByTwo(char*s){intcarry0;intlenstrlen(s);intwrite0;intstarted0;for(inti0;ilen;i){intvaluecarry*10(s[i]-0);intdigitvalue/2;carryvalue%2;if(digit!0||started){s[write](char)(0digit);started1;}}if(write0){s[write]0;}s[write]\0;returncarry;}voidmultiplyByTwoAndAdd(char*s,intbit){intlenstrlen(s);intcarrybit;for(intilen-1;i0;i--){intvalue(s[i]-0)*2carry;s[i](char)(0value%10);carryvalue/10;}if(carry0){memmove(s1,s,len1);s[0](char)(0carry);}}voidsolve(char*n,char*result){if(isZero(n)){// 0 的二进制位序反转后仍然是 0strcpy(result,0);return;}// 连续除以 2 得到的余数顺序就是反转后的二进制位序chartemp[128];charreversedBinary[512];intbitCount0;strcpy(temp,n);while(!isZero(temp)){intbitdivideByTwo(temp);reversedBinary[bitCount](char)(0bit);}reversedBinary[bitCount]\0;// 将反转后的二进制位从左到右还原成十进制字符串strcpy(result,0);for(inti0;ibitCount;i){multiplyByTwoAndAdd(result,reversedBinary[i]-0);}}intmain(){charn[128];charresult[256];scanf(%127s,n);solve(n,result);printf(%s\n,result);return0;}完整用例用例11用例22用例34用例40用例53用例610用例715用例81024用例9123456789用例1099999999999999999999999999999999999999999999999999文章目录**大整数位序反转**题目描述输入描述输出描述示例1示例2示例3解题思路核心思想算法步骤复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10