c++ 正整数拆分成素因子的乘积
来源:互联网 发布:网络辱骂警察 编辑:程序博客网 时间:2024/06/03 22:42
#include<string>//设计算法,将某个大于1的数分成素因子的乘积 6=2*3 7=7 8=2*2*2//1.判断当前数是不是素数,是直接返回//2.否则,循环直到第一个它能整除的素数,当前数变为除以素数后的商,继续大循环。//判断一个数是不是素数#include <math.h>bool isPrime(int x){if (x <= 1)return false;if (x == 2)return true;if (x % 2 == 0)return false;int tmax = (int)sqrt(x) + 1; //sqrt(9)返回的是浮点数,有可能是2.9999或3.00001等,确保正确性,多比较一次int i = 3;while (i < tmax){if (x%i == 0)return false;i+=2;}return true;}string primeMulti(int x){string s = "";s+= to_string(x)+"=";while (x != 1){if (isPrime(x)){s =s+ to_string(x);return s;}if (x % 2 == 0){s += "2*";x /= 2;}for (int i = 3; i <= x; i += 2){if (isPrime(i) && x%i == 0){s += to_string(i) + "*";x /= i;break;}}}if (x == 1) //若最终x为1,需去掉尾上多余的乘号s = s.substr(0,s.size()-1);return s;}
改进:先把小于该数的素数求出来,保存在vector中,可以减少素数的重复判断
#include <iostream>#include <string>#include <vector>#include <math.h>using namespace std;bool isPrime(long n){if (n <= 1)return false;else if (n == 2)return true;else if (n % 2 == 0)return false;else{int maxsqr = (long)sqrt(n) + 1;for (long i = 3; i<maxsqr; i = i + 2){if (n%i == 0)return false;}}return true;}void prime(long n, vector<long>& vec){if (n <= 1)return;for (long i = 2; i <= n; ++i){if (isPrime(i))vec.push_back(i);}return;}int main(){vector<long> v = {};long n;cin >> n;prime(n, v);while (n != 1){long i = 0;while (v[i] <= n){if (n%v[i] == 0){cout << v[i] << " ";n = n / v[i];break;}++i;}} cout << endl;return 0;}
发现一个更简单的,不用判断是不是素数,直接除以比n小的数即可。
void primeFactor(long n){ if(n<=1) return; while(n!=1){ for(int i=2;i<=n;++i){ if(n%i==0){ cout << i << " "; n=n/i; break; } } }}
加一个其它习题:
//设计算法,求二项式c(n,k)的系数//c(n,k)=c(n,k-1)+c(n-1,k-1)int er(int n,int k){if (k == 0 || k==n)return 1;if (k > n / 2)k = n - k;return er(n- 1, k) + er(n - 1, k - 1);}
再加一个汉诺塔问题,都是用递归实现的。递归可以让代码更简洁,甚至解决一些循环不能解决或解决起来超级复杂的问题
void move(int n,char from, char to){cout <<n<<":"<< from << "->" << to << endl;}//实现汉诺塔盘子移动//关键点:只有一个盘子,直接把它从from移动到to,否则,先移动n-1个盘子,以to为临时柱子//移动到tmp;再移动第n个盘子到to;最后将那n-1个盘子从tmp以from为临时柱子移动到tovoid hanuota(int n, char from, char tmp, char to){if (n == 1)move(n,from, to);else{hanuota(n - 1, from, to, tmp);move(n,from, to);hanuota(n - 1, tmp, from, to);}}
运行hanuota(3,'A','B','C');得到的输出:
0 0
- c++ 正整数拆分成素因子的乘积
- 把任意一个正整数分解成几个素因子的幂的乘积
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 对于1个正整数N,将其拆分成几个正整数的和,如何拆分可使得其乘积最大?
- 求正整数n划分因子乘积最大的一个划分及此乘积
- 乘积最大的拆分
- 给一个整数N,N可以拆分出不同的因子,而且满足因子的乘积等于N。则在这些因子中和是最小的一组是什么
- poj 1032 Parliament(正整数拆分不同数使乘积最大)
- 正整数的因子与质因子
- 求正整数的质因子
- 求正整数的质因子
- 给定一个正整数n,则在n所有的分解式中,求因子乘积最大的一个分解及此乘积。
- 阶乘拆分成素数指数因子的形式
- 正整数拆分
- 一个整数的所有因子乘积
- ZJU2037 Parliament - 乘积最大的整数拆分
- [OpenJudge-NOI]乘积最大的拆分
- PRML读书笔记——Kernel Methods
- 友元
- LinuxGDB的常用命令
- lmbench3 lat_mem_rd的测试结果记录
- linux学习记录文本编辑
- c++ 正整数拆分成素因子的乘积
- 「信息安全产品」WAF,web应用防火墙
- leetcode 392. Is Subsequence
- URAL 2067. Friends and Berries
- web前端技术
- 已知一个抽象类Shapge,该类中有一个方法GetArea。 要求定义一个Rectangle类,继承Shape类,实现GetArea方法计算矩形面积。
- 线程安全和可重入函数
- C/C++输入输出
- IMWeb训练营作业-----Vue+Bootstrap留言板