以下都是最新版本(3.6.1),以前的版本就不写了。(想要的下面回复我)
主要思路就是:
若 n 为质数,则任意 m<n,m∤n。
(几年前编的,不想再改了,所以没用printf,for,只用了cout,goto,敬请谅解!)
代码如下:
#include <bits/stdc++.h>
#include <conio.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//判断这个键是否按下
#define KEY_UP(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 0 : 1)//判断这个键是否弹起
#define KEY_EVERY(lpkeyState) GetKeyboardState(lpKeyState)//获得所有的256个键(键盘按键、鼠标按键等等)的状态,lpKeyState是指向一个256bit的数组,存放所有键的状态。
#define KEY_NOW(nVirtKey) GetKeyState(nVirtKey)//用于判断nVirtKey的状态。用返回值的最高位表示,最高位为1表示当前键处于down的状态;最高位为0当前键处于up状态。此函数从消息队列中读取消息进行处理。
using namespace std;
int main()
{
aaaa:
unsigned long long a,a_,b[10000],c[10000];
int m;
string x;
char d;
stringstream x_;
b[0]=2;
for(m=0;m<10000;m++)
{
c[m]=0;
}
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请输入数(0~18446744073709551615):"<<endl;
bbbb:
cin>>x;
for(int i=0;i<x.size();i++)
{
if((x[i]!='0')&&(x[i]!='1')&&(x[i]!='2')&&(x[i]!='3')&&(x[i]!='4')&&(x[i]!='5')&&(x[i]!='6')&&(x[i]!='7')&&(x[i]!='8')&&(x[i]!='9'))
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请重新输入数(0~18446744073709551615):"<<endl;
goto bbbb;
}
}
int x___[x.size()],x____[20];
string x_____[x.size()];
stringstream x__[x.size()];
for(int i=0;i<x.size();i++)
{
x_____[i]=x[i];
x__[i]<<x_____[i];
x__[i]>>x___[i];
}
if(x.size()>20)
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请重新输入数(0~18446744073709551615):"<<endl;
goto bbbb;
}
x____[0]=1;
x____[1]=8;
x____[2]=4;
x____[3]=4;
x____[4]=6;
x____[5]=7;
x____[6]=4;
x____[7]=4;
x____[8]=0;
x____[9]=7;
x____[10]=3;
x____[11]=7;
x____[12]=0;
x____[13]=9;
x____[14]=5;
x____[15]=5;
x____[16]=1;
x____[17]=6;
x____[18]=1;
x____[19]=5;
if(x.size()==20)
{
for(int i=0;x___[i]>=x____[i]&&i<20;i++)
{
if(x___[i]>x____[i])
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请重新输入数(0~18446744073709551615):"<<endl;
goto bbbb;
}
}
}
x_<<x;
x_>>a;
a_=a;
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请稍候..."<<endl;
if(a<2)
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl;
cout<<a<<"="<<a<<endl;
}
else
{
for(int i=0;a!=1&&c[i]<sqrt(a_);)
{
if(a%b[i]==0)
{
a=a/b[i];
c[i]++;
}
else
{
if(c[i]==0)
{
b[i]++;
}
else
{
i++;
b[i]=b[i-1]+1;
m=i;
}
}
}
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl;
if(c[0]==1)
{
cout<<a_<<"="<<b[0];
}
else
{
cout<<a_<<"="<<b[0]<<"^"<<c[0];
}
for(int i=1;i<=m;i++)
{
if(c[1]==0)
{
cout<<endl;
goto cccc;
}
else
{
if(c[i]==1)
{
cout<<"×"<<b[i];
}
else
{
cout<<"×"<<b[i]<<"^"<<c[i];
}
}
}
cout<<endl;
}
cccc:
cout<<"是否再来一次?(y/n)"<<endl;
d=getch();
if(d=='y' || d=='Y')
{
system("cls");
goto aaaa;
}
else
{
if(d=='n' || d=='N')
{
system("cls");
cout<<"好的,再见!"<<endl;
}
else
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl;
goto cccc;
}
}
}
相信上面这个程序处理大的质数时会很慢,如果中途不想等了,却只能退出重开,那你可以试试下面这个:
#include <bits/stdc++.h>
#include <conio.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//判断这个键是否按下
#define KEY_UP(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 0 : 1)//判断这个键是否弹起
#define KEY_EVERY(lpkeyState) GetKeyboardState(lpKeyState)//获得所有的256个键(键盘按键、鼠标按键等等)的状态,lpKeyState是指向一个256bit的数组,存放所有键的状态。
#define KEY_NOW(nVirtKey) GetKeyState(nVirtKey)//用于判断nVirtKey的状态。用返回值的最高位表示,最高位为1表示当前键处于down的状态;最高位为0当前键处于up状态。此函数从消息队列中读取消息进行处理。
using namespace std;
int main()
{
aaaa:
system("cls");
unsigned long long a,a_,b[10000],c[10000];
int m;
string x;
char d,e;
stringstream x_;
b[0]=2;
for(m=0;m<10000;m++)
{
c[m]=0;
}
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请输入数(0~18446744073709551615):"<<endl;
bbbb:
cin>>x;
for(int i=0;i<x.size();i++)
{
if((x[i]!='0')&&(x[i]!='1')&&(x[i]!='2')&&(x[i]!='3')&&(x[i]!='4')&&(x[i]!='5')&&(x[i]!='6')&&(x[i]!='7')&&(x[i]!='8')&&(x[i]!='9'))
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请重新输入数(0~18446744073709551615):"<<endl;
goto bbbb;
}
}
int x___[x.size()],x____[20];
string x_____[x.size()];
stringstream x__[x.size()];
for(int i=0;i<x.size();i++)
{
x_____[i]=x[i];
x__[i]<<x_____[i];
x__[i]>>x___[i];
}
if(x.size()>20)
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请重新输入数(0~18446744073709551615):"<<endl;
goto bbbb;
}
x____[0]=1;
x____[1]=8;
x____[2]=4;
x____[3]=4;
x____[4]=6;
x____[5]=7;
x____[6]=4;
x____[7]=4;
x____[8]=0;
x____[9]=7;
x____[10]=3;
x____[11]=7;
x____[12]=0;
x____[13]=9;
x____[14]=5;
x____[15]=5;
x____[16]=1;
x____[17]=6;
x____[18]=1;
x____[19]=5;
if(x.size()==20)
{
for(int i=0;x___[i]>=x____[i]&&i<20;i++)
{
if(x___[i]>x____[i])
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请重新输入数(0~18446744073709551615):"<<endl;
goto bbbb;
}
}
}
x_<<x;
x_>>a;
a_=a;
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl<<"请稍候..."<<endl;
if(a<2)
{
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl;
cout<<a<<"="<<a<<endl;
}
else
{
for(int i=0;a!=1&&c[i]<sqrt(a_);)
{
if(getch()=='0')
{
if(a%b[i]==0)
{
a=a/b[i];
c[i]++;
}
else
{
if(c[i]==0)
{
b[i]++;
}
else
{
i++;
b[i]=b[i-1]+1;
m=i;
}
}
}
else goto aaaa;
}
dddd:
system("cls");
cout<<"质因数分解器"<<endl<<"---------------------------------"<<endl;
if(c[0]==1)
{
cout<<a_<<"="<<b[0];
}
else
{
cout<<a_<<"="<<b[0]<<"^"<<c[0];
}
for(int i=1;i<=m;i++)
{
if(c[1]==0)
{
cout<<endl;
goto cccc;
}
else
{
if(c[i]==1)
{
cout<<"×"<<b[i];
}
else
{
cout<<"×"<<b[i]<<"^"<<c[i];
}
}
}
cout<<endl;
}
cccc:
cout<<"是否再来一次?(y/n)"<<endl;
d=getch();
if(d=='y' || d=='Y')
{
system("cls");
goto aaaa;
}
else
{
if(d=='n' || d=='N')
{
system("cls");
cout<<"好的,再见!"<<endl;
}
else
{
goto dddd;
}
}
}
忘记写了,当弹出“请稍等”时,按下‘0’键即可开始计算,松开即暂停计算,按其他键就能终止本次计算,输入其他数了。
当然,计算速度肯定就慢下来了!
也许能帮你!