题目链接:http://ac.jobdu.com/index.php
(1)很麻烦的一题
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
char s[200];
int get_a(int m,int i,char str[])
{
int a;
if((str[i-1]<'0')|(str[i-1]>'9'))///x^2前面没数字
{
a=m;
if(str[i-1]=='-') a=(-a);
}
else
{
int k=i-1,sum=0,flag=0;///标记是否前面为负号
while((str[k]<='9')&(str[k]>='0')) k--;
if(str[k]=='-') flag=1;
while(k<i-1)
sum=10*sum+str[++k]-'0';
a=sum*(m);
if(flag) a=(-a);
}
return a;
}
int main()
{
int a,b,c;///分别记录x,x^2,和常数项的系数
while(scanf("%s",s)!=EOF)
{
a=0,b=0,c=0;
int len=strlen(s);
int j;
for(j=0;j<len;j++)
if(s[j]=='=')
break;
for(int i=0;i<len;i++)
if(s[i]=='^')///我没有考虑有两个不同的x^2,通过a+=就可以了
{
if(i==1) a=1;///如果x^2在开头
else
{
if(i>j)///x^2在等号右边
{
a+=get_a(-1,i-1,s);
}
else
{
a+=get_a(1,i-1,s);
}
}
}
else if((s[i]=='x')&(s[i+1]!='^'))///x项
{
if(i>j)///x在等号右边
{
b+=get_a(-1,i,s);
}
else
{
b+=get_a(1,i,s);
}
}
for(int i=0;i<len;i++)
if(s[i]>='0'&s[i]<='9')///先运算大于小于号
{
if(i==0)
{
int k,sum=0;
for(k=i;s[k]>='0'&s[k]<='9';k++)
{
sum=sum*10+s[k]-'0';
}
if(s[k]!='x')//如果不是x的系数的话
{
c+=sum;
}
i=k-1;
}
else if(s[i-1]=='^') i++;///如果碰到的是平方
else //如果在中间碰到常数项
{
int k,sum=0;
for(k=i;s[k]>='0'&s[k]<='9';k++)
{
sum=sum*10+s[k]-'0';
}
///修改过
if(s[i-1]=='-')
sum=(-sum);
if(s[k]!='x')
{
if(i<j)
c+=sum;
else c+=sum*(-1);//可能有错
}
i=k-1;
}
}
float x1,x2;
if(b*b-4*a*c>=0)
{
x1=(-b+sqrt(b*b-4*a*c))/(2*a),x2=(-b-sqrt(b*b-4*a*c))/(2*a);
if(x1>x2) swap(x1,x2);
printf("%.2f %.2f\n",x1,x2);
}
else printf("No Solution\n");
}
return 0;
}
(2)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int n,a;
const int maxn=1000+10;
int prime[maxn],nprime[maxn],aprime[maxn];
int primeset[168];
void getprime()
{
for(int i=2;i*i<=1000;i++)
if(!prime[i])
{
for(int j=2;j*i<=1000;j++)
prime[j*i]=1;
}
int k=0;
for(int i=2;i<=1000;i++)
if(!prime[i])
{
primeset[k++]=i;
}
}
void depart(int i,int naprime[])
{
for(int j=0;j<168;j++)
if(!(i%primeset[j]))///如果i能整出第j个质数
{
int k=i;
while(!(k%primeset[j]))
{
k/=primeset[j];
naprime[primeset[j]]++;///nprime或者aprime中某质因数+1
/// printf("%d\n",primeset[j]);
}
}
}
int main()
{
getprime();
///depart(1350,nprime);
while(scanf("%d%d",&n,&a)!=EOF)
{
int k=10000;
memset(nprime,0,sizeof(nprime));
memset(aprime,0,sizeof(aprime));
for(int i=2;i<=n;i++)
depart(i,nprime);
depart(a,aprime);
for(int i=2;i<=max(n,a);i++)
if(aprime[i])
{
k=min(k,nprime[i]/aprime[i]);
}
printf("%d\n",k);
}
return 0;
}