个人学习记录,代码难免不尽人意。

 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;
}
   
   



















