两个器
  • 板块灌水区
  • 楼主Ruoyuzhou
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/10 14:10
  • 上次更新2024/3/10 16:22:49
查看原帖
两个器
1287878
Ruoyuzhou楼主2024/3/10 14:10

两 22 个质因数分解器

以下都是最新版本(3.6.1),以前的版本就不写了。(想要的下面回复我)

主要思路就是:

若 nn 为质数,则任意 m<n,m∤nm<n,m\nmid 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’键即可开始计算,松开即暂停计算,按其他键就能终止本次计算,输入其他数了。

当然,计算速度肯定就慢下来了!

也许能帮你!

2024/3/10 14:10
加载中...