题目粗心:
给出一个int范畴的整数,依照从小到大的程序输入其合成为质因数的乘法算式。
算法思路:
此题考查的是质因子合成的内容,对于每一个质因子咱们应用构造体Factor进行存储,其中保留了因子和呈现的次数。接下来就是获取数字N的每一个质因子.
获取办法如下:
首先应用prime_table
保留$10^5$以内的所有素数,而后遍历每一个在2和根号N之间的素数prime_table[i]
,只有N%prime_table[i]==0
,阐明prime_table[i]
为N的一个质因子,而后只有prime_table[i]
还是N的因子,就讲对于的次数count
加一,同时N除以prime_table[i]
,当prime_table[i]
不在是N的因子的时候,让不同因子的数目index_factor
加一即可。同时因为对于一个数N,最多只有一个大于根号N的因子,也就是说,在2到根号N之间的所有因子都曾经处理完毕后,N仍然不为1,阐明还有一个大于根号N的因子,此时须要记录该因子(其实就是以后的N)和次数(1)。
留神点:
1、对于N等于1的时候没法合成,须要特判输入,测试点3考查。2、因为从2开始的素数到第11个素数的时候,所有素数的累乘就超过了int的返回,所以factor数组开到10就行了。
提交后果:
AC代码:
#include <cstdio>#include <cmath>using namespace std;struct Factor{ int prime{};// 因子 int count{};// 个数}factor[10];int index_factor = 0;int prime_table[100000];// 素数表int num = 0;bool isPrime(int N){ if(N<4){ return N>1; } if(N%6!=1&&N%6!=5) return false; for (int i = 5; i < sqrt(N*1.0); i+=6) { if(N%i==0||N%(i+2)==0){ return false; } } return true;}// 获取素数表void init(){ for (int i = 2; i < 100000; ++i) { if(isPrime(i)){ prime_table[num++] = i; } }}int main(){ init(); int N; scanf("%d",&N); if(N==1){ printf("1=1");// 特判1,测试点3考查 return 0; } printf("%d=",N); int sqrt_N = (int)sqrt(N*1.0); // 遍历每一个素数 for (int i = 0; i < num&&prime_table[i]<=sqrt_N; ++i) { if (N%prime_table[i]==0){ factor[index_factor].prime = prime_table[i]; while (N%prime_table[i]==0){ ++factor[index_factor].count; N /= prime_table[i]; } ++index_factor; } } // 还存在一个大于根号N的因子 if(N!=1){ factor[index_factor].prime = N; ++factor[index_factor++].count; } for (int j = 0; j < index_factor; ++j) { printf("%d",factor[j].prime); if(factor[j].count>1){ printf("^%d",factor[j].count); } if(j<index_factor-1) printf("*"); } return 0;}