题解 P1619 【解一元二次方程的烦恼】
lizhiqing1221 · · 题解
点我看题
思路:显然是模拟题,没什么好说的。
方法(以读入一组数据为例):
细节:
代码:
#include<bits/stdc++.h>
#define long long LL//个人习惯
using namespace std;
char a[1005];//a是要输入的字符串
LL n;//n是从输入的字符串找出的数字
LL check(LL x)//check函数是用于判断数字情况的(1代表太大,2是质数,3是合数,4代表太小)
{
if(x>40000000)return 1;//太大了(大于40000000)
if(x<2)return 4;//太小了(小于2)
for(LL i=2;i*i<=x;i++)//判断质数(基本功)
{
if(x%i==0)//有i这个因子
{
return 3;//是合数
}
}
return 2;//是质数
}
LL c(LL x)//c函数是用于计算10^x的
{
LL y=1;//y是储存的结果
for(LL i=1;i<=x;i++)//循环x次
{
y*=10;//每次乘10
}
return y;//返回结果
}
LL find(LL x)//find函数是用于从字符串中找出数字的
{
LL y=0,ok=0;//y是当前位数,ok是用于判断还有没有数字
for(LL i=x;i>=1;i--)//倒序遍历
{
if(a[i]>='0'&&a[i]<='9')//是一个数字
{
LL z=(a[i]-'0')*c(y);//z是把当前这一位转成数字后的结果
n+=z;//加上当前这一位
y++;//位数+1
ok=1;//有数字
}
}
if(ok)return 1;//有数字,返回1
else return 0;//没有数字,返回0
}
int main()
{
while(gets(a+1))//用gets可以读入一行
{
cout<<"Enter the number=\n";//题目要求
LL l=strlen(a+1);//l是字符串长度
n=0;//n初始化
if(find(l))//如果找得到数字
{
LL p=check(n);//p是储存n的范围的
if(p==1)cout<<"Prime? No!\nThe number is too large!\n\n";//数字太大
else if(p==2)cout<<"Prime? Yes!\n\n";//是质数
else if(p==3)//是合数
{
cout<<"Prime? No!\n"<<n<<"=";//不是质数
for(LL i=2;i*i<=n;i++)//分解质因数(基本功)
{
LL t=ok=0;//t是i这个因子的次数,ok是是否有这个因子
while(n%i==0)//如果还有i这个因子
{
ok=1;//有i这个因子
n/=i;//除去i
t++;//次数+1
}
if(ok==1)//如果有这个因子
{
if(n>1)cout<<i<<"^"<<t<<"*";//不是最后一个因子
else cout<<i<<"^"<<t;//是最后一个因子
}
}
if(n>1)cout<<n<<"^"<<1;//如果n还不等于0,那就还有一个因子,就是此时的它本身
cout<<"\n\n";
}
else cout<<"Prime? No!\n\n";//数字太小
}
else return 0;//如果找不到数字了,就结束程序
}
return 0;
}
修改记录: