| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1887 人关注过本帖
标题:如何将数字扩大。请教各位老大!!
只看楼主 加入收藏
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
结帖率:93.33%
收藏
已结贴  问题点数:10 回复次数:19 
如何将数字扩大。请教各位老大!!
如下一段代码:
#include<stdio.h>
#include <stdlib.h>
#define N 21
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:\\数组21.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取不大于20的数,都可以正常运行,但是取21,就不行了,请问,可以怎么修改呢?
要求:
 1):能否将N扩大到50或更大;
 2):还是要用到数组编程。
搜索更多相关主题的帖子: void int for ++i fprintf 
2018-05-02 16:18
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
这代码做什么用的?
2018-05-03 04:23
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
搞数学研究用的,跟行列式有关。俺喜欢研究数学。我还喜欢下围棋,通过下围棋,我还想到了一个编程方面的问题,到时候还得请教各位老大。谢谢!!
2018-05-03 07:06
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
回复 3楼 自学的数学
这个就是数组太大没有足够的空间进行分配~

N=50的时候需要
(2^50)*50*50这么大的空间(顶多N最多为31,因为再大就超过32位取址范围了)
建议先不用数组写入文件~
需要用到的时候再把数据从文件里面读取出来放入一个数组里面

暂时不需要用到的数组可以选择重新覆盖这样来节省空间

简单来说就是需要自定义一个临时读写缓冲区~


[此贴子已经被作者于2018-5-3 08:34编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-03 07:35
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:3 
常量预编译是可以进行运算的,因此楼主“int a[1<<N][N][N];”可以修改成“int a[N*N*N][N][N];”,此种方式在vc6中编译通过。
更正:没找到预编译幂运算方法,楼主这种代码可以用动态数组实现,或者完全可以用代码换空间的方式实现,根本不需要数组。

[此贴子已经被作者于2018-5-3 08:09编辑过]


能编个毛线衣吗?
2018-05-03 08:02
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
数组是必须要用到的,因为数组的计算是用数组的行列坐标来标识的,如果没有坐标,光是一堆数摆在这里,请问你怎么计算。
当然哦,用动态数组实现是可以考虑的。需要用到的时候再把数据从文件里面读取出来放入一个数组里面,暂时不需要用到的数
组可以选择重新覆盖这样来节省空间。都行。
2018-05-03 09:38
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 6楼 自学的数学
你这些数据就是些3进制数据的简单三维排列,完全可以用一个函数将坐标和数据对应起来,即输入一个坐标的行列值和计数值,通过简单计算即得到对应数据,根本不需要数组。

能编个毛线衣吗?
2018-05-03 10:53
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
这个思路好像蛮不错的,但是怎么操作呢??只要满足前面的那两点要求就可以了(1:能否将N扩大到50或更大;2:你这里说过可以不要数组,但是有关数组方面的计算如何计算呢?),这又是个难点。不好处理。
2018-05-03 11:13
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:2 
N扩大大50,计数需要3^25=847288609443,int类型数都无法表示,数组则需要8P(8000T=8000000G=8000000000M......),现有最高级的服务器都没有这个容量存放了。
如果通过函数运算获取,计数则需要用到long long类型数据。

能编个毛线衣吗?
2018-05-03 11:24
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
那用函数的方式,怎么编程呢?
2018-05-03 12:23
快速回复:如何将数字扩大。请教各位老大!!
数据加载中...
 
   



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

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