任意给定一个正整数N,求一个最小的正整数M(M1),使得N*M的十进制表示形式里只含有1和0。...
解法二:由于没有直接的数学方法能帮我们直接得到M的值,所以我们只能进行搜索。由于相对M,乘积N*M具有明显的特征,需要搜索的空间要小很多,所以我们对乘积N*M进行搜索。如果N*M的结果有K位,则要循环2^K次,我们发现K的结果能轻易超过40,所以这个运行时间还是相当长。同余运算具有等价关系,mod N = i(0<=i<N)构成了N个等价类,将正整数集进行划分。对于每个等价类,我们只需要判断其中最小的元素加上10^K是否能被N整除,这样搜索空间就从2^K次减少到(K-1)*N步,而N的值一般要远远小于M的值,但要O(N)的空间复杂度。
由于无论M还是N*M的位数都相当大,所以我们用大整数表示M和N*M。由于要N个大整数,所以N不能为大整数,即其值最好取一百万以内。
代码实现入下:
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
bool FindNumber(int N,vector<int> *BigInt);
int main()
{int N,i;cout<<"Input a positive integer: ";cin>>N;vector<int> *BigInt=new vector<int>[N];//用来存放余数为0 ~ N最小数字,数字表示,如整数1001,则存为1001=10^0+10^3=(0,3),适合大数的表示for(i=0;i<N;i++)BigInt[i].clear();bool found=FindNumber(N,BigInt);if(found){int len=BigInt[0][BigInt[0].size()-1]+1;char *product=new char[len+1];int product2=0;for(i=0;i<len;i++)product[i]='0';product[len]='\0';vector<int>::iterator iter;for(iter=BigInt[0].begin();iter!=BigInt[0].end();iter++){product2=product2+pow(10,*iter);product[*iter]='1';}int j=len-1;i=0;while(i<j){char tmp=product[j];product[j]=product[i];product[i]=tmp;i++;j--;}int M=product2/N;//product和product2都对应着乘积结果,但是product2对应着整型,乘积过大时,product2可能不会得到正确的结果;//product对应着乘积的字符串,可以表示大数的乘积结果,M为product2/N,即为要求的数,当product2溢出时,不是正确的结果,//那种情况下,需要用product/N,其中product为乘积的字符串表示,这里没有求解,读者可以自行解决。cout<<N<<" * "<<M<<" = "<<product<<" , "<<product2<<endl;delete []product;}elsecout<<"Can not find M!"<<endl;delete []BigInt;return 0;
}
bool FindNumber(int N,vector<int> *BigInt)
{int i,j,k;BigInt[1].push_back(0);int NoUpdate=0;for(i=1,j=10%N; ; i++,j=(j*10)%N){bool flag=false;if(BigInt[j].size()==0){flag=true;// BigInt[j]=10^i,(10^i)%N=jBigInt[j].clear();BigInt[j].push_back(i);}for(k=1;k<N;k++){//有新的余数出现if((BigInt[k].size()>0)&&(i>BigInt[k][BigInt[k].size()-1])&&(BigInt[(k+j)%N].size()==0)){//BigInt[(k+j)%N]=10^i+BigInt[k]flag=true;BigInt[(k+j)%N]=BigInt[k];BigInt[(k+j)%N].push_back(i);}}if(flag==false)NoUpdate++;elseNoUpdate=0;//如果经过一个循环节都没能对BigInt进行更新,就是无解,跳出,//若有N次没更新过余数信息,则存在c>=0,10^(c+1)modN,...,10^(c+N)modN中必有两个是相等的,//那么继续进行下去也不会再更新了//或者BigInt[0]!=NULL,已经找到解,也跳出.if(NoUpdate==N||BigInt[0].size()>0)//若有N次没更新过余数信息,则存在c>=0,10^(c+1)modN,...,10^(c+N)modN中必有两个是相等的,那么继续进行下去也不会再更新了break;}if(BigInt[0].size()==0)return false;elsereturn true;
}
我们可以证明对于任意的N,一定存在M,使得N*M的乘积的十进制表示只有0和1。证明过程见:http://blog.csdn.net/jcwkyl/article/details/3859155
转载于:https://www.cnblogs.com/pangblog/p/3328995.html
任意给定一个正整数N,求一个最小的正整数M(M1),使得N*M的十进制表示形式里只含有1和0。...相关推荐
- 倒水问题:给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水,如果可以,输出步骤,如果不可以,输出no solution
倒水问题:给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水,如果可以,输出步骤,如果不可以,输出no solution 这个问题我找了百度,发现没有比较好的代码,有一些只判断 ...
- 6-2 指针与数组-矩阵的各列求和分数 10 本题要求实现一个函数,求一个n (小于10)行7列的二维数组各列的和。将各列和存放在一个至少7个单元的一维数组中。函数接口定义:
本题要求实现一个函数,求一个n (小于10)行7列的二维数组各列的和.将各列和存放在一个至少7个单元的一维数组中. 函数接口定义: void fun ( int data[][7], int resu ...
- 写一个函数,求一个字符串的长度,在main 函数中输入字符串,并输出其长度。
// 写一个函数,求一个字符串的长度,在main 函数中输入字符串,并输出其长度. #include <stdio.h> main() { int len; char*str[20]; ...
- 写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
写一个函数,求一个字符串的长度.在main函数中输入字符串,并输出其长度 代码如下: #include<stdio.h> int len(char *p); int main() {int ...
- 线性代数matlab求一个正交矩阵,线性代数求一个正交矩阵P,是P^-1AP= – 手机爱问...
2018-05-12 请问如何用雅克比法求解矩阵特征值和特征向量 雅可比方法的基本思想是通过一系列的由平面旋转矩阵构成的正交变换将实对称矩阵逐步化为对角阵,从而得到 的全部特征值及其相应的特征向量.首 ...
- 写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。
先用malloc()函数在动态存储区分配一块较小的内存空间.用字符型指针 P指向它. 然后根据输入字符串的大小,用realloc()函数动态调整动态存储空间的大小. 直到全部字符都装下为止. mall ...
- 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度
#include<stdio.h> #define N 100int fun(char *s) {int i=0;while(*s!='\0'){i++;s++;}return i; }i ...
- 编写一个C程序,实现以下功能: 张三、李四、王五三个人同时放鞭炮,张三每隔i秒放一个,李四每隔j秒放一个,王五每隔k秒放一个,他们各自放n个。对任意给定的i、j、k和n,求能听到多少声鞭炮响。
编写一个C程序,实现以下功能: 张三.李四.王五三个人同时放鞭炮,张三每隔i秒放一个,李四每隔j秒放一个,王五每隔k秒放一个,他们各自放n个.对任意给定的i.j.k和n,求能听到多少声鞭炮响. 文章目 ...
- python中给出一个不超过10的正整数n_求计算机大佬解答python题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 7-4 计算指数 (5 分) 真的没骗你,这道才是简单题 -- 对任意给定的不超过10的正整数n,要求你输出2n.不难吧? 输入格式: 输入在一行中给出一 ...
最新文章
- 两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问
- 为什么阿里巴巴要求日期格式化时必须有使用y表示年,而不能用Y?
- ILSpy可以反编译c语言,ILSpy反编译工具的使用
- lua学习笔记之io
- 北京Uber优步司机奖励政策(3月11日)
- Android获取本机号码及运营商
- raw_input() 与 input() __ Python
- linux telnet.class,Linux telnet简单实用方法
- Linux下samba服务器的搭建与配置
- ACM经验分享[转]
- 图像仿射变换 图像平移 python实现
- 怎么把jdk和jRE的Javadoc文档整合到MyEclipse
- 据说200G网盘资料
- PHP OOP(面向对象)进阶知识之“Trait技术”
- BUGKU-CTF-MISC-一个普通的压缩包
- XML解析—开源XOM类库
- 2020 中秋、国庆快乐!
- Error:A JNI error has occurred, please check your installation and try again的解决方法
- 【前端面试宝典】超基础的vue知识
- plt.plot()函数详解