您的位置:首页 > 其它

pku1365 整数分解

2010-07-13 14:19 190 查看
http://acm.pku.edu.cn/JudgeOnline/problem?id=1365

题意:很难理解,就是给出连续的两个数pi,ei,pi表示一个素数,ei表示pi的次幂,s就是这些素数幂的积,例如s=pi^ei(i=1,2,3...)。要求你先算出s,然后再把s-1分解成输入的形式。

分析:每一行的输入pi,ei没有规定是多少项,这就很难处理算出每一行的s的值,但是通过此题也学会了一种处理这中情况的表达,在文章的最后会贴下别人的处理代码;接下来就是简单的整数分解了。

#include<iostream>
#include<cmath>
using namespace std;
__int64 k;
int res[100][2];
void init()
{
int pi, ei;
k = 1;
while(1)
{
while((!isdigit(cin.peek())) && cin.peek() != '/n')	//如果不是数字和换行,'/n'不能忽略
cin.ignore();		//忽略其他非法字符
if(cin.peek() == '/n')	//如果是换行,退出去处理第i行的情况;
break;
scanf("%d%d",π,&ei);
k *= pow(pi*1.0, ei);
}
}
int fun()	//把k-1分解成幂的形式。
{
int i,n,sum=0;
n = k = k-1;
//printf("%d/n",k);
for(i=2; i<=n; i++)
{
if(k==1)
break;
if(k % i == 0)
{
sum++;
res[sum][1] = i;	//存放因子
res[sum][0] = 0;	//存放次幂
while(k % i == 0)
{
res[sum][0]++;	//次幂++
k /= i;
}
}
}
return sum;		//返回因子总数。
}
int main()
{
int sum;
while(1)
{
while(!isdigit(cin.peek()))		//如果不是数字,则忽略其他非法字符
cin.ignore();
if(cin.peek() == '0')	//如果是0,则结束。
return 0;
init();
memset(res,0,sizeof(res));
sum = fun();
for(int i=sum; i>=1; i--)
{
if(i==1)
printf("%d %d/n",res[i][1],res[i][0]);
else
printf("%d %d ",res[i][1],res[i][0]);
}
//printf("/n");
}
return 0;
}


下面是处理的情况:

#include   <iostream>
#include   <cctype>
using   namespace   std;
int   main()
{
int   num,   n=0;           //num存储输入的数字,n用来统计每行数字个数
while(cin.peek()!=EOF)
{
if(isdigit(cin.peek()))       //是数字则读入,计数加一
{
cin> > num;
++n;
}
if(cin.peek()== '/n ')             //是 '/n '计数清零
{
cout < < "此行数字个数为 " < <n < <endl;
n=0;
}
cin.ignore();                           //忽略其他非法字符
}
return   0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: