变形金刚joy007 项目总结

一、问题描述

任意给定一个正整数N,求一个最小正整数M(M>1),使得N*M的十进制形式只含1和0。

比如 N=99,M=1 122 334 455 667 789 ,N*M=111 111 111 111 111
111;

M就是当N=99时,符合条件的数

二、解题思路

考虑将问题转化为:找只含有0和1的能被N整除的最小正整数。可以看出这是和原问题等价的。

那么需要将0和1组成的所有数从小到大遍历吗?
这样的话,如果寻找的数是k位,则需要搜索2k-1个数才能得到结果。

这里采用的方式是在计算中保留%N的余数信息,避免不必要的计算。更形式化的论述:

假如已遍历了所有K位(X)十进制数,而且也搜索了T=10k(10的k+1位数的最小数),现在要考察所有k+1为数(Y)的情况。则

Y=X+T(即所有K进制的数+10K),如果我们将X按%N将空间分解,即将X分解成余数为(0~N-1)的等价类,则在搜索Y是只需要取X中的代表元素进行模运算,这样就将搜索时间从2K降到N。在具体实现时每个等价类中都保存最小的元素。

三、代码实现


#include<iostream>
#include<vector>
#include<string>
#define N 100213
using namespace std;
vector<vector<int> >BigIntVec;
void printNum(const vector<int>& tv){
//cout<<"print"<<endl;
int maxIndex=tv.back();
string numStr="";

for(int i=0;i<maxIndex+1;i++){
numStr+="0";
}
for(int i=0;i<tv.size();i++){
numStr[maxIndex-tv[i]]=‘1‘;
}
cout<<"找到的最小符合条件的数为:"<<endl;
for(int i=numStr.size()-1;i>=0;i--){
cout<<numStr[i];
}
cout<<endl;
}
void findNum(){
for(int i=0;i<N;i++){
vector<int>tt;
BigIntVec.push_back(tt);
}
BigIntVec[1].push_back(0);
int noUpdate=0;
for(int i=1,j=10%N;;i++,j=(j*10)%N){

bool flag=false;
if(BigIntVec[j].size()==0){
BigIntVec[j].push_back(i);
flag=true;
}

for(int k=0;k<N;k++){

if(BigIntVec[k].size()>0&&i>BigIntVec[k].back()){

int t=(k+j)%N;

if(BigIntVec[t].size()==0){

for(int tt=0;tt<BigIntVec[k].size();tt++){
BigIntVec[t].push_back(BigIntVec[k][tt]);
}
BigIntVec[t].push_back(i);
flag=true;
}
}

}

if(flag==false){
noUpdate++;
}else{
noUpdate=0;
}
if(BigIntVec[0].size()>0||noUpdate==N){

break;
}
}
if(BigIntVec[0].size()>0){
printNum(BigIntVec[0]);
}else{
cout<<"没有找到符合条件的数"<<endl;
}
}

int main(){
findNum();
system("pause");
return 0;
}

注:由于该问题涉及到的整数可能非常大,不能用内置类型int或long表示,因此程序中借助vector实现模拟整数。因为寻找的数只有1,0两种数字,为了节省空间,每个整数用vector<int>表示,vector每一元素保存1出现的位置。例如数字100101,的vector<int>表示为{0,2,5},即出现1的位置分别为第0,2,5位。

四、程序输出结果(输入N为:100213):

时间: 2024-10-25 17:26:54

变形金刚joy007 项目总结的相关文章

图片切换(非轮播,淡入淡出)--变形金刚joy007 项目总结

图片切换(非轮播,淡入淡出) 1.切换2.停止 <html> <head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <style type="text/css"> div{ position: absolute; left: 0px; top: 0px;} .div1{ width: 800px; hei

项目:变形金刚拼图

代码在github: https://github.com/Viyu/TransformersPuzzle 这是一款拼图游戏,Transformers的主题. 这个游戏一共包含18个级别,1-6级的是3x3的难度,7-12级的是4x4的难度,13-18级的是5x5的难度. 你可以打开声音或振动提示,这样一来,如果你将一个方块移动到了正确的位置,会有声音或者振动提示. 你可以借助图片碎片位置数字提醒功能,每次有三次机会. 这个游戏是非常好操作的,你可以同时移动多个方块,如果这些方块在一条线上.

Win10下IIS配置、项目发布、添加网站

Win10下IIS配置 1.找到控制面板:[开始]菜单鼠标右击,打开[控制面板] 2.打开控制面板,点击[程序],点击[启用或关闭Windows功能] 下一步,点击[启用虎关闭Windows功能] 3. 开始修改IIS了,我是这样勾上的,有可能比较多. 4. 验证IIS是否正确安装,等待几分钟后IIS配置完成.在浏览器输入http://localhost/iisstart.htm会出现 IIS安装成功页面.第一次修改的时候出现了成功页面,但是后来删除了IIS中默认的网站就打不开了,但是不影响的.

使用 IDEA 创建 Maven Web 项目 (异常)- Disconnected from the target VM, address: &#39;127.0.0.1:59770&#39;, transport: &#39;socket&#39;

运行环境: JDK 版本:1.8 Maven 版本:apache-maven-3.3.3 IDEA 版本:14 maven-jetty-plugin 配置: <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <webAppSourceDirectory>${pro

MyEclipse建立SpringMVC入门HelloWorld项目

一.首先,建立空的web project项目: 1. 2. 3. 二.其次,导入先关jar包 1.将jar包导入SpringMVCHelloWorld\WebRoot\WEB-INF\lib目录下 三.接下来修改web.xml文件,在web中,指定我们的DispatcherServlet.(从这里进入SpringMVC的可控范围). 1. 2.web.xml中的内容如下: <?xml version="1.0" encoding="UTF-8"?> &l

如何用 Android Studio 导入开源项目以及常见错误的解决办法

声明:这篇文章完全来自这篇文章,感谢大神的相助.这篇文章纯粹是为了备份. 本篇以Github上最热门的MaterialDesign库,MaterialDesignLibrary来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你. 如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发.但如果要想导入Github上的热门项目,必须首先熟悉Gradle. 1. Gra

【机器学习实战】Machine Learning in Action 代码 视频 项目案例

MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apache中文网) 视频每周更新:如果你觉得有价值,请帮忙点 Star[后续组织学习活动:sklearn + tensorflow] ApacheCN - 学习机器学习群[629470233] 第一部分 分类 1.) 机器学习基础 2.) k-近邻算法 3.) 决策树 4.) 基于概率论的分类方法:朴素

git 把本地创建的项目放到github上

很早之前就注册了Github,但对其使用一直懵懵懂懂,很不熟练.直到昨天做完百度前端技术学院的task,想把代码托管到Github上的时候发现自己对于Git的操作是如此之愚钝,所以今天决定把Git好好学习一遍,好让自己以后能更好地使用Github,主要还是通过Git教程 - 廖雪峰的官方网站来学习.简要步骤可以直接看最后的总结. Git的安装就不说了. 第一步:我们需要先创建一个本地的版本库(其实也就是一个文件夹). 你可以直接右击新建文件夹,也可以右击打开Git bash命令行窗口通过命令来创

eclipse部署tomcat修改项目访问路径(虚拟路径)

原文参考: http://www.educity.cn/wenda/147993.html http://blog.163.com/java_zf/blog/static/19926038420129240314546/ tomcat部署web项目(eclipse自动部署项目到tomcat,访问URL中不包含部署名) 最近项目中需要把项目部署到tomcat中,并且访问路径中不包含不署名,且想实现Eclipse中的自动部署,扒了好久资料,最终实现了自己的需求,呵呵,如下: 1. 把项目contex