只有0和1的数
2015-09-17 23:12
337 查看
问题:输入一个数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。
… …
所有的以上可以用一个二叉树来表示:
![](https://img-blog.csdn.net/20150913234608278)
所以我们只需要层次遍历此二叉树(或者也叫广度优先遍历),找出合适的sum值即可。此题即转化为广度优先遍历问题。
代码:
思路:设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); }
相关文章推荐
- Opencv实现曼水填充算法-floodFill函数
- 漂亮简单的Android 自定义 Switch 控件!
- java 编程思想 阅读笔记(5)
- 封装malloc编写一个malloc16使得返回地址%16==0
- 读《设计心理学》一
- Kurento应用开发指南(以Kurento 6.0为模板) 之八: Kurento协议
- 将目标文件分为程序段与数据段两大类的原因
- jmeter中线程之间传递参数
- Linux bind-utils
- .net中动态对象的使用
- 对于开源菜谱的思考
- Mac中设置android adb环境变量
- hdu 1115 Lifting the Stone
- JSP的9大内置对象
- Mysql面试题
- [置顶] 马列主义告诉我们:物质基础决定上层建筑 - 移动互联网时代之后的时代演进推断
- Opencv形态学滤波-综合
- 欢迎使用CSDN-markdown编辑器
- jsdoc to markdown
- C语言 可变长度的数组 -2