数学问题 | 连续质因数分解:1096

这题真的是触及到了我的知识盲区,写了一个16分的答案,看了答案(开长整型找不到结果的特殊判断)之后改成了18分,还是没有AC。终于,我仔细一看标准代码,发现这题不简单。

wa代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 1010
#define MAX (1<<30)-1
#define V vector<int>

typedef long long ll;

using namespace std;



int main(){
    int n;
    n=6;
//    I("%lld",&n);
    int t=n,i;
    vector<int> ans;
    vector<int> cur;
    bool flag=0;
    for(i=2;i<=sqrt(n);i++){
        if(t%i==0){
            cur.push_back(i);
            t/=i;
            flag=1; 
        }else{
            if(flag){    //断了 
                t=n;
                if(cur.size()>ans.size()){// || (cur.size()>0&&ans.size()>0&& cur.size()==ans.size() && cur[0]<ans[0])
                    ans=cur;
                }
                cur.clear();
            }
            flag=0; 
        }
    }
    if(cur.size()>ans.size()){
        ans=cur;
    }
    int sz=ans.size();
    if(sz){
        O("%d\n",sz);
        FF(i,sz){
            O("%d",ans[i]);
            if(i!=sz-1) O("*");
        }    
    }else O("%d\n%d",1,n);

    return 0;
}
View Code

抄了一遍答案代码(没力气默了),感觉写的比我的垃圾强多了。

AC代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 1010
#define MAX (1<<30)-1
#define V vector<int>

typedef long long ll;

using namespace std;



int main(){
    ll n;
    n=630;
    I("%lld",&n);
    ll i;
    int ansI=0,ansLen=0;
    for(i=2;i<=sqrt(n);i++) if(n%i==0){
        ll tmp=1,j=i;
        while(1){
            tmp*=j;
            if(n%tmp) break;
            if(j-i+1>ansLen){
                ansI=i;
                ansLen=j-i+1;
            }
            j++;
        }
    }
    if(ansLen){
        O("%d\n",ansLen);
        for(ll i=0;i<ansLen;i++){
            O("%lld",ansI+i);
            if(i<ansLen-1) O("*");
        }
    }else O("%d\n%d",1,n);

    return 0;
}

 

转载于:https://www.cnblogs.com/TQCAI/p/8568831.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值