进阶实验2-3.4-素因子分解-编程题
程序员文章站
2022-03-04 22:37:58
...
解题代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef enum{false,true} bool;
void PrintFactorizationOfPrime(int K);
int GetNextFactorOfPrime(int K, int last_Factor);
int GetExpon(int* K, int Factor);
int GetNextPrime(int last_Prime);
bool IsPrime(K);
int main()
{
int K;//1-the max of long int 2^31-1
scanf("%d", &K);
if (K == 1) printf("1=1");
else PrintFactorizationOfPrime(K);
return 0;
}
void PrintFactorizationOfPrime(int K) {
printf("%d=", K);
int flag=1;
int temp_Factor = 1;
int temp_Expon;
while (K != 1) {
if (flag)flag = 0;
else printf("*");
temp_Factor = GetNextFactorOfPrime(K, temp_Factor);
temp_Expon = GetExpon(&K, temp_Factor);
if (temp_Expon == 1) printf("%d", temp_Factor);
else printf("%d^%d", temp_Factor, temp_Expon);
}
}
int GetNextFactorOfPrime(int K, int last_Factor) {
while (true) if (!(K % (last_Factor = GetNextPrime(last_Factor)))) return last_Factor;
}
int GetExpon(int* K, int Factor) {
int temp_Expon = 0;
while (true) {
if (!(*K%Factor)) {
temp_Expon++;
*K /= Factor;
}
else return temp_Expon;
}
}
int GetNextPrime(int last_Prime) {
int temp_Prime;
while (true) {
if (IsPrime(++last_Prime)) return last_Prime;
}
}
bool IsPrime(K) {
int i;
for (i = 2; i <= sqrt((double)K); i++) {
if (!IsPrime(i)) continue;
if (!K%i) return false;
}
return true;
}
测试结果
问题整理
1.感觉写了一个不是每个人都能很顺利看懂的程序,这次用的函数比较多,思路比较清晰就是了。。
2.一个式子不要写的太复杂,比如if()内,这次的!遇到了运算优先级的bug。
3.比如printf中,本来放在printf中的调用函数放到了外边就把运行超时的bug给de了,虽然不是很清楚逻辑,别这么做暂时ok。