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

来源:互联网 发布:淘宝网男士耐克运动鞋 编辑:程序博客网 时间:2024/05/16 09:16

问题:任意给定一个正整数N,求一个最小的正整数M,使得N*M的十进制表示形式中只含有1和0,

先证明这样的M是存在的。

  

     下面给出如何求解这样的M呢?代码中主要由find()函数实现的,假若N=3,给出求解过程:

其思想就是在中找出N个最小的相等的数,然后它们的和就满足M*N的要求。

其求解是:由底向上求解,number:保存数,mod保存余数。

(1)先将1放入number中,1modN放入mod中。

(2)然后判断2位数10、11中是否会产生新的余数

(3)然后再判断三位数中(100和number中的数相加组成的三维数)是否产生新的余数

(4).....

N=3为例:

一位数

num=1:number{1};mod{1}

二位数

num=10:num%N==1,没有产生新的余数,不对number、mod进行操作

判断10和一位数组成的新二位数是否产生新余数即:(num%N+mod[i])%N是否在mod中是新数)11%3=2

所以number{1,11};mod{1,2}

三位数

num=100:num%N=1,没产生新的余数,不对number、mod进行操作

判断100和number中的一位、二位数组成新的三位数是否产生新的余数,100+number[0]=101modN=2没产生新余数,不对number、mod进行操作。100+number[1]=111modN=0产生新的余数,同时为0 ,循环停止,找到满足条件的数。number{1,11,111};mod{1,2,0}

有人可能会问在三位数中为什么没对110进行判断,难道就这么肯定不会产生新的余数?

其实可以看看110的组合它是由100+10进行组合的,由于10modN与1modN二,而被丢弃。那么可知100+1肯定与100+10的余数相同。

FindNum.h

#pragma once#include<iostream>#include<vector>using namespace std;class Num{public:Num(int n);void find();bool contains(int m);void show();private:int N;vector<long long> number;vector<int> mod;};


 

FindNum.cpp

#include"stdafx.h"#include"FindNum.h"#include<iostream>#include<vector>using namespace std;Num::Num(int n){N=n;}void Num::find(){long long num=1;int m;m=num%N;mod.push_back(m);number.push_back(num);while(m){num*=10;m=num%N;int n=mod.size();if(!contains(m)){mod.push_back(m);number.push_back(num);}if(m==0)return ;for(int i=0;i<n;i++)    //注意此处的循环,当位数为k+1时,n保存的是k位时mod中的余数个数{m=(num%N+mod[i])%N;if(!contains(m))   //在寻找是否和前面的余数相重复,实时的更新mod中满足条件的余数。{mod.push_back(m);number.push_back(num+number[i]);}if(m==0)return;}}}bool Num::contains(int m){for(int i=0;i<mod.size();i++)if(m==mod[i])return true;return false;}void Num::show(){find();int n=number.size()-1;long long M=number[n]/N;cout<<"最小的符合条件的整数为:"<<M<<endl;}


Beauty-2.8.cpp

// Beauty-2.8.cpp : 定义控制台应用程序的入口点。////编程之美-找符合条件的整数:给定任意一个整数N,求一个最小的正整数M>1,使得N*M十进制表示只含有0、1#include "stdafx.h"#include"FindNum.h"#include<iostream>#include<vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int N;cout<<"Input N"<<endl;cin>>N;Num a(N);a.show();return 0;}


 

原创粉丝点击