注册 登录
编程论坛 C语言论坛

如何用三进制数的形式来表达以下的一组数组群

自学的数学 发布于 2020-11-24 15:20, 2950 次点击
有以下一组数组群(每一行是一个一维数组):
i = 1    0   0   0   0   0   0   0   0   0   0   0
i = 2    0   0   0   0   0   1   1   0   0   0   0
i = 3    0   0   0   0   0   2   2   0   0   0   0
i = 4    0   0   0   0   1   0   0   1   0   0   0
i = 5    0   0   0   0   1   1   1   1   0   0   0
i = 6    0   0   0   0   1   2   2   1   0   0   0
i = 7    0   0   0   0   2   0   0   2   0   0   0
i = 8    0   0   0   0   2   1   1   2   0   0   0
i = 9    0   0   0   0   2   2   2   2   0   0   0
i = 10   0   0   0   1   0   0   0   0   1   0   0
i = 11   0   0   0   1   0   1   1   0   1   0   0
i = 12   0   0   0   1   0   2   2   0   1   0   0
i = 13   0   0   0   1   1   0   0   1   1   0   0
i = 14   0   0   0   1   1   1   1   1   1   0   0
i = 15   0   0   0   1   1   2   2   1   1   0   0
i = 16   0   0   0   1   2   0   0   2   1   0   0
i = 17   0   0   0   1   2   1   1   2   1   0   0
i = 18   0   0   0   1   2   2   2   2   1   0   0
i = 19   0   0   0   2   0   0   0   0   2   0   0
i = 20   0   0   0   2   0   1   1   0   2   0   0
i = 21   0   0   0   2   0   2   2   0   2   0   0
i = 22   0   0   0   2   1   0   0   1   2   0   0
i = 23   0   0   0   2   1   1   1   1   2   0   0
i = 24   0   0   0   2   1   2   2   1   2   0   0
i = 25   0   0   0   2   2   0   0   2   2   0   0
i = 26   0   0   0   2   2   1   1   2   2   0   0
i = 27   0   0   0   2   2   2   2   2   2   0   0
 。。。。。。
 。。。。。。
i = 238   0   2   2   2   1   0   0   1   2   2   2
i = 239   0   2   2   2   1   1   1   1   2   2   2
i = 240   0   2   2   2   1   2   2   1   2   2   2
i = 241   0   2   2   2   2   0   0   2   2   2   2
i = 242   0   2   2   2   2   1   1   2   2   2   2
i = 243   0   2   2   2   2   2   2   2   2   2   2
备注,这里用了省略号,不然内容太长。
数组规律,每个一维数组的首项都是0,首项后面共计10个数,前5个数是以3进制数的形式依次往前递增,后5个数是以该行前5个数相反的形式出现的。
由于内容长,可以用:
 FILE *fp;
    if ((fp = fopen ("D:\\数组.txt", "w+")) == NULL)//E
    {
        printf("打开文件失败\n");
        exit(1);
    }
的形式保存在硬盘。
请问如何编程?
还有,这是用三进制数的形式来表示的,如何修改个别地方,就可以完成用四进制,五进制。。。都可以完成类似的编程。
15 回复
#2
rjsp2020-11-24 16:32
程序代码:
#include <stdio.h>

void foo( unsigned n )
{
    for( unsigned i=0; i!=n*n*n*n*n; ++i )
        printf( "i = %u%4u%4u%4u%4u%4u%4u%4u%4u%4u%4u\n", i+1
            , i/(n*n*n*n)%n, i/(n*n*n)%n, i/(n*n)%n, i/(n)%n, i/1%n
            , i/1%n, i/(n)%n, i/(n*n)%n, i/(n*n*n)%n, i/(n*n*n*n)%n );
}

int main( void )
{
    foo( 3 );
}
#3
自学的数学2020-11-26 16:24
回复 2楼 rjsp
不对,题目要求是这样的:
i = 1    0   0   0   0   0   0   0   0   0   0   0
i = 2    0   0   0   0   0   1   1   0   0   0   0
i = 3    0   0   0   0   0   2   2   0   0   0   0
i = 4    0   0   0   0   1   0   0   1   0   0   0
i = 5    0   0   0   0   1   1   1   1   0   0   0
i = 6    0   0   0   0   1   2   2   1   0   0   0
i = 7    0   0   0   0   2   0   0   2   0   0   0
i = 8    0   0   0   0   2   1   1   2   0   0   0
i = 9    0   0   0   0   2   2   2   2   0   0   0
i = 10   0   0   0   1   0   0   0   0   1   0   0
i = 11   0   0   0   1   0   1   1   0   1   0   0
i = 12   0   0   0   1   0   2   2   0   1   0   0
i = 13   0   0   0   1   1   0   0   1   1   0   0
i = 14   0   0   0   1   1   1   1   1   1   0   0
i = 15   0   0   0   1   1   2   2   1   1   0   0
i = 16   0   0   0   1   2   0   0   2   1   0   0
i = 17   0   0   0   1   2   1   1   2   1   0   0
i = 18   0   0   0   1   2   2   2   2   1   0   0
i = 19   0   0   0   2   0   0   0   0   2   0   0
i = 20   0   0   0   2   0   1   1   0   2   0   0
i = 21   0   0   0   2   0   2   2   0   2   0   0
i = 22   0   0   0   2   1   0   0   1   2   0   0
i = 23   0   0   0   2   1   1   1   1   2   0   0
i = 24   0   0   0   2   1   2   2   1   2   0   0
i = 25   0   0   0   2   2   0   0   2   2   0   0
i = 26   0   0   0   2   2   1   1   2   2   0   0
i = 27   0   0   0   2   2   2   2   2   2   0   0
。。。
i = 238   0   2   2   2   1   0   0   1   2   2   2
i = 239   0   2   2   2   1   1   1   1   2   2   2
i = 240   0   2   2   2   1   2   2   1   2   2   2
i = 241   0   2   2   2   2   0   0   2   2   2   2
i = 242   0   2   2   2   2   1   1   2   2   2   2
i = 243   0   2   2   2   2   2   2   2   2   2   2

i = 238   0   2   2   2   1   0   0   1   2   2   2
i = 239   0   2   2   2   1   1   1   1   2   2   2
i = 240   0   2   2   2   1   2   2   1   2   2   2
i = 241   0   2   2   2   2   0   0   2   2   2   2
i = 242   0   2   2   2   2   1   1   2   2   2   2
i = 243   0   2   2   2   2   2   2   2   2   2   2

每一行第一个数是0,你这里第一个数的0去哪里了?

[此贴子已经被作者于2020-11-26 16:27编辑过]

#4
rjsp2020-11-26 16:32
你自己加个零不行吗?

"i = %u%4u%4u%4u%4u%4u%4u%4u%4u%4u%4u\n"
改为
"i = %u   0%4u%4u%4u%4u%4u%4u%4u%4u%4u%4u\n"
#5
自学的数学2020-11-26 16:52
还有题目说了,每一行要用数组来表示(用数组来表示是为了以后方便于计算的定位需要,比如a[0],a[15]等等)。你这里呢?干巴巴几个数和成一行。不方便计算啊。
#6
自学的数学2020-11-28 15:03
我想到一个办法,其实可以这样理解:
    本体是要将0到243共计244个十进制数先转换为三进制数,再将转换后的三进制数安位存入一维数组中,存入时,注意本题的条件:
    1:每个一维数组的首项都是0.
    2:后5个数是以该行前5个数相反的形式出现的。
#7
自学的数学2020-11-29 16:09
简单写了一下, 把一个数转换为三进制数后,存入数组的情况。
程序代码:
#include "stdio.h"

 main() {
    int a, b[100],i=0,j;
    printf("请输入一个十进制数:");
    scanf("%d",&a);
    while(a)
    {
    b[i]=a%3;
    a/=3;
    i++;
    }
   for(j=i-1;j>=0;j--)
        printf(" %d",b[j]);   
    printf("\n ");
   for(j=0;j<i;j++)
        printf(" b[%d]= %d",j,b[j]);     
}

只是输出的时候,是反向的了。
#8
自学的数学2020-12-01 19:55
反向输出的问题终于解决了:

程序代码:
#include "stdio.h"

 main() {
    int a, b[100],i=0,j,c[100],d;
    printf("请输入一个十进制数:");
    scanf("%d",&a);
    while(a)
    {
     b[i]=a%3;
    a/=3;
    i++;
    }
   for(j=i-1;j>=0;j--)
        printf(" %d",b[j]);   
    printf("\n ");
    for(j=i;j>0;j--)   
        d=i-j;
    for(d=0;d<i;d++)
      {
          c[d]=b[i-d-1];
        printf(" c[%d]= %d",d,c[d]);
      }      
}


[此贴子已经被作者于2020-12-1 20:03编辑过]

#9
自学的数学2020-12-02 20:59
程序代码:
#include "stdio.h"


 main() {
    int a, b[11],i=0,j,c[11],d,e[11];
    printf("请输入一个十进制数:");
    scanf("%d",&a);
    e[0]=0;
    while(a)
    {
     b[i]=a%3;
    a/=3;
    i++;
    }
   for(j=i-1;j>=0;j--)
        printf(" %d",b[j]);   
    printf("\n ");
    for(j=i;j>0;j--)   
        d=i-j;
    for(d=0;d<i;d++)
      {
          c[d]=b[i-d-1];
        printf(" c[%d]= %d",d,c[d]);
      }
      printf("\n ");
      for(j=0;j<5;j++)  
         {
             e[j+1]=c[j];   
             e[11-j-1]=c[j];
         }
      for(j=0;j<11;j++) printf(" e[%d]= %d",j,e[j]);
}

这里,转换后的三进制数如果是五位数,就没问题,否则,就不对,请问,该怎么改??谢谢!!
#10
自学的数学2020-12-03 20:33
现在楼上的问题解决了,如下:
程序代码:
#include "stdio.h"

 main() {
    int a, b[11],i=0,j,c[11],d,e[11]={0};
    printf("请输入一个十进制数:");
    scanf("%d",&a);
   while(a)
    {
     b[i]=a%3;
    a/=3;
    i++;
    }
   for(j=i-1;j>=0;j--)
        printf(" %d",b[j]);   
    printf("\n ");
    for(j=i;j>0;j--)   
        d=i-j;
    for(d=0;d<i;d++)
      {
          c[d]=b[i-d-1];
        printf(" c[%d]= %d",d,c[d]);
      }
      printf("\n ");
      for(j=i;j>=0;j--)  
         {
            e[j+6-i]=c[j];     
            e[11-j-6+i]=c[j];   
         }
      for(j=0;j<11;j++) printf(" e[%d]= %d",j,e[j]);
}

但是,如果输入为0呢,程序没有输出,但是题目对于0是有输出的,这个问题有要好好考虑一番了。
#11
自学的数学2020-12-04 20:39
现在程序简化如下,对于一个数来说,得出的结论完全正确,也就是输入一个十进制数,把它转化为三进制数后,再放入一维数组里,没有任何问题,但是如何将0到242共计243个数都来完成这个工作呢?该如何使用循环语句呢?
程序代码:
#include "stdio.h"

 main() {
    int a, b[11],i=0,j,c[11],d,e[11]={0};
    printf("请输入一个十进制数:");
    scanf("%d",&a);
   while(a)
    {
    b[i]=a%3;
    a/=3;
    i++;
    }
    for(j=i;j>0;j--)   d=i-j;
    for(d=0;d<i;d++)   c[d]=b[i-d-1];
    for(j=i;j>=0;j--)  
         {
            e[j+6-i]=c[j];     
            e[11-j-6+i]=c[j];   
         }
   for(j=0;j<11;j++) printf("  %d",e[j]);
}
#12
自学的数学2020-12-19 16:56
从 现在开始,谁第一个做出来,将获得20元人民币奖励,通过微信支付。
#13
wmf20142020-12-19 18:24
这么一个简单的问题弄到现在吗?楼主11楼代码和一楼问题不一致,0会输出随机数,1应该输出00000000000。
下述代码也和一楼问题不一致,0输出0,1输出1,3输出00001001000(问题太简单,不要支付什么了).
程序代码:
#include "stdio.h"

void ff(int *a,int n)
{//十进制数n转换为三进制镜像存储到数组a中
    int i;
    for (i = 0; i < 11; i++)a[i] = 0;
    for (i = 0; n; n /= 3, i++)a[5 - i] = a[6 + i] = n % 3;
}
void main() {
    int a, b[11], i = 0, j, c[11], d, e[11] = { 0 };
    for (i = 0; i < 243; i++, printf("\n"))
    {
        ff(e, i);
        for (j = 0; j < 11; j++) printf("%d  ", e[j]);
    }
}
#14
自学的数学2020-12-20 14:53
    我是搞数学科研的,为了研究数学问题,才来自学C语言编程,基础差,没办法。有了你这段代码,我后面的工作就好做了。
    通过多年的研究,我觉得不论是数学,还是编程,都要具备发散思维。今后你会明白的。
    所以,请老师留下你的微信号。
    我将你的代码修改如下,这样就更能符合题意了:
程序代码:
#include "stdio.h"
#include <stdlib.h>  
void ff(int *a,int n)
{//十进制数n转换为三进制镜像存储到数组a中
    int i;
    for (i = 0; i < 11; i++)a[i] = 0;
    for (i = 0; n; n /= 3, i++)a[5 - i] = a[6 + i] = n % 3;
}

 main() {
    int a, b[11], i = 0, j, c[11], d, e[11] = { 0 };
    FILE *fp;
    if ((fp = fopen ("D:\\b.txt", "a+")) == NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
    for (i = 0; i < 243; i++, fprintf(fp,"\n"))
    {
        ff(e, i);
        fprintf(fp,"i = %d ",i);
        for (j = 0; j < 11; j++) fprintf(fp, "%d ", e[j]);
    }
}
#15
do8do8do82020-12-20 16:00
代码已经被大神们写透了,哈,我就不献丑了
只是楼主,你搞数学的,用R语言吧,那个自带图形功能杠杠的
要不用lisp,这两种语言的思维方式可以让你思维更发散,哈
#16
自学的数学2021-01-03 22:55
程序代码:
#include "stdio.h"
#include <stdlib.h>  
void ff(int *a,int n)
{//十进制数n转换为三进制镜像存储到数组a中
    int i,p=11,s,t;
    if(( p%2 )==1) s= (p-1)/2;
       else s= p/2;
     for(i=1;i<s+1;i++)
       t=t*2;
   t=t+1;
    for (i = 0; i < p; i++)a[i] = 0;
    for (i = 0; n; n /= 3, i++)a[s - i] = a[s + i+1] = n % 3;
}

 main() {
    int a, b[11], i = 0, j, c[11], d, e[11] = { 0 },p=11,s,t,u=1;
    FILE *fp;
    if ((fp = fopen ("D:\\11.txt", "a+")) == NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
     if(( p%2 )==1)  s= (p-1)/2;
       else s= p/2;
     for(i=1;i<s+1;i++)
       t=t*2;
   t=t+1;
   while(s)
   {
       u=u*3;
       s=s-1;
   }
    for (i = 0; i < u; i++, fprintf(fp,"\n"))
    {
        ff(e, i);
        fprintf(fp,"i = %2d ",i);
        for (j = 0; j < p; j++) fprintf(fp, "%4d ", e[j]);
    }
}


将函数里面的 int i,p=11,s,t;和
主程序里面的 int a, b[11], i = 0, j, c[11], d, e[11] = { 0 },p=11,s,t,u=1;和"D:\\11.txt
所对应的关键数字全部换成你想要的任何奇数A(本代码处A=11),就可以完成每一行的数组的元素个数为A,由此共要多少个这样的数组,本代码都为你计算好了,非常省事(半分钟就可以搞定)。
1