Ⅰ c语言问题 【函数与过程】回文素数
【题目】:
题目:如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,从给出的数据中统计出既是回文数又是素数的数(<109)。
【思路分析】:
首先,你输入的是整数(x),计算机不能像人脑一样直接得到每个数位(数组a[10])。
所以,要先判断数位(n),然后只要数位数组中a[i]=a[n-i]即可。
关于素数,设置一个for循环,只要从1到x都不存在能整除x的数,就是素数了。
【代码如下】:
#include <stdio.h>
#include<windows.h>
int main()
{
int
a[1000];
int
n;//输入整数的个数
printf("请输入整数的个数:\n");
scanf("%d",&n);
int
i;
printf("请输入这%d个整数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int
result_1;//值为1表示是回文数,值为0表示不是。
int
result_2;//值为1表示是质数,值为0表示不是。
int
palindrome(int y);//判断回文数的函数
int
prime(int y);//判断质数的函数
int
y;//y是要代入函数里的参数
int
num=0;//num用来计总共有几个符合条件的数
int
b[1000];//b[1000]是符合要求的数组
for(i=0;i<n;i++)
{
result_1=0;//先使初值=0。
result_2=0;
y=a[i];
result_1=palindrome(y);
result_2=prime(y);
if((result_1==1)&&(result_2==1))
{
b[num]=a[i];
num++;
}
}
if(num>0)
{
printf("总共有%d个既是回文数又是质数的数:\n",num);
for(i=0;i<num;i++)
printf("
%d",b[i]);
printf("\n");
}
else
printf("输入的整数均不符合要求\n");
system("pause");
return 0;
}
int palindrome(int y)
{
int
a[10];//a[10]表示y的各个数位的值
int
i=0;
while(y>=1)
{
a[i]=y%10;//y%10就得到y的末位
y=y/10;//让倒数第二位变成了末位
i++;//i最后又自加了一次,所以i就表示y有多少位
}
int
j;
int
z=1;
for(j=0;j<=(i-1)/2;j++)
{
if(a[j]!=a[(i-1)-j])
{
z=0;
break;
}
else
continue;
}
return
(z);
}
int prime(int y)
{
int
i,z;
z=1;
for
(i=2;i<y;i++)
{
if(y%i==0)
{
z=0;
break;
}
else
continue;
}
return(z);
}
【测试数据】:
n = 168
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163
167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271
277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397
401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521
523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647
653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787
797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929
937 941 947 953 967 971 977 983 991 997
【测试结果】:
请输入整数的个数:
168
请输入这168个整数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
59 61 67 71 73 79 83 89 97 101 103 1
07 109 113 127 131 137 139 149 151 157 163
167 173 179 181 191 193 197 199 211 2
23 227 229 233 239 241 251 257 263 269 271
277 281 283 293 307 311 313 317 331 3
37 347 349 353 359 367 373 379 383 389 397
401 409 419 421 431 433 439 443 449 4
57 461 463 467 479 487 491 499 503 509 521
523 541 547 557 563 569 571 577 587 5
93 599 601 607 613 617 619 631 641 643 647
653 659 661 673 677 683 691 701 709 7
19 727 733 739 743 751 757 761 769 773 787
797 809 811 821 823 827 829 839 853 8
57 859 863 877 881 883 887 907 911 919 929
937 941 947 953 967 971 977 983 991 9
97
总共有20个既是回文数又是质数的数:
2 3
5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
请按任意键继续. . .
Ⅱ 用c语言求10到9999之间即是素数,又是回文数的数的个数
//#include"stdafx.h"//vc++6.0加上这一行.
#include"stdio.h"
intprime(intn){
inti;
if(n>2&&!(n&1)||n<2)return0;
for(i=3;i*i<=n;i+=2)
if(!(n%i))return0;
return1;
}
intmain(void){
intn,t,m,sum;
for(sum=0,n=11;n<10000;n+=2)
if(prime(n)){
for(t=0,m=n;m;(t*=10)+=m%10,m/=10);
if(n==t)sum++;
}
printf("Atotalof%d. ",sum);
return0;
}
Ⅲ c++编程输入三位数中所有既是素数又是回文数
#include<iostream>
using namespace std;
/*判断是否为素数*/
bool judgess(const int& number){
for(int i=2;i<=number/2;i++)
if(number%i==0)
return false;
return true;
}
int main(int argc,char* argv[]){
for(int i=1;i<10;i+=2)
{
for(int j=0;j<10;j++)
{
int tmp=i*100+i+10*j;
if(judgess(tmp))
cout<<tmp<<endl;
}
}
return 0;
}
正好看见了,随手写的。没仔细测试将就着用吧
Ⅳ c语言编程 求大于200的最小自然数,该数既是素数,又是回文数
#include <iostream>
using std::cout;
using std::endl;
const unsigned int maxNum = 100000000;
const unsigned int priArrSize = 1000000;
unsigned int priArray[ priArrSize ];
unsigned int priCal = 0;
/** 初始化素数数组的前n位 **/
void initPriArray(unsigned int initSize);
/** 测试一个数是否为回文数 **/
bool testPalin(unsigned int testNumber);
/** 得到十进制的逆序数 **/
unsigned int converse(unsigned int number);
/** 测试一个数是否为素数 **/
bool testPrime(unsigned int testNumber);
int main()
{
initPriArray(200);
for (int i = 200; i != maxNum + 1; ++i) {
if (testPrime(i)) {
if (testPalin(i)) {
cout << i << endl;
}
}
}
return 0;
}
void initPriArray(unsigned int iSize)
{
unsigned int lastPri = priArray[ priCal ];
if (lastPri >= iSize) {
return;
}
unsigned int testQuan = iSize - lastPri;
for (unsigned int i = lastPri + 1; i != iSize + 1; ++i) {
testPrime(i);
}
}
bool testPalin(unsigned int a)
{
if (a != converse(a))
return false;
else
return true;
}
unsigned int converse(unsigned int a)
{
unsigned int temp = a;
unsigned int conv = 0;
unsigned int i = 10;
while (a / i) {
i *= 10;
}
i /= 10;
do {
conv += (temp % 10) * i;
temp /= 10;
i /= 10;
} while (temp);
return conv;
}
bool testPrime(unsigned int a)
{
if (a < 2)
return false;
for (unsigned int i = 0; i != priCal; ++i) {
if (a % priArray[ i ] == 0) {
return false;
}
}
priArray[ priCal ] = a;
++priCal;
return true;
}
速度貌似还可以,可以求比较大的自然数范围内的代码
Ⅳ 用C语言:求10--1000中,所有既是回文数又是素数的打印
int
i,j,m=0
for
(i=10;i<=1000;i++)
{for
(j=2;j<i-1;j++)
if
(i%j==0)
break;
if(i>=j+1)
a[m++]=i;
"将10-1000所有素数存于数组A中"
}
for
(i=0;i<=m;i++)
{判断a[i]是否是回文数,如果是则输出
}
-------------------------------------------
*问题分析与算法设计
所谓回文素数是指,对一个整数n从左向右和从由向左读其结果值相同且是素数,即称n为回文素数。所以本题的重点不是判断素数的方法,而是求回文整数。构造回文数的方法很多,这里仅介绍一种最简单的算法。实现思路是先求出一个整数的回文数,再判断是否为素数。
不超过1000的回文数包括二位和三位的回文数,我们采用穷举法来构造一个整数并求与其对应的反序数,若整数与其反序数相等,则该整数是回文数。
*程序说明与注释
#i
nclude<stdio.h>
int
a(int
n)
int
main()
{
int
i,j,t,k,s;
printf("Following
are
palindrome
primes
not
greater
than
1000:\n");
for(i=0;i<=9;++i)
//穷举第一位
for(j=0;j<=9;++j)
//穷举第二位
for(k=0;k<=9;++k)
//穷举第三位
{
s=i*100
+
j*10
+
k;
//计算组成的整数
t=ik*100
+
j*10
+
i;
//计算对应的反序数
if(i
==
0
&&
j==0)
//处理整数的前两位为0的情况
{
t/100;
}
else
if(i
==0)
//处理整数的第一位为0的情况
{
t/10;
}
if(s.10
&&
s==t
&&
a(s))
//若大于10且为回文素数,则输出
{
printf("%d\t",s);
}
}
return
0;
}
//判断参数n是否为素数
int
a(int
n)
{
int
i;
for(i=2;i<(n-1)/2;+=i)
{
if(n%i
==
0)
return
0;
}
return
1;
}
*运行结果
Following
are
palindrome
primes
not
greater
than
1000:
11
101
131
151
181
191
313
353
373
383
727
787
797
919
929
Ⅵ C语言:从给出的数据中统计出既是回文数又是素数的数
#include<stdio.h>
inthw(intn)
{inty=0,n1;
n1=n;
for(;n;n/=10)y=y*10+n%10;
returny==n1;
}
intprime(intn)
{inti;
for(i=2;i*i<=n;i++)
if(n%i==0)return0;
returnn>1;
}
intmain()
{intn,c='',num=0;
scanf("%d%c",&n,&c);
while(1)
{if(hw(n)&&prime(n))
num++;
if(c=='
')break;
scanf("%d%c",&n,&c);
}
printf("%d
",num);
return0;
}
Ⅶ 回文素数C++
#include <stdio.h>
int isprime(long n)
{
long i;
if(n<2)
return 0;
for(i=2;i*i<=n;++i)
if(n%i==0)
return 0;
return 1;
}
int ispali(long n)
{
long t,m;
for(t=n,m=0;t;t/=10)
m=m*10+t%10;
return m==n;
}
int main()
{
long n,cnt;
for(cnt=0;scanf("%ld",&n)==1&&n>0;)
{
if(isprime(n))
cnt++;
}
printf("%ld ",cnt);
return 0;
}