个人学习记录,代码难免不尽人意。
Sample Input:
97532468
Sample Output:
97532468=2^211171011291
下面是我第一次自己写的错误代码,虽然测试点都通过了,但是是因为测试样例有限的原因。
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
const ll maxn=1000;
int prime[maxn];
bool isprime(ll n){
if(n<=1) return false;
int sqr=(ll)sqrt(n*1.0);
for(ll i=2;i<=sqr;i++){
if(n%i==0) return false;
}
return true;
}
void getprime(){
int count=0;
for(ll i=0;i<100000000;i++){
if(isprime(i)==true){
prime[count++]=i;
if(count==maxn) break;
}
}
}
int main(){
ll num;
scanf("%lld",&num);
printf("%lld=",num);
if(num==1) printf("1");
getprime();
vector<pair<ll,ll> > v;
ll index=0;
while(num!=1&&index<maxn){
if(num%prime[index]==0){
ll count=0;
while(num%prime[index]==0){
count++;
num=num/prime[index];
}
v.push_back(make_pair(prime[index],count));
}
index++;
}
for(ll i=0;i<v.size();i++){
if(v[i].second!=1){
printf("%lld^%lld",v[i].first,v[i].second);
}else printf("%lld",v[i].first);
if(i!=v.size()-1) printf("*");
}
printf("\n");
return 0;
}
一开始我唯一疑惑的一点就是要提前计算多少个质数,然后我初步计算了1000个质数来运算发现测试点都通过了。初次之外,还需要注意一点边界值的处理,题目中虽然说如果指数是1的话不需要打印,但是没有说如果输入的数据为“1”的时候怎么处理,正确的输出应该是“1=1”,因此需要特判。
ps:我在看《算法笔记》的答案时发现答案的做法是考虑到一个数n的因子要么全部小于sqrt(n),要么只有一个因子大于sqrt(n),而我的做法没有考虑1000个质数以后如果给的数据又出现了质数的话将会输出错误。因此需要修改。
正确代码如下所示:
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
const ll maxn=1000;
int prime[maxn];
bool isprime(ll n){
if(n<=1) return false;
int sqr=(ll)sqrt(n*1.0);
for(ll i=2;i<=sqr;i++){
if(n%i==0) return false;
}
return true;
}
void getprime(){
int count=0;
for(ll i=0;i<100000000;i++){
if(isprime(i)==true){
prime[count++]=i;
if(count==maxn) break;
}
}
}
int main(){
ll num;
scanf("%lld",&num);
printf("%lld=",num);
if(num==1) printf("1");
getprime();
vector<pair<ll,ll> > v;
ll index=0;
ll sqr=(ll)sqrt(1.0*num);
for(index;index<maxn&&prime[index]<=sqr;index++){
if(num%prime[index]==0){
ll count=0;
while(num%prime[index]==0){
count++;
num=num/prime[index];
}
v.push_back(make_pair(prime[index],count));
}
if(num==1) break;
}
if(num!=1) {
v.push_back(make_pair(num,1));
}
for(ll i=0;i<v.size();i++){
if(v[i].second!=1){
printf("%lld^%lld",v[i].first,v[i].second);
}else printf("%lld",v[i].first);
if(i!=v.size()-1) printf("*");
}
printf("\n");
return 0;
}