[usaco]超级素数 superprime

偶也,纪念一次成功,首先发测试结果

USER: Ma yunlei [yunleis2]
TASK: sprime
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 3028 KB]
   Test 2: TEST OK [0.000 secs, 3028 KB]
   Test 3: TEST OK [0.000 secs, 3028 KB]
   Test 4: TEST OK [0.000 secs, 3028 KB]
   Test 5: TEST OK [0.000 secs, 3028 KB]

All tests OK.
YOUR PROGRAM ('sprime') WORKED FIRST TIME!  That's fantastic
-- and a rare thing.  Please accept these special automated
congratulations.

Here are the test data inputs:

------- test 1 ----
4
------- test 2 ----
5
------- test 3 ----
6
------- test 4 ----
7
------- test 5 ----
8

Keep up the good work!

Thanks for your submission!

问题:
Superprime Rib
Butchering Farmer John's cows always yields the best prime rib. You can tell prime ribs by looking at the digits lovingly stamped across them, one by one, by FJ and the USDA. Farmer John ensures that a purchaser of his prime ribs gets really prime ribs because when sliced from the right, the numbers on the ribs continue to stay prime right down to the last rib, e.g.:

     7  3  3  1

The set of ribs denoted by 7331 is prime; the three ribs 733 are prime; the two ribs 73 are prime, and, of course, the last rib, 7, is prime. The number 7331 is called a superprime of length 4.

Write a program that accepts a number N 1 <=N<=8 of ribs and prints all the superprimes of that length.

The number 1 (by itself) is not a prime number.

PROGRAM NAME: sprime
INPUT FORMAT
A single line with the number N.
SAMPLE INPUT (file sprime.in)
4

OUTPUT FORMAT
The superprime ribs of length N, printed in ascending order one per line.
SAMPLE OUTPUT (file sprime.out)
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393

我的程序:
/*
ID: yunleis2
PROG: sprime
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

int single[]={
 1,3,5,7,9
};
vector<int > v;
void check(int depth,int num);
bool isprime(int num);
void quicksort(int * a,int p,int r);
int main()
{
 fstream fin("sprime.in",ios::in);
 int N;
 fin>>N;
 int num;
 check(N,0);
 int *result=new int[v.size()];
 for(int i=0;i<v.size();i++)
 {
  result[i]=v.at(i);
 }
 quicksort(result,0,v.size()-1);
 fstream fout("sprime.out",ios::out);
 for(int i=0;i<v.size();i++)
  fout<<result[i]<<endl;
 

}
bool isprime(int num)
{
 if(num==1)
  return false;
 if(num==2)
  return true;
 for(int i=2;i*i<=num;i++)
 {
  if(num%i==0)
   return false;
 }
 return true;
}
void check(int depth,int num)
{
  if(depth==0)
 {
  v.push_back(num);
  return;
 }
 for(int i=0;i<(sizeof(single)/sizeof(int));i++)
 {
  int newnum=num*10+single[i];
  if(isprime(newnum))
   check(depth-1,newnum);
 }
 if(num==0)
  check(depth-1,2);
}

void swap(int * x,int * y)
{
 int t=*x;
 *x=*y;
 *y=t;
}
int partition(int* a,int p,int r)
{
 int i=p-1;
 int x=a[r];
 for(int j=p;j<r;j++)
 {
  if(a[j]<=x)
  {
   i++;
   swap(a+j,a+i);
  }
 }
 swap(a+i+1,a+r);return i+1;
}
void quicksort(int * a,int p,int r)
{
 if(p<r)
 {
  int q=partition(a,p,r);
  quicksort(a,p,q-1);
  quicksort(a,q+1,r);
 }
}

usaco的解法:
We use a recursive search to build superprimes of length n from superprimes of length n-1 by adding a 1, 3, 7, or 9. (Numbers ending in any other digit are divisible by 2 or 5.) Since there are so few numbers being tested, a simple primality test suffices.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

FILE *fout;

int
isprime(int n)
{
 int i;

 if(n == 2)
  return 1;

 if(n%2 == 0)
  return 0;

 for(i=3; i*i <= n; i+=2)
  if(n%i == 0)
   return 0;

 return 1;
}

/* print all sprimes possible by adding ndigit digits to the number n */
void
sprime(int n, int ndigit)
{
 if(ndigit == 0) {
  fprintf(fout, "%d\n", n);
  return;
 }

 n *= 10;
 if(isprime(n+1))
  sprime(n+1, ndigit-1);
 if(isprime(n+3))
  sprime(n+3, ndigit-1);
 if(isprime(n+7))
  sprime(n+7, ndigit-1);
 if(isprime(n+9))
  sprime(n+9, ndigit-1);
}

void
main(void)
{
 int n;
 FILE *fin;

 fin = fopen("sprime.in", "r");
 assert(fin != NULL);
 fout = fopen("sprime.out", "w");
 assert(fout != NULL);

 fscanf(fin, "%d", &n);

 sprime(2, n-1);
 sprime(3, n-1);
 sprime(5, n-1);
 sprime(7, n-1);
 exit (0);
}

 

 

 

时间: 2024-08-03 09:09:28

[usaco]超级素数 superprime的相关文章

[usaco] 回数中的素数Prime Palindromes

题目给出一个下限,一个上限,要求求出之间的所有既是回数又是素数的数. 下边是原文描述: Prime Palindromes 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 palindro

[usaco]4.3.1 最长递减子序列 和超级整型数

Buy Low, Buy Lower The advice to "buy low" is half the formula to success in the stock market. But to be considered a great investor you must also follow this problems' advice: "Buy low, buy lower" That is, each time you buy a stock, y

梅森素数--美丽的贝壳

一.价值五万美元的素数    2000年4月6日,住在美国密歇根州普利茅茨的那扬·哈吉拉特瓦拉(Nayan Hajratwala)先生得到了一笔五万美元的数学奖金,因为他找到了迄今为止已知的最大素数,这是一个梅森素数:                    2^6972593-1.这也是我们知道的第一个位数超过一百万位的素数.精确地讲,如果把这个素数写成我们熟悉的十进制形式的话,它共有两百零九万八千九百六十位数字,如果把它以这个形式写下来,大约需要150到200篇本文的篇幅.    可是哈吉拉特

十万美元的悬赏 互联网梅森素数大搜索_应用技巧

一.价值五万美元的素数  2000年4月6日,住在美国密歇根州普利茅茨的那扬·哈吉拉特瓦拉(Nayan Hajratwala)先生得到了一笔五万美元的数学奖金,因为他找到了迄今为止已知的最大素数,这是一个梅森素数: 26972593-1. 这也是我们知道的第一个位数超过一百万位的素数.精确地讲,如果把这个素数写成我们熟悉的十进制形式的话,它共有两百零九万八千九百六十位数字,如果把它以这个形式写下来,大约需要150到200篇本文的篇幅. 可是哈吉拉特瓦拉先生并不是一个数学家,他甚至很可能对寻找素数

360安全浏览器如何超级拖拽

  拖拽链接.图片或者选中的文字等在页面上其他地方放开(即超级拖拽),即可在新标签中打开对应的链接.图片或搜索选中的文字.熟练使用超级拖拽功能可以大大改善您的浏览体验,提高您的浏览速度.

360极速浏览器的超级拖拽

拖拽链接.图片或者选中的文字等在页面上其他地方放开(即超级拖拽),即可在新标签中打开对应的链接.图片或搜索选中的文字.熟练使用超级拖拽功能可以大大改善您的浏览体验,提高您的浏览速度.

Dreamweaver网页制作教程:超级链接

  超级链接 作为网站肯定有很多的页面,如果页面之间彼此是独立的,那么网页就好比是孤岛,这样的网站是无法运行的.为了建立起网页之间的联系我们必须使用超级链接.称"超级链接",是因为它什么都能链接,如:网页.下载文件.网站地址.邮件地址--等等.下边我们就来讨论怎样在网页中创建超级链接. [页面之间的超级连接] 在网页中,单击了某些图片.有下划线或有明示链接的文字就会跳转到相应的网页中去. 1.在网页中选中要做超级链接的文字或者图片. 2.在属性面板中单击黄色文件夹图标,在弹出的对话框里

Win8.1系统如何开启超级管理员帐户?

  Win8.1系统如何开启超级管理员帐户?         方法一:通过计算机管理启用 1.Win + X快捷键调出系统快捷菜单,选择"计算机管理"; 2.打开"计算机管理"窗口,在左侧列表中定位至"系统工具 - 本地用户和组 - 用户",然后在右侧窗格中即可看到Administrator帐户; 3.只是默认是未启用状态,右键点击"Administrator",选择"属性",在打开的"Admin

如何在win8电脑中快速关闭桌面超级菜单

1.首先,咱们同时按下win8电脑键盘上的win+X快捷键打开电脑的菜单,然后从其中选择进入到控制面板的界面中. 2.之后,咱们将控制面板窗口右上方的查看方式更改为大图标,然后在其中点击进入到"任务栏和导航栏"选项中. 3.在打开的窗口中,咱们将界面切换到导航这一栏中,咱们看到上方的边角导航,然后将下属的"当我指向右上角时,显示超级按钮"选项的勾选去掉,然后点击确定保存设置即可.           注:更多精彩教程请关注三联电脑教程栏目,三联电脑办公群:18903