第29講 細胞構成法による魔方陣の作成の普遍化△

第3話 
素数次でない奇数次魔方陣のコード例
#include<stdlib.h>
#include<math.h>
       ・
       ・
       ・
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           label2->Text=L"";
           DateTime^ hj=DateTime::Now;
           n=int::Parse(textBox1->Text);
           char h=1;
           if(n<3 || n>14 || n%2==0){
             label2->Text=L"TextBoxには3以上11以下の奇数\r\nを入力し再度実行ボタンを\r\n押して下さい。";
             h=0;
           }
           
s=0;
           if(n%2==1){
             cn=0;
             h=sh();
           }
           else{
             h=1;
           }
           if(h==0 && n%2==1){
             kf1(0);
             array<String^>^ w=gcnew array<String^>(31);
             int i;
             w[25]=n.ToString();w[26]=L"次";w[27]=L"魔";w[28]=L"方";w[29]=L"陣";w[30]=s.ToString();
             for(i=0;i<25;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
             DateTime^ ow=DateTime::Now;
             TimeSpan sa=ow->Subtract(*hj);
             w[25]=L"時";w[26]=L"間";w[27]=L"計";w[28]=L"則";w[29]=L":";w[30]=(sa.TotalSeconds).ToString();
             for(i=0;i<25;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
           }

           /*
           if(h==1){
             s=0;
             if(n%2==1)g1(n);
             if(n%2==0)g2(n);
             syokika();
             cn=0;
             zhy();
             sbs(0);
             sbg(0);
             array<String^>^ w=gcnew array<String^>(15);
             int i;
             w[9]=(2*n).ToString();w[10]=L"次";w[11]=L"魔";w[12]=L"方";w[13]=L"陣";w[14]=s.ToString();
             for(i=0;i<8;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
             DateTime^ ow=DateTime::Now;
             TimeSpan sa=ow->Subtract(*hj);
             w[9]=L"時";w[10]=L"間";w[11]=L"計";w[12]=L"則";w[13]=L":";w[14]=(sa.TotalSeconds).ToString();
             for(i=0;i<9;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
           }
           */
         }
         char sh(){ //素数判定
           double k;
           k=sqrt((double)n);
           char i;
           for(i=3;i<=k;i+=2){
             if(n%i==0)return(0);
           }
           return(1);
         }
         void kf1(int g){ //素数でない奇数の種1作り
           if(s==10)return;
           if(g==0){
             a1[0][0]=n/2+1;
             kf1(g+1);
           }
           char i,j,h,k,kk,kkk,l;
           if(g>0){
             kk=rand()%n;
             for(i=1;i<n+1;i++){
               kkk=((kk+i-1)%n)+1;
               a1[0][g]=kkk;
               h=1;
               for(j=0;j<g;j++){
                 if(a1[0][g]==a1[0][j]){
                   h=0;
                   break;
                 }
               }
               if(h==1){
                 if(g+1<n){
                   kf1(g+1);
                 }
                 else{
                   for(j=1;j<n;j++){
                     for(k=0;k<n;k++){
                       l=(j+k)%n;
                       a1[j][l]=a1[0][k];
                     }
                   }
                   kf2(0);
                 }
               }
             }
           }
         }
         void kf2(int g){ //素数でない奇数の種2作り
           if(s==10)return;
           if(g==0){
             a2[0][n-1]=n/2+1;
             kf2(g+1);
           }
           char i,j,h,k,kk,kkk,l;
           if(g>0){
             kk=rand()%n;
             for(i=1;i<n+1;i++){
               kkk=((kk+i-1)%n)+1;
               a2[0][n-1-g]=kkk;
               h=1;
               for(j=0;j<g;j++){
                 if(a2[0][n-1-g]==a2[0][n-1-j]){
                   h=0;
                   break;
                 }
               }
               if(h==1){
                 if(g+1<n){
                 kf2(g+1);
               }
               else{
                 for(j=1;j<n;j++){
                   for(k=0;k<n;k++){
                     l=((n-1)*j+k)%n;
                     a2[j][l]=a2[0][k];
                   }
                 }
                 for(j=0;j<n;j++){
                   for(k=0;k<n;k++){
                     mah[j][k]=n*(a1[j][k]-1)+a2[j][k];
                   }
                 }
                 array<String^>^ w=gcnew array<String^>(30);
                 for(j=0;j<n;j++){
                   for(k=0;k<n;k++){
                     w[k]=(mah[j][k]).ToString();
                   }
                   dataGridView1->Rows->Add(w);
                 }
                 for(j=0;j<30;j++)w[j]=L"";
                 dataGridView1->Rows->Add(w);
                 s++;
                 if(s==10)return;
               }
             }
           }
         }
       }

               ・
               ・
               ・

実行例
入門
初心者
参考ファイルForm1.h

さて、いよいよ材料はすべてそろいました。
           if(n%2==1){
             cn=0;
             h=sh();
           }
           else{
             h=1;
           }
           if(h==0 && n%2==1){
             kf1(0);
             array<String^>^ w=gcnew array<String^>(31);
             int i;
             w[25]=n.ToString();w[26]=L"次";w[27]=L"魔";w[28]=L"方";w[29]=L"陣";w[30]=s.ToString();
             for(i=0;i<25;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
             DateTime^ ow=DateTime::Now;
             TimeSpan sa=ow->Subtract(*hj);
             w[25]=L"時";w[26]=L"間";w[27]=L"計";w[28]=L"則";w[29]=L":";w[30]=(sa.TotalSeconds).ToString();
             for(i=0;i<25;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
           }

           /*
           if(h==1){
             s=0;
             if(n%2==1)g1(n);
             if(n%2==0)g2(n);
             syokika();
             cn=0;
             zhy();
             sbs(0);
             sbg(0);
             array<String^>^ w=gcnew array<String^>(15);
             int i;
             w[9]=(2*n).ToString();w[10]=L"次";w[11]=L"魔";w[12]=L"方";w[13]=L"陣";w[14]=s.ToString();
             for(i=0;i<8;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
             DateTime^ ow=DateTime::Now;
             TimeSpan sa=ow->Subtract(*hj);
             w[9]=L"時";w[10]=L"間";w[11]=L"計";w[12]=L"則";w[13]=L":";w[14]=(sa.TotalSeconds).ToString();
             for(i=0;i<9;i++)w[i]=L"";
             dataGridView1->Rows->Add(w);
           }
           */
の部分をいじり完成を目指しましょう。
いきなり3から30までは無理なので
初歩の範囲で考えましょう。
尚、解説は次話で。

第2話へ
第4話へ

戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)