题目:给了一个数的阶乘,如10!,然后把它表示成只有质数的乘积。如10表示成2*5; 8表示成2*2*2;以此类推,最后输出每个质数的数目。按照 2 ,3,5,7.。。的顺序
注意:这道题算具体多少个质数的部分换了好几种方法,刚开始用pow,又用了log,最后才找到正确的方法
输出的时候每行最多15个数字
#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <cmath>
#include <ctgmath>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
//100以内的质数打表
int a[25]={2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
//int数组定义时不用加双引号,那时char数组需要的
int num=0;
while(cin>>num){
int b[25]={0};//用于记录a中对应个数
if(num==0)break;
//判断
for(int i = num; i >= 2; i--){
for(int j = 0;j < 25; j++){
if(a[j] == i) {//正好等于某质数
b[j]++;
break;
}
else if(i % a[j] == 0){//恰好可以被某质数,如二整除
/*第一次的错误想法,用pow是不可以的8^0.5求的是8开方,用log2才能求出
int temp = 0;
temp = pow(i+0.1, (1.0/a[j]));//不清楚这里会不会有问题//注意格式
b[j]+=temp;
break;
*/
/*第二次的错误想法,只有考虑了某些质数做次方的情况,造成2、3过多,还有10=2*5等情况
//使用log函数
//log10(x)以10为底 log(x)以e为底
int temp = 0;
temp = log(i) / log(a[j]);
b[j]+=temp;
break;
*/
//连续的除
int t = i;
while (t!=1) {
if(t%a[j]==0){
t = t / a[j];//相当于10/2=5
b[j]++;
j=0;//归零重新开始
}
else j++;
}//while
break;//记得最后break出去!
}//else if
}//for
}//判断结束
//输出小于num所有质数的个数
printf("%3d! =",num);
for(int i = 0;a[i]<=num;i++){
if(i%15 == 0 && i!=0) {
printf("\n");
printf(" ");
}
printf("%3d",b[i]);
}
printf("\n");
}
return 0;
}