C 中多个数组的笛卡尔积

2023-12-07

我能够在 C 中实现静态数组数量的笛卡尔积。但是我想动态构建一个代码,获取输入数组的数量。有人可以阐明如何“仅使用数组”来做到这一点。如果不可能对于数组,请建议我其他解决方案。谢谢。下面是我的 3 个数组的笛卡尔积的代码。

#include<stdio.h>

int main(void)
{
        int array1[100];
        int array2[100];
        int array3[100];
        int cartesian_array[100][100];
        int m,n,o;
        int i,j;
        int p=0,q=0,r=0;
        int x,y,z;
        int cartesian_arr_row_len;
        int cartesian_arr_col_len;


        printf("Enter the size of first array:\n");
        scanf("%d",&m);

        printf("Enter the size of second array:\n");
        scanf("%d",&n);

        printf("Enter the size of third array:\n");
        scanf("%d",&o);

        printf("Enter the first array elements:\n");
        for(i=0;i<m;i++)
        scanf("%d",&array1[i]);

        printf("Enter the second array elements:");
        for(i=0;i<n;i++)
        scanf("%d",&array2[i]);

        printf("Enter the third array elements:");
        for(i=0;i<o;i++)
        scanf("%d",&array3[i]);

        cartesian_arr_row_len=m*n*o;
        cartesian_arr_col_len=3;

        x=cartesian_arr_row_len/m;
        y=cartesian_arr_row_len/(m*n);
        z=o;

        for(i=0;i<cartesian_arr_row_len;i++)
        {
                for(j=0;j<cartesian_arr_col_len;j++)
                {
                        if(j==0)
                        {
                                cartesian_array[i][j]=array1[p/x];
       p++;
                        }

                        if(j==1)
                        {
                                cartesian_array[i][j]=array2[q/y];
                                q++;
                                if(q>=n*y)
                                q=0;
                        }

                        if(j==2)
                        {
                                cartesian_array[i][j]=array3[r%z];
                                r++;
                        }
                }

        }

        printf("The Cartesian Product of two arrays is:\n");
        for(i=0;i<cartesian_arr_row_len;i++)
        {
                for(j=0;j<cartesian_arr_col_len;j++)
                {
                        printf("%d\t",cartesian_array[i][j]);
                }
                printf("\n");
        }

        return 0;
}

你能阅读 Java 代码并自己翻译吗?

import java.util.*;    

class CartesianIterator <T> implements Iterator <List <T>> {

        private final List <List <T>> lilio;    
        private int current = 0;
        private final long last;

        public CartesianIterator (final List <List <T>> llo) {
                lilio = llo;
                long product = 1L;
                for (List <T> lio: lilio)
                        product *= lio.size ();
                last = product;
        } 

        public boolean hasNext () {
                return current != last;
        }

        public List <T> next () {
                ++current;
                return get (current - 1, lilio);
        }

        public void remove () {
                ++current;
        }

        private List<T> get (final int n, final List <List <T>> lili) {
                switch (lili.size ())
                {
                        case 0: return new ArrayList <T> (); // no break past return;
                        default: {
                                List <T> inner = lili.get (0);
                                List <T> lo = new ArrayList <T> ();
                                lo.add (inner.get (n % inner.size ()));
                                lo.addAll (get (n / inner.size (), lili.subList (1, lili.size ())));
                                return lo;
                        }
                }
        }
}

class CartesianIterable <T> implements Iterable <List <T>> {

        private List <List <T>> lilio;  

        public CartesianIterable (List <List <T>> llo) {
                lilio = llo;
        }

        public Iterator <List <T>> iterator () {
                return new CartesianIterator <T> (lilio);
        }
}

class CartesianIteratorTest {

        public static void main (String[] args) {
                List <Character> la = Arrays.asList (new Character [] {'a', 'b'});
                List <Character> lb = Arrays.asList (new Character [] {'b', 'c'});      
                List <Character> lc = Arrays.asList (new Character [] {'c', 'a'});
                List <List <Character>> llc = new ArrayList <List <Character>> ();
                llc.add (la);
                llc.add (lb);
                llc.add (lc);

                CartesianIterable <Character> ci = new CartesianIterable <Character> (llc);
                for (List<Character> lo: ci)
                        show (lo);

                la = Arrays.asList (new Character [] {'x', 'y', 'z'});
                lb = Arrays.asList (new Character [] {'b'});    
                lc = Arrays.asList (new Character [] {'c'});
                llc = new ArrayList <List <Character>> ();
                llc.add (la);
                llc.add (lb);
                llc.add (lc);

                ci = new CartesianIterable <Character> (llc);
                for (List<Character> lo: ci)
                        show (lo);
        }

        public static void show (List <Character> lo) {
                System.out.print ("(");
                for (Object o: lo)
                        System.out.print (o);
                System.out.println (")");
        }
}

我不知道C中是否存在类似迭代器的东西。iterable很可能对你没有帮助。

代码的想法是,有一个计数器,它在结果集的所有元素上创建索引,并计算绑定到该值的元素。

如果我们有 3 组 (1,2,3)(4,5)(6,7,8),我们就会得到我们期望的 18=3x2x3 结果。例如,对于迭代器位置 7,我们可以计算结果如下:

7 % 3 = 1 => (1,2,3)[1] = 2 (number modulo 1st group size) 
7 / 3 = 2 (int division)  (number div 1st group size)
2 % 2 = 0 => (4,5)[0] = 4 (rest modulo 2nd group size) 
2 / 2 = 0 
0 % 3 = 0 => (7,8,9) => 7 

idx g1  g2  g3
 0  1   4   6   
 1  2   4   6   
 2  3   4   6   
 3  1   5   6   
 4  2   5   6   
 5  3   5   6   
 6  1   4   7   
 7  2   4   7   
 8  3   4   7   
 9  1   5   7   
10  2   5   7   
11  3   5   7   
12  1   4   8   
13  2   4   8   
14  3   4   8   
15  1   5   8   
16  2   5   8   
17  3   5   8   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中多个数组的笛卡尔积 的相关文章

随机推荐

  • 如何从动态范围中分割文本?

    我从 ERP 系统下载了一个很长的数据集 他们是管子 划定的 我必须将其拆分为单独的列 我可以用FILTERXML or TEXTSPLIT 将它们拆分为列 我试图动态使用 Textsplit 函数 以便如果有任何新数据到达末尾行 它会自动
  • Swift 的 Guard 关键字

    Swift 2 引入了guard关键字 可用于确保各种数据已配置就绪 我看到的一个例子这个网站演示了一个submitTapped函数 func submitTapped guard username text characters coun
  • javascript for循环更改原始列表变量

    我有一个名为响应的对象集合 我正在创建另一个名为的变量object这是一个空对象并创建object array并将其设置为响应变量 我想我正在创建一个新的范围 但是 如果我在里面设置年龄object array作为空 这将我的响应数组中的年
  • 确定设备是智能手机还是平板电脑? [复制]

    这个问题在这里已经有答案了 我想获取有关设备的信息 看看它是智能手机还是平板电脑 我该怎么做 我想根据设备类型显示资源中的不同网页 String s Debug infos s n OS Version System getProperty
  • Home 键转到 Visual Studio Code 中的行首吗?

    Visual Studio Code 中使 Home 键转到行首的选项在哪里 现在你必须做 Home Home or Home Ctrl Left Arrow 我希望 home 位于该行的开头 奖金闲聊 文件 首选项 键盘快捷键 奖励阅读
  • 为什么如果 EOF 是行中的第一个字符,就会被识别?

    我写了这个C程序 include
  • 如何向每个 Angular.js $http 请求添加添加请求参数(例如启动 xdebug 会话)

    我的混合应用程序基于 AngularJS 并使用 php REST api 我想直接从我的 Angular 应用程序调试 php api 而不是使用 REST 控制台或 Postman 它将节省大量时间 特别是对于 POST 和 PUT 请
  • Sed 正则表达式更改文件

    我 未成功 尝试替换 Magento local xml 文件 连接字符串文件 中的数据库主机条目 该行如下
  • Python搜索目录,列出文件的基本名称,没有扩展名

    我想知道我是否可以修改我的代码以仅发布文件的基本名称 而不是包括扩展名的整个文件 我是 python 新手 所以我不太了解 而且我不知道不想修改某些东西并使其完全损坏 import glob import os os chdir C hea
  • 进程运行时不断打印子进程输出

    要从 Python 脚本启动程序 我使用以下方法 def execute command process subprocess Popen command shell True stdout subprocess PIPE stderr s
  • 在 Python 中将 SQLite 3 数据存储为变量

    我是否可以获取存储在 sqlite3 表中的数据并将其用作 Python 变量 我正在寻找可能类似于此伪代码的内容 import sqlite3 conn sqlite3 connect DATABASE cursor conn curso
  • 替换 pandas dataframe 列中的特定值,否则将列转换为数字

    给定以下 pandas 数据框 AgeAt X AgeAt Y AgeAt Z 0 Older than 100 Olde
  • React-router v6 私有路由不能正常工作

    我想用react router V6实现私有和公共路由 我已经尝试了StackOverflow上所有可用的解决方案 它似乎不起作用 这就是为什么我需要澄清 App tsx
  • 在汇编中实现正则表达式“[ab][^r]+r]”的匹配器

    我的汇编代码需要帮助 我需要使用编写代码来找到适合我的正则表达式的范围 我的正则表达式 ab r r 所以首先我寻找是否有 a 或 b 并跳转到 开始 部分 现在我有一个问题如何仅保存这封信的第一次出现 程序应显示 5 10 这意味着 匹配
  • 谷歌是否正在为本地主机生成新的 openid 声明标识符?

    我遇到了 google openid 标识符的问题 我在简单的 asp net mvc 项目中使用 dotnetopenauth 库 dotnetopenid 的后继者 在本地主机上的测试期间 我注意到谷歌有时会生成新的声明标识符 这是为什
  • 非阻塞同步 AJAX

    有没有办法执行同步 AJAX 查询而不冻结浏览器 在我看来 在大多数情况下 同步请求更容易使用 但它们阻止代码其他部分执行的事实才是真正的杀手 有没有一种方法可以实现同步 AJAX 而不会带来负面影响 是的 我意识到术语 同步 AJAX 是
  • 分享锚链接

    我想制作一个以这种形式共享链接的按钮 http example com anchor 但当我点击它时 它只共享 http example com 我怎样才能让它分享我想要的东西 这很简单 您想要共享的 URL 字符串应如下所示 http w
  • 使用 cellfun 将带参数的函数应用到单元格

    假设有一个字符元胞数组 希望将其转换为数字向量 这可以通过使用来完成str2num or str2double 例如 x 0 17106 2 11462 4 13938 6 24203 cellfun str2num x str2doubl
  • 如何比较 Excel 单元格中的文本以查看是否找到相同的单词?

    我有几行 Excel 单元格 其中包含一串单词 所有单词均以逗号分隔 我想将每个单元格与另一个单元格进行比较 以检查是否有任何单词匹配 重复 例如 单元格 A1 dog cat rabbit mouse lion bear tiger单元格
  • C 中多个数组的笛卡尔积

    我能够在 C 中实现静态数组数量的笛卡尔积 但是我想动态构建一个代码 获取输入数组的数量 有人可以阐明如何 仅使用数组 来做到这一点 如果不可能对于数组 请建议我其他解决方案 谢谢 下面是我的 3 个数组的笛卡尔积的代码 include