C中多个数组的笛卡尔积
发布时间:2020-12-16 07:30:24 所属栏目:百科 来源:网络整理
导读:我能够在C.中实现静态数组数的笛卡尔积.但是我想构建一个动态地获取输入数组的代码.有人可以解释一下如何“只使用数组”.如果不可能的话有阵列请告诉我其他解决方案.谢谢.这是我的代码,下面是3个阵列的笛卡尔积. #includestdio.hint main(void){ int array1[
我能够在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("%dt",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中是否存在与迭代器类似的东西.迭代很可能对你没用. 代码的想法是,有一个计数器,它在结果集的所有元素上创建一个索引,并计算绑定到该值的元素. 如果我们有3组(1,2,3)(4,5)(6,7,8),我们有18 = 3x2x3的结果.我们可以,例如迭代器位置7计算结果如下: 7 % 3 = 1 => (1,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |