简单ACM(C++)问题
发布网友
发布时间:2023-11-22 17:18
我来回答
共3个回答
热心网友
时间:2024-12-06 11:44
12=2^2*3^1
12的因子数(2+1)*(1+1)=6个
思路如下:
程序初始化先求素数表
然后再开始要求用户输入数据,比如输入24,将其分解为24=2*2*2*2*3=2^3*3
2为3次方,3为1次方,则24的因子数为(3+1)*(1+1)=8种。
/****************代码如下*******************/
#include <iostream>
#include <math.h>
#define size 1024
using namespace std;
int pn[size];//存储1024个素数,应该够用了
int factor[size/4];//存储因子个数,统一初始化为0
void getPN(int* a,int n){
if(n<1)return;
int length=0;
a[length++]=2;
for(int i=3;i<n;i++){
bool nis=false;
for(int tt=0;a[tt]<=sqrt(i);tt++)if(i%a[tt]==0){
nis=true;
break;
}
if(nis==false){
a[length]=i;
length++;
}
}
}
void getFN(int number){
int pos=0;
for(int i=0;i<size&&number>1;i++){
factor[pos]=0;
bool is=false;
while(number%pn[i]==0){
factor[pos]+=1;
number/=pn[i];
is=true;
cout<<pn[i];
}
if(is==true){
pos++;
}
}
factor[pos]=0;
}
int main(){
getPN(pn,size);
int n;
int buf[size];
while(true){
cin>>n;
getFN(n);
int temp=1;
for(int i=0;factor[i]!=0;i++)temp*=factor[i]+1;
cout<<n<<":"<<temp<<endl;
};
return 0;
}
热心网友
时间:2024-12-06 11:45
我认为不必用到素数表,只用循环语句就行了。代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,n,count;
cout<<"input one number(input 0 to stop):"<<endl;
cin>>n;
while(n!=0)
{
count=0;
for(i=1;i<=sqrt(n);i++)
if(n%i==0)
count++;
cout<<n<<':'<<2*count<<endl;
cout<<"input next number:"<<endl;
cin>>n;
}
return 0;
}追问超时了16MS
追答之所以超时,是程序里面夹杂了输入,抛开输入的时间,程序并没有超时。以下是改进的代码:
#include
#include
#include
#include
using namespace std;
int main()
{
clock_t start,end;
int i,j,n,count;
vector data;
cout>n;
while(n!=0)
{
data.push_back(n);
cin>>n;
}
start=clock();
for(i=0;i<data.size();i++)
{
count=0;
for(j=1;j<=sqrt(data[i]);j++)
if(data[i]%j==0)
count++;
cout<<data[i]<<':'<<2*count<<endl;
}
end=clock();
cout<<"cost time:"<<double(end-start)/CLOCKS_PER_SEC<<endl;
return 0;
}
输入例子:
热心网友
时间:2024-12-06 11:45
printf不是C++的?追问恩,是C里面的,我们课本都不教的……
追答那你要搞ACM的话,最好用scanf 和printf 这两个函数比 cin 和cout 快
参考资料:http://zhidao.baidu.com/question/261136628.html