uva160 Factors and Factorials

题目:给了一个数的阶乘,如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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值