标题:如何将一个N行N列的二维数组改写成N行1列或者N行2列的数组。
只看楼主
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
结帖率:93.33%
已结贴  问题点数:10 回复次数:4 
如何将一个N行N列的二维数组改写成N行1列或者N行2列的数组。
程序代码:
#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");
    }
}

这段代码是一个N行N列的二维数组群,我想把它改写成N行1列或者N行2列的数组群,同时还要满足上面这段代码现有的规律,还有就是要用数组来编写,如果不用数组来编写,就没意思了,N如果能达到50, 就更好了。小弟不才,请教各位啦!!
搜索更多相关主题的帖子: 数组 void int for fprintf 
2018-05-08 17:28
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
得分:0 
你这人有点胡搞,胡扯,你明白int a[1<<N][N][N]; 是什么概念吗? 1<<N什么意思知道吗?还N要达到50。int 类型最大值是多少知道吗?
同一个问题,其它人多次回贴说明解答,自己不好好学习领会,一天到晚胡扯.
程序代码:
#include<stdio.h>

int main( void )
{

for(int i=1;i<50;i++)
printf("%ld\n" ,1<<i);

}

自己运行一下看看。
2018-05-08 19:06
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
得分:10 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * Mystrrev (char * str );
int main()
{
    char str[33];
    int System;
    int n,x,y;
//   FILE *fp;
//   if ((fp = fopen ("D:\\wenjian.txt", "a+")) == NULL)
//    {
//       printf("打开文件失败\n");
//       exit(1);
//    }
    printf("请输入本次填充数据的进制:(2~9)\n");
    printf("进制 :");
    scanf("%d",&System);
    printf("请输入本次生成数据的组数:(0`n)\n");
    printf(" n = ");
    scanf("%d",&n);
    printf("请输入本次生成数据的数组大小:\n");
    printf(" 行 x= ");
    scanf("%d",&x);
    printf(" 列 y= ");
    scanf("%d",&y);

   int Data[n][x][y];
   

    for (int i = 0 ; i < n ; i++ )
    {
        itoa(i, str, System);
        int Str_length = strlen(str);
        char str_tem[33];
        char str_tem1[33];
        memset(str_tem,'0',33);
        int Data_x_length = (x-1)/2+(x-1)%2;
        if ( Data_x_length >= Str_length) str_tem[Data_x_length - Str_length] ='\0';
        else
        {
            printf("数组太小,请检查你的设置参数!");
            return -1;
        }
        strcat(str_tem,str);

        strcpy( str_tem1, str_tem);
        Mystrrev (str_tem1);
        if (x%2)
        {
            strcat( str_tem1, str_tem);
        }
        else
        {
            str_tem1[strlen(str_tem1)-1] ='\0';
            strcat( str_tem1, str_tem);

        }
        for (int Data_y=0;Data_y < y; Data_y++)
            Data[i][0][Data_y] = Data_y+1;

        for (int Data_x=1;Data_x < x;Data_x++)
            for (int Data_y=0;Data_y < y;Data_y++)
            {
                Data[i][Data_x][Data_y] =str_tem1[Data_x-1]- '0';
            }
    }

 

    for (int Da_n=0;Da_n < n;Da_n++)
    {
        printf("n = %4d\n",Da_n);
        for (int Da_x = 0;Da_x < x ; Da_x++)
        {
            for (int Da_y = 0;Da_y < y;Da_y++)
            {
                printf("%4d",Data[Da_n][Da_x][Da_y]);
            }
            printf("\n");
        }
        printf("\n");
    }
//    fclose(fp);
    return 0;
}

char * Mystrrev (char * str )
{
    char *start = str;
    char *left = str;
    char ch;

    while (*str++);
    str -= 2;

    while (left < str)
    {
        ch = *left;
        *left++ = *str;
        *str-- = ch;
    }

    return(start);
}

2到9进制,任意大小,只要你电脑够棒自己去改吧
2018-05-08 19:37
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
本程序要做如下的检测:

但是检测到输入数据 6561 时,就出现了

请问怎么改动,就可以检测完上图的这几组数据。
2187 还可以运行,2188就不行了。

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

2018-07-23 11:10
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
当出现
时,输出文件为空,为啥呢?
2020-08-02 15:44



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




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

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