首页 > 编程语言 >c++质因数分解

c++质因数分解

时间:2024-09-05 20:52:08浏览次数:4  
标签:因数分解 int 质数 namespace c++ include cout

质因数分解,最先想到了遍历1-n,找出既是质数也是因数的数。

需要用到判断质数函数、while循环,复杂度三次方以上了。

#include<iostream>
using namespace std;
bool zs(int n) {
	for (int i = 2; i <= n / 2; i++) {
		if (n % i == 0) {
			return 1;
		}
	}
	return 0;
}
int main() {
	long long n, cnt = 0;
	cin >> n;
	cout << n << "=";
	while (n != 1) {
		for (int i = 2; i <= n; i++) {
			if (!zs(i)) {
				while (n % i == 0) {
					n = n / i;
					if (cnt == 0) {
						cout << i;
						cnt++;
					} else {
						cout << "*" << i;
						cnt++;
					}
				}
			} else {
				continue;
			}
		}
	}
	return 0;
}

第一步优化:实际上,不用判断质数,因为该除的前面也除掉了,所以可以把质数判断删掉。

#include<iostream>
using namespace std;
int main() {
	long long n, cnt = 0;
	cin >> n;
	cout << n << "=";
	while (n != 1) {
		for (int i = 2; i <= n; i++) {
			while (n % i == 0) {
				n = n / i;
				if (cnt == 0) {
					cout << i;
					cnt++;
				} else {
					cout << "*" << i;
					cnt++;
				}
			}
		}
	}
	return 0;
}

第二步优化:前面的代码写i<=n是因为怕这个数是质数,但我们只需写i*i<=n就行,结尾加n大于1的判断,就能进一步优化。

#include <iostream>
using namespace std;
int main() {
	int n;
	cin >> n;
	cout << n << "=";
	if (n == 1) {
		cout << 1;
		return 0;
	}
	int flag = 0;
	for (int i = 2; i * i <= n; i++) {
		if (n % i == 0) {
			int cnt = 0;
			while (n % i == 0) {
				n = n / i;
				cnt++;
			}
			if (flag == 1) {
				cout << "*";
			}
			if (cnt == 1) {
				printf("%d", i);
			} else {
				printf("%d^%d", i, cnt);
			}
			flag = 1;
		}
	}
	if (n > 1) {
		if (flag == 1) {
			cout << "*";
		}
		printf("%d", n);
	}
	return 0;
}

标签:因数分解,int,质数,namespace,c++,include,cout
From: https://www.cnblogs.com/mineral-branch/p/18399226

相关文章

  • C++基础知识
    1、基本概念1.1 引用类型(reference)        对一个数据可以使用"引用"(reference)类型,这是C++对C的一个重要扩充,引用是一种新的变量类型,它的作用是为一个变量起一个别名inta;int&b=a;        在声明变量b时变量a的引用后,在它......
  • C++学习笔记----6、内存管理(二)---- 数组指针的双向性
            你可能已经看到指针与数组之间的一些重叠。自由内存空间分配的数组由其第一个元素的指针进行访问。栈上的数组通过使用数组语法([])或者正常变量声明来访问。你还会看到的是,其重叠不仅如此,指针与数组有更复杂的关系。1、数组退化至指针        自由内......
  • C++入门基础知识50——【关于C++数字】之C++ 数学运算
    成长路上不孤单......
  • 终于使用c++、结构体,函数实现简单数组元素的插入
    includeusingnamespacestd;//定义结构体structMyArray{intarr[100];//数组,假设最大长度为100intn;//数组当前元素数量};//输入函数voidscanf(MyArray&myArray,int&x,int&y){cin>>myArray.n;for(inti=0;i<myArray.n;i++){cin>>my......
  • 深度解析C++中函数重载与引用
    ......
  • C++ STL queue容器——队列
    queue容器基本概念queue是一种**先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。queue容器没有迭代器,所有元素进出都必须符合“先进先出”条件,只有顶端的元素才有机会被外界取用,所以也不提供遍历功能。queue容器常用操作构造函数queue<T>qu......
  • c++遍历数组的多种方式
    方法一:普通的for循环for(inti=0;i<sizeof(a)/sizeof(a[0]);i++){cout<<a[i]<<"";}方法二:指针数组int*p[len];for(inti=0;i<len;i++){p[i]=&a[i];cout<<*p[i];}———————————————......
  • Qt C++设计模式->策略模式
    **策略模式(StrategyPattern)**是一种行为型设计模式,它定义了一系列算法,将每一个算法封装起来,并使它们可以互相替换,策略模式让算法可以独立于使用它的客户端而变化。这意味着,客户端可以根据需要动态选择使用哪种算法,而不需要修改算法的实现。策略模式的主要组成部分策略接......
  • C++ STL stack容器——栈
    stack容器基本概念stack是一种先进后出的数据结构,它只有一个出口,形式如下图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何地方可以存取stack的娶她元素。换句话说,stack不允许有遍历行为。元素推入栈的操作称为push,将元素推出栈的操作称为pop。st......
  • C++程序的发布部署方式及缺失依赖库dll的解决方法
    主要对Windows平台上C++项目开发过程中库目录进行梳理及程序发布要注意的相关事项进行总结,希望对其他开发者有一定的借鉴意义。1.问题的提出在最近的项目中,主要工作是为SketcchUp平台开发基于Ruby的扩展功能库,这种库文件是以.so为后缀的形式提供,用C++语言来编写实现。当我在自己......