精华内容
下载资源
问答
  • EOJ 3031 二进制倒置

    2018-03-21 10:55:00
    给定一个整数 n(0≤n≤10100)、将 n 的 334 位二进制表示形式(不包括开头可能的值为 0 的位,n=0 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。 例如:n=10,其二进制表示为 (330 个 0)1010,倒置后...

    题目描述

    给定一个整数 n(0≤n≤10100)、将 n 的 334 位二进制表示形式(不包括开头可能的值为 0 的位,n=0 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。

    例如:n=10,其二进制表示为 (330 个 0)1010,倒置后为 0101,对应输出就是 5。

    Input

    第 1 行:一个整数 T (1T10) 为问题数。

    接下来共 T 行整数,对应每个问题有 1 行,表示 n。

    Output

    对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

    然后对应每个问题在一行中输出结果。

     


     

     

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define END 10
     4 void init(int *n)
     5 {
     6     char c;int i=0;
     7     while((c=getchar())!='\n')
     8     {
     9         n[i]=c-'0';
    10         i++;
    11     }
    12     n[i]=END;
    13 }//用getchar()将大整数逐位读入数组,以换行符为结束标志
    14 void multiout(int* out)//将数组表示的整数*2
    15 {
    16     int *p=out,carry,plus=0;
    17     while(1)
    18     {
    19         if(*p==-1)//乘法结束
    20         {
    21             if(p-out==0)
    22             {
    23                 *p=0;
    24                 return;
    25             }
    26             else if(plus==1)
    27                     *p=plus;
    28             return;
    29         }
    30         carry=*p*2+plus;  原位置*2+进位
    31         *p=carry%10;    
    32         plus=carry/10;
    33         p++;
    34     }
    35 
    36 }
    37 int addout(int* out,int get)
    38 {
    39     int* p=out;
    40     if(get==0) return;
    41 
    42     else
    43     {
    44 
    45         *p=*p+1;
    46         while(*p==10)
    47         {
    48             *p=0;
    49             (*(++p))++;
    50         }
    51     }//46-51行其实不需要,任何数×2之后,各位必定是偶数,加1不会引起进位
    52 
    53 }
    54 
    55 int main()
    56 {
    57     int cas;scanf("%d\n",&cas);
    58     for(int m=0;m<cas;m++)
    59     {
    60         int BIGINT[101],bin[335],pos=0,binpos;
    61         init(BIGINT);//读入整数
    62      //以下开始求整数的二进制形式,并存放在二进制数组中,显然,存放的时候已经是倒序了。
           //pos是整数数组的最高位,binpos记录二进制数组何时结束
           //以整数5432为例 63 for(binpos=0;BIGINT[pos]!=END;binpos++) //一直计算到整数为0(pos达到END处)64 { 65 int rmd=0,divd;             // 66 for(int i=pos;BIGINT[i]!=END;i++)  // i=0         i=1        i=2     i=3 67 {                     // 68 divd=rmd*10+BIGINT[i];      // divd=5        divd=14     divd=3   divd=12 69 rmd=divd%2;             // rmd=5除以2余1    rmd=0      rmd=1    rmd=0 70 BIGINT[i]=divd/2;         // 原5的位置除2后为2  原4位置为7    原3位置为1  原2位置为6 71 }                     //可以看到,一次运算,5432除2得2716,余0,将0存入二进制数组,并更新binpos位置 72 bin[binpos]=rmd;            // 73 if(BIGINT[pos]==0) pos++;     //2716/2=1358,1358/2=678; 此时BIGINT[pos]=0,pos更新,下次计算时,便从6开始了。 74 }                        // 75 bin[binpos]=END;              //标记二进制数组结束位置 76 int out[110],ppos=0;out[0]=bin[0]; 77 for(int i=1;i<110;i++) out[i]=-1; 78 for(int i=1;bin[i]!=END;i++)      //二进制转十进制,从最高位开始*2+后一位,注意这个数组是倒序了的 79 { 80 multiout(out); 81 addout(out,bin[i]); 82 } 83 for(;out[ppos+1]!=-1;ppos++); 84 85 printf("case #%d:\n",m); 86 for(ppos;ppos>=0;ppos--) 87 printf("%d",out[ppos]); 88 printf("\n"); 89 90 } 91 return 0;92 }

     

    具体分析看注释。

    这题应该算是一个大数的题吧,long long类型最大值在1018,因此用数组保存数据。

     

    转载于:https://www.cnblogs.com/Jiiiin/p/8615705.html

    展开全文
  • 38. 二进制倒置

    2020-04-25 15:20:17
    给定一个整数 n,将 n 的二进制表示(不包括开头可能的值为 0 的位,n=0 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。 输入格式 输入一个数,表示 n。 对于 30% 的数据,n≤1018。 对于 90% 的数据,...

    单点时限: 1.0 sec

    内存限制: 256 MB

    给定一个整数 n,将 n 的二进制表示(不包括开头可能的值为 0 的位,n=0 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。

    输入格式
    输入一个数,表示 n。

    对于 30% 的数据,n≤1018。

    对于 90% 的数据,n≤10100。

    对于 100% 的数据,0≤n≤101000。

    输出格式
    输出结果。

    样例
    input
    10
    output
    5
    input
    0
    output
    0
    input
    10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    output
    7715442851596369463000695959966459436485038766875199595258933941809737
    提示
    10:其二进制表示为 1010,倒置后为 0101,对应输出就是 5。
    10000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000
    0000000000000
    的二进制表示为:

    10010010010011010110100100101100101001100001
    10111110011101011000010110010011110000100110
    00100110011100000101111110011100010101100111
    00100000010001110001000010001101001111100101
    01010101100100100001100001000101010000010111
    01000111100010000000000000000000000000000000
    00000000000000000000000000000000000000000000
    0000000000000000000000000
    倒置后为:

    00000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000
    00000000000010001111000101110100000101010001
    00001100001001001101010101010011111001011000
    10000100011100010000001001110011010100011100
    11111101000001110011001000110010000111100100
    11010000110101110011111011000011001010011010
    0100101101011001001001001
    对应十进制值为:

    7715442851596369463000695959966459436485038766875199595258933941809737

    int(字符串,进制)转化为特定进制下的十进制数

    n=int(input())
    s=str(bin(n))[2:]
    sum=0
    for i in range(len(s)):
        if s[i]=='1':
            sum+=2**i
    print(sum)
    
    print(int(('{0:b}'.format((int)(input())))[::-1],2))
    
    展开全文
  • 给定一个整数 、将 的 334 位二进制表示形式(不包括开头可能的值为 0 的位, 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。 例如: ,其二进制表示为(330 个 0)1010 ,倒置后为 0101 ,对应输出...

    题目描述

    给定一个整数 n(0 \le n \le 10^{100}) 、将 n 的 334 位二进制表示形式(不包括开头可能的值为 0 的位,n=0 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。

    例如: n=10 ,其二进制表示为(330 个 0)1010 ,倒置后为 0101 ,对应输出就是 5 。

    题目链接
    acm.ecnu.edu.cn/problem

    题解

    这题考查的主要是大数的进制转换,其他没有什么算法技巧,但是对代码实现要求还是挺高的,适合用来锻炼你的耐心代码风格

    整体思路非常简单,不就是先把输入的 10 进制数 x 转化成 2 进制数 b ,再把 b 所有位颠倒过来,最后再把 b 转化成 10 进制输出就行了。

    所以整体代码拆分成了三步,先从 10 进制转 2 进制,再颠倒 2 进制,最后从 2 进制转 10 进制。

    为了代码的普适性,我这里直接实现了从任意 a 进制 转化为任意 b 进制的算法,这样更加方便调用。

    这就涉及到了大数的任意进制转换问题,假设 xa 进制数,我们要把它转化为 b 进制的 y (初始时为空)。那么转化步骤如下:

    • x \% b ,并把余数接在 y 的最高位。
    • x = \left\lfloor x / b \right\rfloor
    • 重复步骤 1 ,直到 x = 0

    部分代码如下:

            while (n > 0) {
        y.push_back(mod(x, a, b));
        div(x, a, b);
        n = x.size();
        if (n == 1 && !x[0]) break;
    }
    
          

    看起来非常简单,但是步骤 1 和 2 都涉及到了大数的求余大数的除法算法,所以我们还得实现这两个算法。

    大数求余只要从 x 最高位开始计算 x 的大小,并同时对 b 求余,然后由于求余的加法和乘法定理,我们可以始终保持 x < b ,这样就能用一个 int 类型保存余数了。

    部分代码如下:

            int mod(vector<int>& x, int a, int b) {
        int n = x.size(), q = 0;
        for (int i = n-1; i >= 0; --i) {
            q = (q * a + x[i]) % b;
        }
        return q;
    }
    
          

    大数除法类似,从 x 最高位开始除 b ,并注意要把余数带到下一位,最后还得去掉前导 0 。

    部分代码如下:

            void div(vector<int>& x, int a, int b) {
        int n = x.size(), q = 0;
        for (int i = n-1; i >= 0; --i) {
            x[i] += q * a;
            q = x[i] % b;
            x[i] /= b;
        }
        for (int i = n-1; i > 0; --i) {
            if (x[i]) break;
            x.pop_back();
        }
    }
    
          

    代码

    c++

            #include <bits/stdc++.h>
    using namespace std;
    
    // string转化为vector<int>,倒序存储
    vector<int> s2i(string& s) {
        vector<int> x;
        int idx = 0, n = s.size();
        for (; idx < n; ++idx) {
            if (s[idx] != '0') break;
        }
        if (idx == n) idx = n - 1;
        for (int i = n-1; i >= idx; --i) {
            x.push_back(s[i]-'0');
        }
        return x;
    }
    
    // a进制下x%b,x倒序存储
    int mod(vector<int>& x, int a, int b) {
        int n = x.size(), q = 0;
        for (int i = n-1; i >= 0; --i) {
            q = (q * a + x[i]) % b;
        }
        return q;
    }
    
    // a进制下x/b,x倒序存储
    void div(vector<int>& x, int a, int b) {
        int n = x.size(), q = 0;
        for (int i = n-1; i >= 0; --i) {
            x[i] += q * a;
            q = x[i] % b;
            x[i] /= b;
        }
        for (int i = n-1; i > 0; --i) {
            if (x[i]) break;
            x.pop_back();
        }
    }
    
    // a进制下s转化为b进制string
    string convert(string s, int a, int b) {
        vector<int> x = s2i(s);
        int n = x.size();
        vector<int> y;
        while (n > 0) {
            y.push_back(mod(x, a, b));
            div(x, a, b);
            n = x.size();
            if (n == 1 && !x[0]) break;
        }
        int m = y.size();
        string res = "";
        for (int i = m-1; i >= 0; --i) {
            res += '0' + y[i];
        }
        return res; 
    }
    
    int main() {
        int T;
        cin >> T;
        string x;
        for (int t = 0; t < T; ++t) {
            cin >> x;
            string x2 = convert(x, 10, 2);
            reverse(x2.begin(), x2.end());
            string res = convert(x2, 2, 10);
            cout << "case #" << t << ":" << endl;
            cout << res << endl;
        }
        return 0;
    }
    
          

    python

            x = int(input())
    for i in range(x):
        print("case #%d:" %i)
        print(int(str(bin(int(input())))[2::][::-1], 2))
          

    展开全文
  • Leetcode-190 Reverse Bits 数字二进制倒置

    千次阅读 2015-03-11 14:23:09
    问题描述: Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as ...

    问题描述:

    Reverse bits of a given 32 bits unsigned integer.

    For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as00111001011110000010100101000000).

    Follow up:
    If this function is called many times, how would you optimize it?

    Related problem: Reverse Integer

    C++代码实现:

    class Solution {
    public:
        uint32_t reverseBits(uint32_t n) {
            
            uint32_t result = 0;// 表示计算结果
    		int temp = 0;       //计数判断是否移动了32次,因为n左侧大多数数字为0,故不一定要循环移动24 位
    
    		while (n != 0) {
    			result = (result << 1) | (n & 1);//每一次上一循环计算的result左移一位,并加上从n取出的该位数字(n & 1)
    			n >>= 1;    
    			++ temp;
    		}
    		
    		if(temp < 32)
    		{
    			result <<= (32 - temp);
    		}
    		return result;
            
        }
    };


    Java实现:在系统上无法运行通过,不知该如何处理无符号int的问题

    public class Reverse_Bits {
    
    	// you need treat n as an unsigned value
    	public long reverseBits(long n) {
    		long result = 0;// 表示计算结果
    		int temp = 0;//
    		int INT_SIZE = Integer.SIZE;//int类型的size大小
    		
    		while ((n != 0)&&(temp<=INT_SIZE)) {
    			result = (result << 1) | (n & 1);
    			n >>= 1;
    			++temp;
    		}
    
    		if (temp < INT_SIZE) {
    			result <<= (INT_SIZE - temp);
    		}
    		return result;
    
    	}
    
    
    	public static void main(String[] args) {
    
    		Reverse_Bits reverse_Bits = new Reverse_Bits();
    
    		System.out.println(reverse_Bits.reverseBits(2147483648L));
    	}
    
    }
    

    修改后实现,使用>>>,其余与C代码相同

    public class Solution {
        // you need treat n as an unsigned value
        public int reverseBits(int n) {
    	    int result = 0;// 表示计算结果  
    	    int temp = 0;       //计数判断是否移动了32次,因为n左侧大多数数字为0,故不一定要循环移动24 位  
    
    	    while (n != 0) {  
                result = (result << 1) | (n & 1);//每一次上一循环计算的result左移一位,并加上从n取出的该位数字(n & 1)  
                n >>>= 1;      
                ++ temp; 
            }  
              
            if(temp < 32)  
            {  
                result <<= (32 - temp);  
            }  
           return result;
    
    	}
    }


    在Java代码中直接书写的数字是int类型的,就是说数字的范围在 -2^31 到 2^31 - 1 这个范围之中,无论将这个数字赋值给什么类型。

    直接赋值实参为2147483648时,会出现The literal... of type int is out of range的错误,在数组后加上L,或使用Long.phraseLong()解决问题



    
    展开全文
  • 题目 数据 3 10 0 ...思路:十进制转二进制 分三步 ①十进制转化二进制 由于输入的字符过多,只能用字符串接受...奇数就是1,然后往二进制字符串的首位插入(你放末尾也可以,记得最后反转一下就好) 然后十进制的数字要
  • 如何将一个数的二进制倒置

    千次阅读 2008-10-26 21:31:00
    问题重述:将一个数字的二进制表示前后倒置,例如1001 1100被倒置为0011 1001。典型应用:FFT变换。 算法:采用分治的方法,将前后一半互换,那么问题就变成为如何分别对前后两部分倒置的问题。当问题缩小到只有两...
  • 一、思路: 1.读入:字符数组s读入->整型数组a存储十进制->整型数组b存储二进制 2.高精度÷单精度:模拟除法+去除前导零(On) ...int b[ ]: 按位存储倒置二进制 int len: a[ ]的位数 in...
  • 颠倒二进制(java)

    2021-02-13 17:53:48
    颠倒二进制(java) 颠倒给定的 32 位无符号整数的二进制位。 1、使用位运算 int result = 0; for(int i = 0;i<32;i++){ int bit = n % 2; n = n >> 1; result = (result << 1) ^ bit; } return ...
  • 快速傅里叶变换经过了使用雷德算法进行迭代优化,在效率上已经有了很大的进步。 但是,如果一位一位翻转,尽管... void get_rev(int bit)//bit表示二进制的位数 { for(int i=0;i<(1<<bit);i++)对1~2^b...
  • #includeusing namespace std;//读取该字符的8位二进制void fun(unsigned char x){ for(int i=0;i;i++) { cout;x/=2; } cout;}int main(){ unsigned char ch=a; c
  • C练习: 十进制转二进制倒置后输出十进制数 /* ============================================================================ Name : Test1.c Author : lixiaolong Version : v1.0 Copyright : ...
  • C语言反转二进制数据位

    千次阅读 2014-09-14 19:13:18
    用异或的方式实现对一个数据某一位反转,某一位与1异或的时候刚好发生反转,与0异或的时候不变。 将某一数据的第n位反转方法:val = val ^ ( 1
  • 颠倒给定的32位无符号整数的二进制位。 示例1 输入: 43261596 输出: 964176192 解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 ...
  • 十进制转二进制的两种方法

    千次阅读 2021-07-17 11:17:59
    、使用步骤1.引入库2.读入数据总结前言一、pandas是什么?、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,...
  • 十进制转化二进制

    2019-11-24 21:39:15
    我的思路是先将十进制的数字转化为二进制,然后存进字符串中,在这里我用StringBuffer类,因为如果要逐个修改字符串中的字符的话String类是做不到的.然后用到String Buffer中的append方法将每一个二进制位添加到字符串...
  • 将8位二进制倒序

    2019-07-11 15:23:15
    将8位二进制倒序(c语言实现) unsigned char Reverse(unsigned char data) { unsigned char tmp = 0, i = 0, rtn_data = 0, a[i] = {0}; tmp = data & 0xff; for(i = 0; i < 8; i++) { a[i] = tmp % 2; tmp ...
  • 1.一个整数的二进制序列倒置后再转换为十进制的整数#include #include #include (1),先将这个函数的二进制序列存入一个数组,再根据二进制与十进制之间的转换来求解新的整数unsigned int reverse_bit(unsigned ...
  • 理论基础: >> :右在这里插入代码片移 << :左移 & :只有都是1才是1 ==> 1与任何数 都是任何数 | :有1就是1 ==> 0或任何数 都是任何数 逻辑 先交换相邻的数 ... (a&
  • 二进制加法Java实现

    千次阅读 2019-04-27 09:35:54
    二进制整数的Java实现 任意两个二进制数(不论在什么位置)相加,只可能出现4种情况。它们是: 0+0=0 1+0=0+1=1 1+1=10=0+向高一位的进位1 1+1+1=11=1+向高一位的进位1 //整数二进制相加 public static String add...
  • //本程序用来将十进制整数化为二进制 #include<iostream> using namespace std; int main() { int integer; int a[200]={0}; //定义一个数组来存放十进制整数 cout <<"请输入一个整数我们将为你求其...
  • 、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础...
  • 二进制信号量和互斥量之间是否有任何区别,或者它们基本相同?
  • Python3 进制转换(二进制 十进制 十六进制 ASCII字符串转换) Python3 进制转换 编写Convertor类,用于进制与ASCII字符之间互相转换,便于使用 ASCII码及进制之间转换关系 ASCII码介绍: ASCII 全称为 ( American ...
  • 一个数的二进制是由位组成,我们需要对它的每一位进行操作。 第一位翻转:20 —&amp;amp;gt; 2(31-0) 第二位翻转:21 —&amp;amp;gt; 2(31-1) 第三位翻转:22 —&amp;amp;gt; 2(31-2) 第 i 位翻转:...
  • 二进制高低位颠倒,简单易懂,已调试过,可用。
  • 67. 二进制求和c++(四种方法)

    千次阅读 2019-12-26 10:50:04
    题目:给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b = “1011” 输出: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,094
精华内容 2,837
关键字:

二进制倒置