编程之美:找到符合条件的整数

一、问题描述

任意给定一个正整数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)的情况。则

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

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):

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索搜索
, 111
, 十进制
, 整数
, 编程之美
, 最小
余数
,以便于您获取更多的相关知识。

时间: 2024-09-07 06:56:41

编程之美:找到符合条件的整数的相关文章

编程之美:24点游戏

一.问题描述 给玩家4张牌,每张牌牌面值在1~13之间,允许其中有数值相同的牌.采用加.减.乘.除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造一种表达式,使其运算结果为24. 如 输入:3 3 7 7 输出:(((3)/(7))+(3))*(7) 二.程序实现原理 遍历所有可能的组合,直到找到一个符合条件的组合或者遍历所有情况没有找到满足的组合,具体详见代码注释 三.程序基本实现 #include<iostream> #include<string&g

编程之美:1的数目

一.问题描述 给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下之中所有"1"的个数. 例如: N=12,(1,2,3,4,5,6,7,8,9,10,11,12)共有5个1 二.解题思想 假设N=abcde为一个整数,a,b,c,d,e分别对应十进制数,如果要计算(1到N)百位出现1的个数,他将受三个因素的影响:百位以上的数,百位数和百位一下的数,具体依赖如下: 分别设整数N百位以上,百位和百位一下的数字分别为:preNum,curNum,proNum,如N=abcde的三个

编程之美:平面最近点对

一.概念引入         最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.严格地说,最接近点对可能多于1对.为了简单起见,这里只限于找其中的一对.         最简单的就是直接暴力,也可以分治,使用分治的话关键是如何合并,如果两边都是n/2个点比较的话,合并的时间是O(n^2),那么T(n)=2T(n/2)+O(n2),它的解为T(n)=O(n2),还是没什么优势,这就引导我们去优化合并算法.         为了找到一个有效的合并算

编程之美:小飞的电梯调度算法

一.问题描述 亚洲微软研究院所在的希格玛大厦一共有6部电梯.在高峰时间,每层都有人上下,电梯每层都停.实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层.所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层.在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层. 问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?

盖茨扎克伯格现身说法:讲述编程之酷

新浪科技讯 北京时间3月2日上午消息,美国公益组织Code.org的一段最新视频请来了马克·扎克伯格(Mark Zuckerberg)和比尔·盖茨(Bill Gates)等业界大佬现身说法,讲述编程之酷.视频:盖茨扎克伯格等讲述编程之酷 媒体来源:新浪科技这段视频不仅展示了Facebook的前卫工作环境,还邀请了迈阿密热火队的克里斯·波什(Chris Bosh)和黑眼豆豆首脑人物Will.i.am讲述编程之美:程序员已经不再是西装革履的码农,他们可以穿着套头衫在Facebook园区内东奔西跑,而

Python中线程编程之threading模块的使用详解

  这篇文章主要介绍了Python中线程编程之threading模块的使用详解,由于GIL的存在,线程一直是Python编程中的焦点问题,需要的朋友可以参考下 threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.下面分别举例说明.先来看看通过继承th

iOS开发:多线程编程之NSThread的使用详解

  1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3.GCD 全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 这篇我们主要介绍和使用NSThr

ruby元编程之method

  这篇文章主要介绍了ruby元编程之method_missing的一个使用细节,本文介绍在使用method_missing时造成死循环的一个现象,需要的朋友可以参考下 我们知道顶级域,定义域的self是啥? 代码如下: puts self #main puts self.class #Object 我们知道当一个方法被调用的时候,如果没有对象接受,默认就是self,如: 代码如下: def tell_me_who puts self end tell_me_who #main 方法调用是这样的

iOS多线程编程之NSThread的使用

1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread  2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3.GCD  全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 这篇我们主要介绍和使用NSThr