1. 程式人生 > >程式基本演算法習題解析 求出100之內的所有可逆素數

程式基本演算法習題解析 求出100之內的所有可逆素數

題目:

可逆素數是指一個素數將其各位數字的順序倒過來構成的反序數也是素數,求出100之內的所有可逆素數。

附上程式碼:

// Chapter5_4.cpp : Defines the entry point for the application.
// 求出100之內的所有可逆素數
// 可逆素數是指一個素數將其各位數字的順序倒過來構成的反序數也是素數

#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
const int N = 99;
//判斷是否為素數,是素數返回1,不是素數返回0
int isPrime(int x)
{
	//因為後面的for迴圈裡面有sq,i的初始值又是從2開始,因此將2,3單獨進行判斷
	if(x==2 || x==3)  
		return 1;
	else
	{
		int sq = sqrt(x);
		for(int i=2;i<=sq;i++)
		{
			if(x%i == 0)
				return 0;
		}
		return 1;
	}
}
//判斷是否為可逆素數,是可逆素數返回1,不是可逆素數返回0
//要求輸入為素數
int isReverPrime(int x)
{
	if((x/10) == 0) //如果是一位數
		return 1; //是可逆素數
	else
	{
		int shi,ge,reverse;
		shi = x/10;  //提取十位數
		ge = x - shi*10;  //提取各位數
		reverse = ge*10+shi;
		//判斷逆數是否為素數
		if(isPrime(reverse))
			return 1;
		else
			return 0;
	}
}
//主函式
int main()
{
	//宣告一個二維陣列,第一行放值,第二行放素數判斷情況(是素數賦為1,不是素數賦為0)
	int a[2][N+1],i; 
	for(i=0;i<N+1;i++)
		a[0][i] = i;
	for(i=2;i<N+1;i++)
	{
		//如果是素數
		if(isPrime(a[0][i]))
		{
			a[1][i] = 1; //對應的下一行位置置1
			if(a[1][i])
				if(isReverPrime(a[0][i])) //如果是可逆素數
					cout << a[0][i] << ' '; //輸出可逆素數
		}
	}
	cout << endl;
	system("pause");
	return 0;
}

先寫一個判斷是否為素數的函式,再寫一個判斷該素數是否為可逆素數的函式(注意輸入前提為素數)。

這個程式比較有特色的地方是聲明瞭一個二維陣列(兩行,第一行放需要判斷的數字,第二行放素數的判斷結果:素數-1,非素數-0),第二行相當於常用的flag標誌,記憶體佔用會多一點,但是理解起來簡單一些。

執行結果如下: