给定一个正整数x,找到一个最小的正整数y,使得y的每一位相乘,最后值等于x
来源:互联网 发布:苹果电脑清理垃圾软件 编辑:程序博客网 时间:2024/04/28 05:34
题目:给定一个正整数x,找到一个最小的正整数y,使得y的每一位相乘,最后值等于x
思路:对x进行分解成多个数字相乘,然后把这些数字从小打到排序,最后组装成数字就得到最小的正整数y。
特殊情况:
1、如果x是大于10的质数或者x的因子中有大于10的质数,那么输入不合法!因为题目是要求y的每一位相乘,这样每一位的范围就是0~9,如果x是大于10的质数或者x的因子中有大于10的质数,那么x的因子中必定存在大于10的数,不满足条件!
2、如果输入的数小于10,则压入1和本身,这样得到的数是最小的。
3、输入的数进过多次分解之后剩下的数如果小于10,则压入本身,这个和情况2是有区别的。
代码如下:
//是否是质数bool isZhiShu(int num){int a = 0;for (int i = 2; i < num; i++){if (num%i == 0){a++;}}if (a == 0){return true;}return false;}//把数字nX分解成多个数字相乘,且每个数字的范围为0~9之间,不在这个范围则不合法void getNumber(int nX, vector<int>&vcNumber){if (nX<=0){throw new std::exception("输入的数字必须为正整数!");}int nData = nX;for (int i = 9; i > 0;i--) {if (nX<10)//输入的数小于10,压入1和本身{vcNumber.push_back(1); vcNumber.push_back(nX);break;//结束}if (nData<10)//压入本身{vcNumber.push_back(nData);break;//结束}else if (isZhiShu(nData))//大于10且为质数{throw new std::exception("输入的数字为质数或者含有为质数的因子!");}else{if (nData%i==0)//余数为0{vcNumber.push_back(i);nData = nData/i;i = 10;//回到起点}} }}//降序排序比较函数bool Comp(const int &a, const int &b){return a > b;}int main(){int nX;vector<int> vcNumber;while (true){cout << "please input a number x:" << endl;cin >> nX;if (nX <= 0){cout << "输入的数字必须为正整数,请重新输入!" << endl;}else{getNumber(nX, vcNumber);sort(vcNumber.begin(), vcNumber.end(),Comp);//降序排序vector<int>::const_iterator iter;//逆序迭代器int nOutput = 0;int nCount = 1;for (iter = vcNumber.begin(); iter != vcNumber.end(); ++iter){nOutput += (*iter) * nCount;nCount *= 10;}vcNumber.clear();cout << "the minimum number y is:" << nOutput << endl;}}return 0;}
测试结果:
注意:这里对vector的排序使用STL中的sort函数,由于得到的vector里面的数字都是0~9范围,满足使用计数排序的条件,可以使用计数排序,时间复杂度为O(N),关于计数排序,请看之前的博文:http://blog.csdn.net/liuyi1207164339/article/details/50830224
0 0
- 给定一个正整数x,找到一个最小的正整数y,使得y的每一位相乘,最后值等于x
- 输入正整数 k,找到所有的正整数 x ≥ y,使得 1/k =1/x + 1/y
- LeetCode试题之““给定一个正整数A,找到最小的正整数B,它的每一个数字的乘法等于A。””
- 给定两个字符串x、y,设计一个算法来判断是否存在一对正整数m、n,使得x^m = y^n。
- 笔试面试13--给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y
- 给定一个正整数n,要求找到最小的x(x>0)满足2^x mod n = 1。
- 输入一个正整数X,求出其阶层Y值?
- 求正整数的x,y的最小公倍数
- 输入一个正整数n,输出一个最小正整数m,使得m的各位乘积等于n
- 输入正整数k,找到所有的正整数x>=y,使得1/k=1/x + 1/y; 样例输入: 2 12 样例输出: 2 1/2 = 1/6 + 1/3 1/
- 给定表达式[x/2] + y + x * y, 其中x,y都是正整数。
- 实现函数method(x,y),求x的y次方的最后三位数,x,y都为小于100的正整数。
- 给定一个数组,求x和y,使得abs(x+y)最接近零
- 给定一个正整数n,找到比n小的完美平方数相加和等于n的最小数目。
- 证明题:证明当n是一个整数且n>2时,方程x^n+y^n=z^n无正整数x,y,z的解。
- 扩展欧几里德求解ax + by = c 的 最小正整数解 ( x, y)
- Hdu 5812 Distance(三种操作. 1.插入x 2.删除x 3.在集合中找到一个数y,使得y->x,每次能除以一个素数或者乘上一个素数,问最少的操作次数)
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- pacman 的具体使用
- 二维码 编码原理简介
- 虚拟机性能监控与故障处理
- LightOJ 1370 Bi-shoe and Phi-shoe【欧拉函数 && 质数】
- 最新不安装百度云管家就可以下载网盘资源的方法及各种浏览器修改JavaScript开关方法
- 给定一个正整数x,找到一个最小的正整数y,使得y的每一位相乘,最后值等于x
- erlang 创建一个进程所占的内存
- BestCoder Round #80 Segment
- String深拷贝+String增删改查
- struts2中配置拦截器、拦截器栈和默认拦截器
- BestCoder Round #80(A)模拟
- java虚拟机Class类文件的结构
- Android Studio实现代码混淆
- php中需要注意的问题