z duID:mathe
37981次访问,排名2941好友19人,关注者142
0.54364331210052407755147385529445
mathe的文章
原创 22 篇
翻译 0 篇
转载 24 篇
评论 36 篇
最近评论
Mgccl:79228162514264337593543950336
这样...有方法给每一个数独一个编号了...
然后找找编号和数独难度之间的关系
mathe:发现这个版本也有BUG,在非候选数模式下,本来应该可以用键盘输入的,不知道为什么,不能够用键盘输入了。所以就没法在非候选数模式下面玩了。不过由于我丢失源码,所以这个BUG也没办法修正了。也许大家可以从csdn下载中心中找到一些旧一些的版本,应该有可以支持非候选数模式的版本。

另外程序中有几个隐含功能,现在也公开一下:
i)选择游戏功能:对于机器随机产生的数独初……
oc:有手工输入真不错,提个问题:当手工输入遇到解不惟一时不能结束输入怎么半?
追梦儿写的:
/*void init(int **);
void scan();
void clear();*/

int a[9][9];
struct candiate
{
int mark[9];
}b[9][9];

int total=0;
int feifei=0;
追梦儿写的:/*void init(int **);
void scan();
void clear();*/

int a[9][9];
struct candiate
{
int mark[9];
}b[9][9];

int total=0;
int feifei=0;
文章分类
收藏
    相册
    旅游
    编程
    c++中如何阻止一个类成为父类
    mitbbs编程版关于c/c++初学者一些问题
    Why Access Denied while using ExitWindowEx(EWX_REBOOT)
    一道c题目,计算精度问题
    数学
    mitbbs中系列数学趣味题
    一道不错得逻辑题
    一道简单的数学不等式
    动脑筋问题-摔瓶
    最少多少个圆
    标注电缆
    算法
    a^4 + b^4 + c^4 = d^4
    mitbbs编程版算法问题
    Optimal Golomb ruler
    一道奥赛题:一个核电站有N个放核物质的坑...
    八数码扩展问题解的存在性判断
    反求线性相关数组
    如果把汉诺塔的问题扩展到m个盘子,n个塔,答案是什么?
    整数环
    整数集合分割成两个和相等(或最接近)的问题)
    牛奶浴场
    独立钻石棋
    素数计数
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 利用离散傅立叶变换实现大数乘法运算 (例子:自守数计算)收藏

    新一篇: 埃及分数问题 | 旧一篇: 数独游戏程序

    【自守数】(在十进位制中,)   若一个   k   位正整数   N   (可含前置   "0"   ),   若满足如下性质:   任意两个或多个均以该字串   N   结尾的整数相乘,   其结果的最后   k   位数字一定还是   N,   那么,   则称   N   为   "k   位自守数".   
     

    我们有结论:
    如果x是k位自守数,那么
    (x^2-1)^2   mod   10^(2k) 是2k位自守数。

    关于整数的乘法,
    假设N位L进制数
    A= a0+a1*L+a2*L^2+...+a(N-1)*L^(N-1)
    B=b0+b1*L+b2*L^2+...+b(N-1)*L^(N-1)
    C=A*B=(a0*b0)+(a0*b1+a1*b0)*L+...+a(N-1)*a(N-1)*L^(2*N-2)
    我们可以看到C的每个系数同卷积非常象

    如果我们在A同B后面都添加N项0,
    也就是A=a0+a1*L+...+a(2N-1)*L^(2N-1)
               B=b0+b1*L+...+b(2N-1)*L^(2N-1)
    其中a(N),a(N+1),...,a(2N-1);b(N),b(N+1),...,b(2N-1)都是0
    那么
    C=(a0*b0+a1*b(2N-1)+...+a(2N-1)*b1)+
         (a0*b1+a1*b0+a2*b(2N-1)+...+a(2N-1)*b2)*L+
        ...+
        (a0*b(2N-1)+a1*b(2N-2)+...+a(2N-1)*b(0))*L^(2N-1)
    其中各个系数正好是A和B的卷积,只是计算结果有可能每项超出[0,L)之间的范围要求,需要最后做调整。
    而卷积可以通过离散傅立叶变换来计算,如果计算两个数的平方,那么还可以少一次傅立叶变换。

    下面是计算自守数的代码,使用了Intel MKL中傅立叶变换函数:
    #include   <stdio.h>  
      #include   <stdlib.h>  
      #include   <time.h>  
      #include   <mkl_fft.h>  
      #define   MOD   (10000)  
      double   *r;  
      double   *tmp;  
      #ifdef   _WIN32  
      typedef   __int64   longlong;  
      #else  
      typedef   long   long   longlong;  
      #endif  
       
      int   main()  
      {  
              int   i,n;  
       
              int   k,k1,k2,c2;  
              scanf("%d",&k);  
              if(k<=1)return   -1;  
              k2=k,c2=0;  
              while(k2){  
      c2++;k2>>=1;  
              }  
              k2=1<<(c2-1);   //k2<=k   and   k2   is   power   of   2.  
              if(k2<k)k2<<=1;  
              r=(double   *)malloc(sizeof(double)*(k2+2));  
              if(r==NULL){  
      printf("Out   of   memory\n");  
      return   -1;  
              }  
              tmp=(double   *)malloc(sizeof(double)*(2*k2+4));  
              if(tmp==NULL){  
      printf("Out   of   memory\n");  
      free(r);  
      return   -1;  
              }  
               
              n=1;  
              r[0]=625.0;  
              while(4*n<k2){  
      //Step   1.   calcuate   r*r;  
      for(i=n;i<2*n;i++)r[   i   ]=0.0;  
      dzfft1dc(r,2*n,0,tmp);  
      dzfft1dc(r,2*n,1,tmp);//The   forward   FFT  
      r[0]*=r[0];  
      for(i=1;i<=n;i++){  
                                double   re=r[   i   ];  
                double   im=r[i+n+1];  
                double   nr=re*re-im*im;  
                double   ni=re*im*2.0;  
                r[   i   ]=nr;  
                r[i+n+1]=ni;  
      }  
      zdfft1dc(r,2*n,0,tmp);  
      zdfft1dc(r,2*n,1,tmp);  
      for(i=0;i<2*n-1;i++){  
              longlong   w=(longlong)(r[   i   ]+0.5);  
              r[   i   ]=(double)(w%MOD);  
              w/=MOD;  
              r[i+1]+=(double)w;  
      }  
      //Step   2.   r*r-1.0  
      r[0]-=1.0;  
      //Step   3.   (r*r-1.0)Mod   10^(2n)  
      for(i=2*n;i<4*n;i++)r[   i   ]=0.0;  
      dzfft1dc(r,4*n,0,tmp);  
      dzfft1dc(r,4*n,1,tmp);//The   forward   FFT  
      r[0]*=r[0];  
      for(i=1;i<=2*n;i++){//normalize  
                                double   re=r[   i   ];  
                double   im=r[i+2*n+1];  
                double   nr=re*re-im*im;  
                double   ni=re*im*2.0;  
                r[   i   ]=nr;  
                r[i+2*n+1]=ni;  
      }  
      zdfft1dc(r,4*n,0,tmp);  
      zdfft1dc(r,4*n,1,tmp);  
      for(i=0;i<2*n;i++){//normalize  
              longlong   w=(longlong)(r[   i   ]+0.5);  
              r[   i   ]=(double)(w%MOD);  
              w/=MOD;  
              r[i+1]+=(double)w;  
      }//discard   digits   after   2*n  
      n*=2;  
              }  
               
              k1=k/4;  
              printf("Result   for   k=%d   is\n",k);  
              if(k%4){//Output   first   several   digits:  
                      int   limit=1;  
      longlong   val=(longlong)(r[k1]+0.5);  
      for(i=0;i<k%4;i++)limit*=10;  
      val%=limit;  
      printf("%0*d",k%4,(int)val);  
              }  
              for(i=k1-1;i>=0;i--){  
      int   val=(int)(r[   i   ]+0.5);  
      printf("%04d",val);  
      if(i%10==0)printf("\n");  
              }  
              printf("\n");  
              free(r);  
              free(tmp);  
      }    

    发表于 @ 2007年10月31日 10:10:00|评论(loading...)|编辑

    新一篇: 埃及分数问题 | 旧一篇: 数独游戏程序

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © mathe