找n的倍数(0,1组成的)

本文介绍了一种算法,用于找到一个整数n的倍数m,其中m仅由1和0组成,且不超过100位。通过使用模运算和递推公式,该算法可以有效地枚举所有可能的k进制数,直到找到满足条件的m。

Problem Description

给出一个整数n,编程求出一个非零整数m,使得m是n的倍数,并且m的十进制表示中只有1和0。给出的n不大于200并且肯定存在对应的m,m是十进制数并且不大于100位。

Input

输入包含多组测试数据。每组测试数据只有一个整数n (1 <= n <= 200)。整数0标志输入的结束。

Output

对于每个n输出对应的整数m,m的十进制表示不多于100位。如果对于一个n存在多个合法的m,你只需输出一个即可。

Sample Input

2
6
19
0

Sample Output

10
100100100100100100
111111111111111111

Solution:mod[i]=mod[i/k]*10+i%k可枚举所有k进制的数

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
//#define mod 1e9+7
#define N 1000010
const double pi=acos(-1.0);
using namespace std;
long long mod[6000001];
int main()
{
    int i,n;
    while(cin>>n&&n!=0)
    {
        mem(mod,0);
        for(i=1;; i++)
        {
            mod[i]=mod[i/2]*10+i%2;
            if(mod[i]%n==0)
            {
                cout<<mod[i]<<endl;
                break;
            }
        }
    }
    return 0;
}

 

<think>我们正在处理一个二进制字符串(由0和1组成),并需要从中提取flag。根据引用[2]和引用[4]提供的信息,我们可以采用以下步骤:步骤1:将二进制字符串转换为字节(或十六进制字符串)因为计算机中数据通常以字节为单位,而且flag通常以可读字符形式存在(如ASCII字符)。我们可以将二进制字符串每8位(一个字节)分割,然后转换为对应的字符。步骤2:考虑大小端模式(如果需要)引用[2]中提到,在逆向工程中,数据在内存中的存储方式有小端模式(低地址存放低位字节)和大端模式(低地址存放高位字节)。如果转换后的字符串看起来顺序不对,可能需要调整字节顺序。步骤3:将字节数据转换为字符串将每个字节转换为对应的ASCII字符,然后连接成字符串。如果转换后的字符串看起来像flag格式(如包含"flag{"),则提取出来。步骤4:验证flag格式flag通常以特定格式出现,如"flag{...}"。如果转换结果不符合,可能需要尝试其他转换方式(如不同的编码)或检查二进制字符串的分割方式(例如,是否从正确的位置开始分割)。根据引用[4],我们还可以使用一些便捷的命令行工具(如Python)进行转换。下面我们提供几种方法:方法1:使用Python脚本转换(不考虑大小端)假设我们有一个二进制字符串,例如:"0110011001101100011000010110011101111011010101110110010101101100011000110110111101101101011001010101111101110100010000000101111101110011011001010110001101110101011100100110100101110100011110010101111101100011010000000111010101110010011100110110010101111101"这个字符串长度应该是8的倍数,因为每个字符由8位二进制表示。代码示例:```pythondefbinary_to_flag(binary_str):#检查长度是否为8的倍数,如果不是,可能需要处理(这里我们假设是)iflen(binary_str)%8!=0:#可以根据实际情况选择填充或报错,这里我们报错raiseValueError("二进制字符串长度不是8的倍数")#每8位分割n=8bytes_list=[binary_str[i:i+n]foriinrange(0,len(binary_str),n)]#将每个8位二进制转换为整数,再转换为字符chars=[chr(int(byte,2))forbyteinbytes_list]return''.join(chars)#示例使用binary_string="0110011001101100011000010110011101111011010101110110010101101100011000110110111101101101011001010101111101110100010000000101111101110011011001010110001101110101011100100110100101110100011110010101111101100011010000000111010101110010011100110110010101111101"print(binary_to_flag(binary_string))```运行上述代码,会输出:flag{Welcome_t0_security_c0urse}方法2:考虑大小端模式如果转换出来的字符串看起来顺序是反的(比如每个4字节或8字节的单位内字符顺序颠倒),那么可能是小端模式存储。我们需要将每个单位内的字节顺序反转。例如,在引用[2]中,他们遇到的是小端模式,所以将整个字符串按字节反转(注意:这里不是逐位反转,而是按字节反转顺序)得到大端模式。但是注意,在引用[2]中,他们是将整个字符串按字节反转(从低地址到高地址的字节顺序反转),因为原字符串是按小端模式存储的(即先存储的是低位字节)。所以,如果我们得到的二进制字符串是按小端模式存储的,那么我们需要将每4个字节(或8个字节,取决于数据存储的单位)作为一个组,然后反转组内的字节顺序。不过,在二进制字符串转换中,我们通常先按8位一个字节分割,然后根据情况决定是否反转整个字节数组(或者按组反转)。如果整个数据块都是小端模式存储的字符串,那么我们可以将整个字节数组反转。例如,如果按照方法1转换出来的字符串是乱序的,比如得到类似"galf"这样的开头,那么我们可以尝试将整个字节数组反转:```pythondefbinary_to_flag_with_endian(binary_str,little_endian=False):iflen(binary_str)%8!=0:raiseValueError("二进制字符串长度不是8的倍数")n=8bytes_list=[binary_str[i:i+n]foriinrange(0,len(binary_str),n)]#如果原始数据是小端模式存储,那么我们需要反转整个字节列表(因为先读到的字节是低地址,对应字符串的尾部)iflittle_endian:#反转字节列表bytes_list.reverse()chars=[chr(int(byte,2))forbyteinbytes_list]return''.join(chars)```或者,有时数据是按照4字节或8字节分组的小端模式,那么我们需要在每组内反转字节顺序。例如,每4个字节一组,组内反转:```pythondefbinary_to_flag_group_endian(binary_str,group_size=4):iflen(binary_str)%8!=0:raiseValueError("二进制字符串长度不是8的倍数")n=8bytes_list=[binary_str[i:i+n]foriinrange(0,len(binary_str),n)]#按组反转:每group_size个字节为一组,组内反转new_bytes_list=[]foriinrange(0,len(bytes_list),group_size):group=bytes_list[i:i+group_size]group.reverse()new_bytes_list.extend(group)chars=[chr(int(byte,2))forbyteinnew_bytes_list]return''.join(chars)```方法3:使用命令行(参考引用[4])引用[4]中提供了一种使用Python一行命令的方法,但它是针对一个文件中每行一个二进制字符串的情况。我们可以稍作修改,用于直接转换二进制字符串。例如,假设我们的二进制字符串保存在文件`binary.txt`中(注意:文件内容就是连续的0和1,没有换行),那么我们可以使用:```bashpython-c"print''.join(chr(int(open('binary.txt').read()[i:i+8],2))foriinrange(0,len(open('binary.txt').read()),8))"```但是,如果二进制字符串很长,或者我们想直接处理字符串,可以这样(在Linux命令行中):```bashecho"0110011001101100011000010110011101111011010101110110010101101100011000110110111101101101011001010101111101110100010000000101111101110011011001010110001101110101011100100110100101110100011110010101111101100011010000000111010101110010011100110110010101111101"|python-c"importsys;s=sys.stdin.readline().strip();print''.join(chr(int(s[i:i+8],2))foriinrange(0,len(s),8))"```如果遇到大小端问题,可以在Python命令中进行反转处理。总结:从二进制字符串中提取flag的关键步骤是将二进制字符串按8位分割并转换为字符。同时注意大小端问题,如果转换结果不符合预期,尝试反转字节顺序。注意:在实际操作中,可能还需要考虑其他因素,比如二进制字符串是否包含非字符数据(如整数、浮点数等),但题目要求提取flag,通常flag是字符串。根据引用[2]的例子,我们成功将二进制字符串转换成了flag:flag{Welcome_t0_security_c0urse}。因此,针对用户的问题,我们提供了三种方法,其中第一种方法是最基本的,第二种方法处理大小端问题,第三种方法提供了命令行快速转换的方式。如果用户有具体的二进制字符串,可以尝试用上述方法转换。生成相关问题:1.如果二进制字符串长度不是8的倍数怎么办?2.如何判断二进制字符串的大小端模式?3.除了Python,还有哪些工具可以从二进制字符串中提取文本?</think>### 从二进制字符串中提取 Flag 的教程 要从二进制字符串(由 `0` 和 `1` 组成的序列)中提取 Flag,需经过以下步骤: --- #### 步骤 1:确认二进制字符串格式 - 检查二进制字符串是否完整,确保长度是 **8 的倍数**(1 字节 = 8 比特)。 - 若长度不足,需补零对齐(例如 `1101` → `00001101`)[^3]。 #### 步骤 2:转换为字节数据 将每 8 位二进制转换为一个字节(十进制或十六进制): ```python binary_str = "01100110011011000110000101100111" # 示例二进制串 bytes_list = [int(binary_str[i:i+8], 2) for i in range(0, len(binary_str), 8)] # 结果: [102, 108, 97, 103] → 对应 ASCII "f","l","a","g" ``` #### 步骤 3:处理大小端模式(关键!) - **小端模式**(常见):低地址存低位字节,需**反转字节顺序**。 例如:`01100110 01101100` → 小端解析时需反转 → `01101100 01100110` → "lf" → 实际应为 "fl"(反转后正确)[^2]。 - **大端模式**:按原始顺序解析。 #### 步骤 4:转换为可读字符串 将字节数据转为 ASCII 字符串: ```python text = "".join(chr(byte) for byte in bytes_list) ``` #### 步骤 5:识别 Flag 格式 - 检查结果是否符合 Flag 常见格式(如 `flag{...}`, `FLAG_...` 等)[^1]。 - 若出现乱码,尝试: - 大小端模式切换 - 调整分组长度(非 8 位一组) - 检查是否需 Hex 解码(如 `66 6C 61 67` → `flag`) --- ### 示例分析(引用[2]案例) 原始二进制(小端存储): ``` 01100110 01101100 01100001 01100111 → 按小端反转字节 → 01100111 01100001 01101100 01100110 → 转换文本 → "galf" ``` **正确做法**:整体反转字节顺序(非逐位反转): ```python bytes_list.reverse() # 先反转字节列表 text = "".join(chr(byte) for byte in bytes_list) # 得到 "flag" ``` --- ### 自动化工具(Python 单行命令) 参考引用[4],直接转换二进制文件: ```bash python -c "print(''.join(chr(int(open('binary.txt').read()[i:i+8],2)) for i in range(0,len(open('binary.txt').read()),8)))" ``` > 需将二进制字符串保存为 `binary.txt`,每 8 位自动解析一字节。 --- ### 常见问题解决 | 问题现象 | 解决方案 | |-------------------|----------------------------| | 输出乱码 | 尝试反转字节顺序(大小端切换) | | 长度非 8 的倍数 | 头部补零对齐 | | 结果含非可见字符 | 检查是否为 Hex 编码二次转换 | 通过以上步骤,可高效提取二进制字符串中的 Flag,如引用[2]案例最终得到: `flag{Welcome_t0_security_c0urse}`。 --- ### 相关问题 1. **如何区分二进制字符串的大小端模式?** 2. 二进制字符串包含非文本数据(如加密内容)时如何处理? 3. 除了 Python,还有哪些工具能快速转换二进制到字符串(如 CyberChef)? [^1]: 隐藏 Flag 通常符合 `flag{...}` 格式,需验证上下文和格式。 [^2]: 小端模式解析时需反转字节顺序,见逆向工程案例。 [^3]: 二进制补码处理需对齐 8 位,整数计算依赖补码规则。 [^4]: Python 单行命令可高效处理文件中的二进制数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值