只有0和1的数

本文介绍了一种算法,用于找到一个整数N(1≤N≤10^5)乘以某个数M后的结果仅由0和1组成的最小正整数M。通过广度优先搜索遍历所有可能的二进制数,直到找到符合条件的解。

问题:输入一个数N,这个数的范围为1<=N<=10^5,输出一个最小数M,使得N*M的结果用十进制表示只包含0和1.

思路:设sum=N*M,那么sum就只包含0和1,那么我们只需要找到这个sum,就可以求出M。
sum长度为1,sum=1。
sum长度为2,sum=10或者11。
sum长度为3,sum=100,101,110,111。
… …

所有的以上可以用一个二叉树来表示:

这里写图片描述

所以我们只需要层次遍历此二叉树(或者也叫广度优先遍历),找出合适的sum值即可。此题即转化为广度优先遍历问题。

代码:

#include<stdio.h>
#include<malloc.h>  
typedef struct node
{
    long long data;
    struct node* next;
}Node;



int main()
{
    int n = 0;  //n存储输入
    long long sum = 1;  //sum=n*m
    scanf_s("%d", &n); 
    if (n == 1)   //n==1
    {
        printf("%d\n", 1);
        return 0;
    }

    Node* Phead = (Node *)malloc(sizeof(Node));
    Phead->data = 1;
    Phead->next = NULL;
    Node* QueueHead = Phead;
    Node* QueueTail = Phead;

    while (QueueHead->data%n != 0)    //n!=1
    {
        Node* p1 = (Node *)malloc(sizeof(Node));
        p1->data = QueueHead->data * 10;
        p1->next = NULL;
        QueueTail->next = p1;
        QueueTail = QueueTail->next;

        Node* p2 = (Node *)malloc(sizeof(Node));
        p2->data = QueueHead->data * 10 + 1;
        p2->next = NULL;
        QueueTail->next = p2;
        QueueTail = QueueTail->next;

        QueueHead = QueueHead->next;
    }

    printf("%lld\n", QueueHead->data/n);

}
### 完全二叉树中度为1的节点特性及原因 完全二叉树中度为1的节点只能是01,这一特性是由完全二叉树的结构定义填充规则决定的。以下是详细的分析: #### 1. 完全二叉树的定义 完全二叉树是指除了最后一层外,其他每一层都是满的,并且最后一层的节点从左到右连续填充[^4]。这种定义决定了完全二叉树中某些节点的特殊性质。 #### 2. 度为1的节点特性 在完全二叉树中,度为1的节点只可能出现在倒第二层,并且最多只有一个这样的节点。这是因为: - 如果完全二叉树的总节点 \( n \) 是奇,则所有非叶子节点都有两个子节点,因此不存在度为1的节点。 - 如果 \( n \) 是偶,则最后一层的最后一个节点的父节点将只有一个子节点(即该父节点的右子节点为空),此时这个父节点的度为1[^2]。 #### 3. 学推导 根据完全二叉树的性质,可以得出以下结论: - 叶子节点 \( n_0 = \lceil n / 2 \rceil \)[^3]。 - 度为2的节点 \( n_2 = n_0 - 1 \)[^1]。 - 度为1的节点 \( n_1 \):当 \( n \) 为偶时,\( n_1 = 1 \);当 \( n \) 为奇时,\( n_1 = 0 \)[^2]。 #### 4. 递归方法验证 可以通过递归方法验证完全二叉树中度为1的节点量。具体逻辑如下: - 若某节点有左子树右子树,则以此节点为根的二叉树中度为1的节点个数等于左子树的度为1的节点个数加上右子树的度为1的节点个数。 - 若该节点只有一棵子树,则以此节点为根的二叉树中度为1的节点个数等于1加上其唯一子树中度为1的节点个数。 - 若该节点没有子树,则此节点为根的二叉树中度为1的节点个数0[^1]。 ```python # 示例代码:递归计算完全二叉树中度为1的节点 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def count_degree_one(node): if node is None: return 0 if node.left is None and node.right is None: return 0 if node.left is not None and node.right is None: return 1 + count_degree_one(node.left) if node.left is None and node.right is not None: return 1 + count_degree_one(node.right) return count_degree_one(node.left) + count_degree_one(node.right) # 测试用例 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) root.right.left = TreeNode(6) print("度为1的节点:", count_degree_one(root)) ``` #### 5. 总结 完全二叉树中度为1的节点特性是由其定义填充规则决定的。通过学推导递归方法可以验证,完全二叉树中度为1的节点最多只有一个,且仅当总节点为偶时存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值