用埃拉托色尼篩算法求兩個數最大公約數C++的實現

 
 
#include "stdafx.h"
#include "iostream"
#include <algorithm>
#include <vector>

//使用埃氏篩選法求最大公約數
void sort(int m, int n) ;

int main()
{
	int a, b;

	for (int i = 0; i < 3; )
	{
		std::cout << "請輸入兩個數" << "\n";
		std::cin >> a >> b;

		std::cout << "\n";

		sort(a, b);
		i++;
		if (i == 3)
		{
			std::cout << "是否繼續,輸入n退出或輸入任意數繼續\n";
			char confirm;
			std::cin >> confirm;
			if (confirm != 'n')
				i = 0;
		}
	}
		system("pause");
    return 0;
}

void sort(int m, int n)
{
	int imax, imin;
	int sq;

	//取最大最小值
	imax = std::max(m, n);
	imin = std::min(m, n);

	//構造輔助數組
	bool *isTrue = new bool[imin];
	sq = sqrt(imin) + 1;

	//數組初始化
	for (int i = 2; i <= imin; i++)
	{
		isTrue[i] = true;

	}

	//數組中TRUE爲質數
	for (int i = 2; i <= sq; i++)
	{
		if (isTrue[i])
		{
			for (int j = 2; j <= imin; j++)
			{
				if (j%i == 0 && i != j)
					isTrue[j] = false;
			}
		}
	}
	
	//打印質數
	for (int i = 2; i <= imin; i++)
	{
		if (isTrue[i])
			std::cout << "質數:" << i << std::endl;
	}
	std::cout << "\n\n";
	//求兩數最大公約數
	int s = 1;//最大公約數
	for (int i = 2; i <= imin; )
	{
		//std::cout << i;
		if (isTrue[i])
		{
			if (imax%i == 0 && imin%i == 0)
			{
				imax /= i;
				imin /= i;
				s *= i;
				//std::cout <<imax<<imin<< i;
			}
			else ++i;
		}
		else ++i;
	}

	std::cout <<m<<"和"<<n<<"的最大公約數爲" <<s << "\n";
}
 
 

  

 

簡單的小程序,練習筆記ios

相關文章
相關標籤/搜索