| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1114 人关注过本帖
标题:[求助]ACM 1
只看楼主 加入收藏
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
 问题点数:0 回复次数:14 
[求助]ACM 1

大家看一看吧!还是英文的!
Prime Palindromes

--------------------------------------------------------------------------------

Time limit: 15sec. Submitted: 2363
Memory limit: 32M Accepted: 362

Source : USACO Gateway

--------------------------------------------------------------------------------

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 1000,000,000); both a and b are considered to be within the range .

Input
Line 1: Two integers, a and b

Output
The list of palindromic primes in numerical order, one per line.

Sample Input
5 500

Sample Output
5
7
11
101
131
151
181
191
313
353
373
383

要怎样判断一个数字的首位数字是否相同啊!

例如:101
37573
还有谁知道这道题的大概意思是什么呀!

[此贴子已经被作者于2006-11-9 20:14:12编辑过]

搜索更多相关主题的帖子: ACM 
2006-11-09 18:48
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
if(strcmp(str[i++],str[(n+1)--]) == 0)
为什么不可以这样比较啊!

该学习了。。。
2006-11-09 19:30
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

拿去交,看看行不行

#include<stdio.h>
#include<math.h>
int prime(unsigned long n)
{
unsigned long i=2;
while(i*i<=n)
{
if(n%i==0)
return 0;
i++;
}
return 1;
}

unsigned long pow10(int n)
{
int i;
unsigned long s=1;
for(i=0;i<n;i++)
s*=10;
return s;
}
void prime_palindrome(unsigned long a,unsigned long b)
{
int a_len=(int)log10(a)+1;
int b_len=(int)log10(b)+1;
int n,j;
unsigned long num,i,temp;
for(n=a_len;n<=b_len;n++)
{
if(n%2==0)
{
for(i=pow10(n/2-1);i<pow10(n/2);i++)
{
num=0;
temp=i;
for(j=0;j<n/2;j++)
{
num=num*10+temp%10;
temp/=10;
}
num=i*pow10(n/2)+num;
if(num%2 && num>=a && num<=b && prime(num))
printf("%ld\n",num);
}
}
else
{
for(i=pow10(n/2);i<pow10((n+1)/2);i++)
{
num=0;
temp=i/10;
for(j=0;j<n/2;j++)
{
num=num*10+temp%10;
temp/=10;
}
num=i*pow10(n/2)+num;
if(num%2 && num>=a && num<=b && prime(num))
printf("%ld\n",num);
}
}
}
}
int main()
{
unsigned long a,b;
scanf("%ld%ld",&a,&b);
prime_palindrome(a,b);
return 0;
}

[此贴子已经被作者于2006-11-9 22:05:05编辑过]


2006-11-09 21:47
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

输出a,b之间的回文数.
回文数:从低往高看那个数和原来的数相等.比如131 123321...,其中单个数也是回文数.


倚天照海花无数,流水高山心自知。
2006-11-09 21:53
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 

试了,不对,你能说一说你的大体思路是什么吗?


该学习了。。。
2006-11-10 10:33
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

那个溢出了,稍微改下:

#include<stdio.h>
#include<math.h>
int prime(unsigned long n)
{
unsigned long i=2;
while(i*i<=n)
{
if(n%i==0)
return 0;
i++;
}
return 1;
}

unsigned long pow10(int n)
{
int i;
unsigned long s=1;
for(i=0;i<n;i++)
s*=10;
return s;
}
void prime_palindrome(unsigned long a,unsigned long b)
{
int a_len=(int)log10(a)+1;
int b_len=(int)log10(b)+1;
int n,j;
unsigned long num,i,temp;
for(n=a_len;n<=b_len;n++)
{
if(n%2==0)
{
for(i=pow10(n/2-1);i<pow10(n/2);i++)
{
num=0;
temp=i;
for(j=0;j<n/2;j++)
{
num=num*10+temp%10;
temp/=10;
}
num=i*pow10(n/2)+num;
if(num>b)
return;
if(num%2 && num>=a && prime(num))
printf("%ld\n",num);
}
}
else
{
for(i=pow10(n/2);i<pow10((n+1)/2);i++)
{
num=0;
temp=i/10;
for(j=0;j<n/2;j++)
{
num=num*10+temp%10;
temp/=10;
}
num=i*pow10(n/2)+num;
if(num>b)
return;
if(num%2 && num>=a && prime(num))
printf("%ld\n",num);
}
}
}
}
int main()
{
unsigned long a,b;
scanf("%ld%ld",&a,&b);
prime_palindrome(a,b);
return 0;
}


2006-11-10 10:45
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
这部分的大体意思是什么呀?
unsigned long pow10(int n)
{
int i;
unsigned long s=1;
for(i=0;i<n;i++)
s*=10;
return s;
}
void prime_palindrome(unsigned long a,unsigned long b)
{
int a_len=(int)log10(a)+1;
int b_len=(int)log10(b)+1;
int n,j;
unsigned long num,i,temp;
for(n=a_len;n<=b_len;n++)
{
if(n%2==0)
{
for(i=pow10(n/2-1);i<pow10(n/2);i++)
{
num=0;
temp=i;
for(j=0;j<n/2;j++)
{
num=num*10+temp%10;
temp/=10;
}
num=i*pow10(n/2)+num;
if(num%2 && num>=a && num<=b && prime(num))
printf("%ld\n",num);
}
}
else
{
for(i=pow10(n/2);i<pow10((n+1)/2);i++)
{
num=0;
temp=i/10;
for(j=0;j<n/2;j++)
{
num=num*10+temp%10;
temp/=10;
}
num=i*pow10(n/2)+num;
if(num%2 && num>=a && num<=b && prime(num))
printf("%ld\n",num);
}
}
}
}

该学习了。。。
2006-11-10 10:49
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
呵呵!通过了!你能给我讲一下大体思路是什么么?

该学习了。。。
2006-11-10 10:51
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

大概的意思是构造回文数,不能挨个数判断,那样会超时

我们把回文数分为2类:(便于分别处理)
一.位数为奇数:如3 ,313,12321等
对于12321我们可以通过123构造
(1)123/10=12;
(2)把12颠倒,变为21
(3)123*100+21=12321
对于5位的回文数,通过下边的for循环就能全部构造出来
for(i=100;i<1000;i++)
{
num=0;
temp=i/10;
for(j=0;j<2;j++)
{
num=num*10+temp%10;
temp/=10;
}
num=i*100+num;
}
二.位数为偶数:如33,3443,900009等
  对于123321我们可以通过123构造
(1)把123颠倒,变为321
(2)123*1000+321=123321


函数unsigned long pow10(int n);是求10的n次方
int a_len=(int)log10(a)+1;是求a的位数
函数int prime(unsigned long n);是判断质数



2006-11-10 11:06
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

对了,你是怎么想的啊?
把你的想法说出来看看.
我的这个想法不一定很好.
我的那个程序算5-10亿之间的所有数,大概需要5-6秒


2006-11-10 11:16
快速回复:[求助]ACM 1
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016433 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved