| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1323 人关注过本帖
标题:再来转一个 projecteuler.net 的问题
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:13 
程序代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 4
#define Max 100
int buf[N]={0};
int array[Max] = { 3 };
int output[3] = {};
int store[24] ={};

bool deepCheck()
{
        int subbuf[3] = {store[output[0]]  , store[output[1]], store[output[2]]};
        std::sort(subbuf,subbuf+3);
        if ( subbuf[1] - subbuf[0] == subbuf[2] - subbuf[1] )
        {
                return true;
        }
        else
                return false;
}

void comb3( int m , int n=3 )
{
        for  ( int i = m ; i >= n ; i -- )
        {
                array[n] = i;
                if ( n > 1 )
                        comb3(i -1 , n -1 );
                else
                {
                        for ( int j = array[0]; j > 0 ; j -- )
                        {
                                output[j]=array[j] ;
                                //std::cout<<output[j]<<" ";
                        }
                        //std::cout<<std::endl;
                        if (deepCheck())
                        {
                                std::cout<<store[output[0]]<<" "<<store[output[1]]<<" "<<store[output[2]]<<std::endl;
                        }
                }
        }

}
bool isOk(int k)
{
        if  ( k == 0 )
                return true;
        else if ( buf[k] > buf[ k-1] )
                return true;
        else
                return false;
}

bool isPrime(int n)
{
        if( n == 0 || n == 1)
                return false;
        if ( n == 2 )
                return true;
        for ( int i =2 ; i < n/2; i ++  )
        {
                if (  n % i  == 0  )
                        return false;
        }
        return true;
}

int buf2Num(int * buffer)
{
        int ret = 0;
        for( int i = 0 ; i < N ; i++)
        {
                ret *= 10;
                ret += buffer[i];
        }
        return ret;
}

void checkSub()
{
        int buffer[4] = { 0 };
        int k = 0 ;
        memcpy(buffer, buf,4*sizeof( int ));
        do{

                int num = buf2Num(buffer);
                if( isPrime(num) && num > 1000)
                        store[k++] = num;
        }while( std::next_permutation(buffer+0,buffer+4));
        /*    for( int i =0 ; i < k ; i ++ )
        {
                std::cout<<store[i]<<" ";
        }
        std::cout<<std::endl;
        */
        comb3(k);
}

void recurse(int n)
{
        if (  n == N)
        {
                // for  ( int i = 0 ; i < N ; i ++ )
                // {
                //         std::cout<<buf[i]<<" ";
                // }
                // std::cout<<std::endl;
                checkSub();
           }
        else
        {
                for( int j = 0 ; j < 10; j ++ )
                {
                        buf[n] = j ;
                        if ( isOk(n))
                                recurse(n+1) ;
                }
        }
}

int main()
{
        recurse(0);
}
2011-08-03 21:18
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 31楼 Devil_W
哇~~貌似很复杂,终于有人贴代码了~~ 感谢

俺先去 dota , 有心情了再来学习你的代码。
2011-08-03 21:22
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 31楼 Devil_W
为什么同一组输出了两遍?
2011-08-04 20:50
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用voidx在2011-8-4 20:50:50的发言:

为什么同一组输出了两遍?


solve it , by yourself!
2011-08-04 21:28
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 34楼 Devil_W
。。。好吧,不过俺是懒人的说~~
2011-08-04 21:33
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
提示: 该帖被管理员或版主屏蔽
2011-08-04 21:39
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
我努力试试看吧~
2011-08-04 21:41
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:13 
以下是引用Devil_W在2011-8-4 21:39:52的发言:

 
 
其实,如果你真的看懂我的算法,这个水坛里面的80%人都不是你对手了。
大家觉得这是一种什么心态? 怎么会有这么一个自以为是的2B,
污染论坛环境,本版实在看不下去了,强烈建议 静夜思 封其号!

支持的点右下角

[ 本帖最后由 BlueGuy 于 2011-8-5 09:28 编辑 ]
收到的鲜花
  • Devil_W2011-08-05 17:13 送鲜花  -3朵   附言:点你妹,2b

我就是真命天子,顺我者生,逆我者死!
2011-08-05 09:24
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:13 
以上证明:权限是个好东西
2011-08-05 09:53
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <conio.h>

#define N 30

int used[N]={0};
int num=0; 

int prime(int x)//判断x是否是四位数的质数
{
    int i,m;
    m=(int)sqrt((double)x);
   // printf("\n%d\n",m);
    for(i=2;i<=m;i++)
    {
        if(!(x%i))
        {
           return 0;
        }
    }
    return 1;
}

int arrange(int *t,int n)
{
   int i,j,flag;
   for(i=n;i>=1;i--)
         t[i]=t[i-1];
   for(i=1;i<n;i++)
   {
       flag=0;
       for(j=n-1;j>=i;j--)
        if(t[j+1]<t[j])
        {
          t[0]=t[j+1];
          t[j+1]=t[j];
          t[j]=t[0];
          flag=1;
        }
       if(!flag)
       {
             for(i=0;i<n;i++)
                      t[i]=t[i+1];
            return 0;
       }
   }
   return 1;
}

int examp(int a[],int x,int n)//二分法查找
{
    int low,high,mid;
    low=0;high=n-1;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(a[mid]==x)
            return 1;
        if(a[mid]>x)
            high=mid-1;
        else
            low=mid+1;
    }
    return 0;
}

int arithmetic(int *t,int n)
{
       int i,j,k,k2,m=0;
       for(i=0;i<n;i++)
       {
            for(j=1;t[i]+j*2<=t[n-1];j++)
            {
                for(k=0;;k++)
                {
                    if(!examp(t,t[i]+k*j,n))//使用二分法查找t[i]+k*j是否在数组中
                        break;
                }
                if(k>2)
                {
                    m=1;
                    printf("结果已找到:\n\t");
                    for(k2=0;k2<k;k2++)
                    {
                        printf("%d ",t[i]+k2*j);
                    }
                    printf(",公差%d",j);
                    printf("\n\t");
                }
            }
        }
        if (!m)
        {
               printf("结果未找到。\n");
        }
        else
          getch();
        return 0;
}        

int judge (int a,int b,int c,int d)
{
    int arr[4]={a,b,c,d};
    int prim[24];
    int i,j,k,s,ret,count=0;
    prim[0]=a*1000+b*100+c*10+d;
    printf("\n\t已找到");
    for (i=0;i<4;i++)
    {
     if (0==arr[i])//同下
        continue;//试试注释掉这两句!!!!!
     for (j=0;j<4;j++)
     {
         if (i==j)
           continue;
         for (k=0;k<4;k++)
         {
             if (i==k||j==k)
               continue;
             if (i==0&&j==1&&k==2)
               continue;
             s=1000*arr[i]+100*arr[j]+10*arr[k]+arr[6-i-j-k];
             ret=prime(s);
             if (ret)
             {
              prim[++count]=s;
              printf("%d,",s,count);
             }
         }
     }
    }
    count++;
    if (count<4)
    {
       printf("\b是质数,\n\t总共有%d个满足质数条件,少于四个,不满足主条件,继续查找下一个\n",count);
       return 0;
    }
    printf("\b是质数,\n\t总共有%d个满足质数条件,正在排序...\n\t",count);
    arrange(prim,count);
    for (i=0;i<count;i++)
        printf("%d ",prim[i]);
    for (i=0;i<count;i++)
       if (prim[i]>1000)
          break;
    if (prim[i]<(a*1000+b*100+c*10+d))
    {
       printf("\n\t%d所包含的序列已在%d中检索,停止重复检索!\n",a*1000+b*100+c*10+d,prim[i]);
       return 0;
    }
    printf("\n\t排序完成,正在检索等差数列...\n\t");
    arithmetic(prim,count);
    return 0;
     
}

int main()
{
    printf("说明:\n数列 1487, 4817, 8147 是一个等差数列,它在两方面非常特殊:\n\
    1. 各项为质数\n\
    2. 各项都能够通过将其他项的各位数字重新排列得到\n\
    不存在由 3 个一位数、两位数或三位数组成的这样的数列,但是存在另一个由 3 个四位数组成的这样的数列。\n\
    请找出这个数列。\n************任意键开始搜索!****************\n");
    getch();
    int a,b,c,d;
    int s=0,ret;
    for (a=1;a<=9;a++)
    {
     for (b=0;b<=9;b++)
     {
      if (a==b)
      continue;
      for (c=0;c<=9;c++)
      {
       if (a==c||b==c)
        continue;
       for (d=0;d<=9;d++)
       {
          if (a==d||b==d||c==d)
            continue;
          s=a*1000+b*100+c*10+d;
          ret=prime(s);
          if (ret)
          {
             printf("%d",s);
             printf("是质数,正在查找匹配项...");
             judge(a,b,c,d);
             //getch();
             printf("\n");
          }
       }
      }
    }
  }
    getch();
    return 0;
}

             
提示性语句有点多,所以写了200多行,但运行还是很快的,给大家分享一下~~~~
2011-08-07 18:38
快速回复:再来转一个 projecteuler.net 的问题
数据加载中...
 
   



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

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