标题:改动数行,就可以满足所有程序的功能,请问:怎么改??
只看楼主
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
结帖率:93.33%
已结贴  问题点数:40 回复次数:9 
改动数行,就可以满足所有程序的功能,请问:怎么改??
我的上一个贴,是a[][7][7],已经成功完成了谢谢大佬们,现在我想把这个题目延伸一下,就以a[][7][7]为原型(a[][7][7]是可以正常运行的),a[][7][7]的原代码如下:
1#include<stdio.h>
2#include <stdlib.h>
3#define N 7//E
4static void _fun( int,int,int** );
5void print(FILE* fp, const int a[][N][N] );
6int main(  )
7{
8   int i,j;
9   int a[27][N][N];//F
10   int* p=NULL;
11  FILE *fp;
12    if ((fp = fopen ("D:\\数组7和7.txt", "a+")) == NULL)//G
13    {
14        printf("打开文件失败\n");
15        exit(1);
16    }
17   for (i=0;i!=27;++i)//H
18    {
19        p=a[i][1];
20       {
21            for (j=1;j!=N+1;++j)
22                  a[i][0][j-1]=j;      
23        }
24       _fun(i,~1,&p);
25       _fun(i,1+N%2,&p);
26    }
27    print(fp, a);
28    fclose(fp);
29    return 0;
30}
31static void _fun( int k,int n,int** p )
32{
33    if (n>0)
34       _fun(k/3,n-1,p);
35   {
36        int i=N+1;      
37       while (--i)
38        {
39             **p=k%3;
40             ++*p;
41        }
42  }
43   if (n<0)
44        _fun(k/3,n+1,p);
45}
46void print(FILE* fp, const int a[][N][N] )
47{
48    size_t i;
49    for (i=0;i!=27;++i)//I
50    {
51        size_t j;
52        fprintf(fp,"i = %d\n",i);
53        for (j=0;j!=N;++j)
54       {
55            size_t k;
56            for (k=0;k!=N;++k)
57                fprintf(fp,"%-4d",a[i][j][k]);
58           fprintf(fp,"\n");
59       }
60        fprintf(fp,"\n");
61    }
62}
最左边的一列数字表示的是该程序的该行的行号。
现在我想在a[][7][7]的基础上修改某一行或者几行就可以完成a[][N][N](N为大于5的整数 )的所有相关程序的编程(N的最大值暂时定为20吧)。N=6 和N=8 我已经编写好了,见下表:

说明:第一行的数字3,9,12,17,25,49 指的是该程序的行号。其他的a[][9][9]到a[][20][20]我就不清楚了,请问这个表该怎么填呢??

[此贴子已经被作者于2018-4-23 10:46编辑过]

搜索更多相关主题的帖子: int print FILE for fprintf 
2018-04-23 10:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
话说,当N=8的时候就不止27而是81了~
i!=3^(N/2);~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-23 10:48
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
当N=8的时候  是81啊 我运行过,正常。
2018-04-23 10:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:30 
回复 3楼 自学的数学
知道了,可以试试这个,这个直接改动N就可以了~
但似乎会造成空间浪费(除非用三维动态数组---无语无语)

N最好不要超过13,不然空间可能不够~

其实可以试试不一次性保留在数组里面,保存在一个文件里~
读取数据的时候直接在文件里面提取而不是从数组里面~

程序代码:
#include<stdio.h>

#define N 13

static void _fun( int,int,int** );

void print( int [][N][N] );

int a[1<<N][N][N];

int main( void )
{
   int i,j;

   int* p=NULL;

   unsigned k=1;
    
    for (i=0;i!=N/2;++i)
        k*=3;
   
   for (i=0;i!=k;++i)
    {
        p=a[i][1];

        {
            for (j=1;j!=N+1;++j)
                  a[i][0][j-1]=j;      
        }
        
       _fun(i,-(N/2-1),&p);
       _fun(i,N/2-1-(N+1)%2,&p);

    }
    
    print(a);
    
    return 0;
}
static void _fun( int k,int n,int** p )
{
     if (n>0)
        _fun(k/3,n-1,p);
   {
        int i=N+1;       
        while (--i)
        {
            
             **p=k%3;
              
              ++*p;
        }
                     
  }
    if (n<0)
        _fun(k/3,n+1,p);
}

void print( int a[][N][N] )
{
    size_t i;
    
    unsigned k=1;
    
    for (i=0;i!=N/2;++i)
        k*=3;
    
    for (i=0;i!=k;++i)
    {
        size_t j;
        printf("i = %d\n",i);
        for (j=0;j!=N;++j)
        {
            size_t k;
            for (k=0;k!=N;++k)
                printf("%-4d",a[i][j][k]);
            
            printf("\n");
        }
        
        printf("\n");
    }
}



[此贴子已经被作者于2018-4-23 11:31编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-23 11:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
以下是引用自学的数学在2018-4-23 10:42:46的发言:

说明:第一行的数字3,9,12,17,25,49 指的是该程序的行号。其他的a[][9][9]到a[][20][20]我就不清楚了,请问这个表该怎么填呢??


要for一下~

for (i=0;i!=N/2;++i)
        k*=3;

~
   

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-23 11:30
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
得分:0 
IFY
2018-04-23 11:31
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
回复 4楼 九转星河
你的代码很好,但是不好观看效果,最好能输出到文件里,然后可以通过打开文件的方法查看,就好了。我试试改改看。
2018-04-23 11:45
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
#include<stdio.h>
#include <stdlib.h>
#define N 13
static void _fun( int,int,int** );
void print(FILE* fp, const int [][N][N] );
int a[1<<N][N][N];
int main( void )
{
   int i,j;
   int* p=NULL;
   unsigned k=1;
   FILE *fp;
    if ((fp = fopen ("D:\\数组13和13.txt", "a+")) == NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
  for (i=0;i!=N/2;++i)
        k*=3;
   for (i=0;i!=k;++i)
    {
        p=a[i][1];
        {
            for (j=1;j!=N+1;++j)
                  a[i][0][j-1]=j;      
        }
       _fun(i,-(N/2-1),&p);
       _fun(i,N/2-1-(N+1)%2,&p);
    }
    print(fp, a);
    fclose(fp);
    return 0;
}
static void _fun( int k,int n,int** p )
{
     if (n>0)
        _fun(k/3,n-1,p);
   {
        int i=N+1;      
        while (--i)
        {
              **p=k%3;
              ++*p;
        }
   }
    if (n<0)
        _fun(k/3,n+1,p);
}
void print(FILE* fp, const int a[][N][N] )
{
    size_t i;
    unsigned k=1;
    for (i=0;i!=N/2;++i)
        k*=3;
    for (i=0;i!=k;++i)
    {
        size_t j;
        fprintf(fp,"i = %d\n",i);
        for (j=0;j!=N;++j)
        {
            size_t k;
            for (k=0;k!=N;++k)
                fprintf(fp,"%-4d",a[i][j][k]);
           fprintf(fp,"\n");
        }
        fprintf(fp,"\n");
    }
}
2018-04-23 11:53
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:10 
如仅仅是要达到楼主所需效果,根本不需要使用数组即可完成的,如下代码即可存入不同文件中,并且是楼主所需效果:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print(FILE* , int);
void _fun(FILE* ,int,int,int);
int main( void )
{
    int n;
    char a[100]={0},b[100];
    FILE *fp;
    printf("输入一个大于5的数:");
    scanf("%d",&n);
    sprintf(b,"%d",n);
    strcat(a,"D:\\数组");
    strcat(a,b);
    strcat(a,".txt");       
    //这一系列字符串运算可确保不同数字存到D盘不同文件里,输入6就存到"d:\数组6.txt"中,输入7就存到"d:\数组7.txt"中
    if ((fp = fopen (a, "w")) == NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
    print(fp,n);
    fclose(fp);
    return 0;
}

void print(FILE* fp, int n)
{
    int i,j,s=1;
    for(i=0;i<n/2;i++)s*=3;
    for(i=0;i<s;i++)
    {
        fprintf(fp,"i = %d\n",i);
        for(j=0;j<n;j++)fprintf(fp,"%-3d",j+1);
        _fun(fp,i,n,0);
        fprintf(fp,"\n");
    }
}
void _fun(FILE* fp,int k,int n,int s)
{
    int i;
    if(s>=n/2)return;
    fprintf(fp,"\n");
    for(i=0;i<n;i++)fprintf(fp,"%-3d",k%3);
    _fun(fp,k/3,n,s+1);
    if(!(n%2)&&s+1==n/2)return;  //区分奇偶数行数
    fprintf(fp,"\n");
    for(i=0;i<n;i++)fprintf(fp,"%-3d",k%3);
}
收到的鲜花
  • 九转星河2018-04-23 15:57 送鲜花  1朵   附言:好~

能编个毛线衣吗?
2018-04-23 15:41
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
回复 9楼 wmf2014
必须要用到数组,因为我还要用数组来给每个数字定位,以便于好计算,计算也是很复杂的,我都编写好了计算的代码了。
2018-04-23 18:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486297-1-1.html




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

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