上机内容:编制一个返回值为bool型的函数isPrimer(),用于判断参数是否为素数,isPalindrome()用于判断参数是否是回文数。
调用函数回答以下问题(可以分别编制几个程序完成,也可以在一个main()函数中完成,输出时,用明显的提示语,说明正在完成哪个任务。)
(1)输出10000以内的所有素数。
(2)输出10000以内的所有回文数。
(3)输出10000以内的所有回文素数。
(4)拓展(选做):若一个素数的反序数仍为素数,则称它为可逆素数。求10000以内的所有可逆素数,在上面的代码基础上拓展。
上机目的:用函数解决素数回文数问题
我的程序:
运行结果:
调用函数回答以下问题(可以分别编制几个程序完成,也可以在一个main()函数中完成,输出时,用明显的提示语,说明正在完成哪个任务。)
(1)输出10000以内的所有素数。
(2)输出10000以内的所有回文数。
(3)输出10000以内的所有回文素数。
(4)拓展(选做):若一个素数的反序数仍为素数,则称它为可逆素数。求10000以内的所有可逆素数,在上面的代码基础上拓展。
上机目的:用函数解决素数回文数问题
我的程序:
/*
* 程序的版权和版本声明部分:
* Copyright (c) 2013, 青岛农业大学理信学院
* All rights reserved.
* 文件名称:函数解决素数回文问题.cpp
* 作 者:幻影行者
* 完成日期:2013 年 8 月 2 日
* 版 本 号:v1.0
* 对任务及求解方法的描述部分:
* 输入描述:无
* 问题描述:编制一个返回值为bool型的函数isPrimer(),用于判断参数是否为素数,isPalindrome()用于判断参数是否是回文数。
* 调用函数回答以下问题(可以分别编制几个程序完成,也可以在一个main()函数中完成,输出时,用明显的提示语,说明正在完成哪个任务。)
* (1)输出1000以内的所有素数。
* (2)输出1000以内的所有回文数。
* (3)输出1000以内的所有回文素数。
* (4)拓展(选做):若一个素数的反序数仍为素数,则称它为可逆素数。求1000以内的所有可逆素数,在上面的代码基础上拓展。
* 程序输出:略
* 问题分析:略
* 算法设计:略
*/
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int); //函数声明部分
bool isPalindrome(int);
int main() //主函数部分
{
int i,count=0,n=1000;
//输出1000以内的所有素数
cout<<n<<"以内的所有素数:"<<endl;
for(i=1;i<=n;++i)
{
if(isPrime(i))
{
++count;
cout<<i<<"\t";
if(count%10==0)
cout<<endl;
}
}
cout<<endl;
system("pause"); //为了让程序阶段性输出(即一步一步输出素数,回文等),利用系统函数让程序暂停输出,按任意键后继续
//输出1000以内的所有回文数
count=0; //为了能够实现“每输出十个数就换行”,故每次都让count=0,重新开始计算
cout<<n<<"以内的所有回文数:"<<endl;
for(i=1;i<=n;++i)
{
if(isPalindrome(i))
{
++count;
cout<<i<<"\t";
if(count%10==0)
cout<<endl;
}
}
cout<<endl;
system("pause");
//输出1000以内的所有回文素数
count=0;
cout<<n<<"以内的所有回文素数:"<<endl;
for(i=1;i<=n;++i)
{
if(isPrime(i)&&isPalindrome(i))
{
++count;
cout<<i<<"\t";
if(count%10==0)
cout<<endl;
}
}
cout<<endl;
system("pause");
//输出1000以内的所有可逆素数
cout<<n<<"以内的所有可逆素数:"<<endl;
count=0;
for(i=1;i<=n;++i)
{
if(isPrime(i))
{ //计算素数的逆序数
int t=i;
int m=0;
while(t>0)
{
m=m*10+t%10;
t=t/10;
}
bool prime_ni=true; //标志是否可逆
for(int k=2;k<=sqrt(m);++k) //判断是否可逆,如果素数的逆序数仍是素数,则为可逆素数
{
if(m%k==0)
{
prime_ni=false;
break;
}
}
if(prime_ni)
{
++count;
cout<<i<<"\t";
if(count%10==0)
cout<<endl;
}
}
}
cout<<endl;
return 0;
}
//函数定义部分
bool isPrime(int x) //函数定义:判断是否素数
{
bool prime;
if(x==1) //先处理特殊的“1”和“2”
prime=false; //1既不是素数也不是合数,在此作为不是素数处理
else if(x==2)
prime=true; //2是素数,prime=true,之所以要特殊处理,是因为当n=2时不符合第二重循环中除数i从2开始的条件
else
{
for(int i=2;i<=sqrt(x);++i)
{
prime=true;
if(x%i==0)
{
prime=false;break;
}
}
}
return prime;
}
bool isPalindrome(int n) //函数定义:判断是否回文
{
bool isPalindrome=false;
int m=0,t;
t=n; //先将这个数n赋给另一个变量,处理t即是处理这个数
while(t>0)
{
m=m*10+t%10; //通过对t取余得到个位数,乘10累加实现重新组合成一个数
t=t/10; //对10取整配合以上取余实现从后往前得到各个位上的数
}
if(n==m)
isPalindrome=true;
return isPalindrome;
}
运行结果: