鱼C论坛

 找回密码
 立即注册
查看: 1901|回复: 19

[已解决]数组的关系比较

[复制链接]
发表于 2018-6-7 21:45:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一个二维数组[2][4],怎么让它的第一行与第二行之间比较,然后相等的实参放一边,不相等的放在另一边,然后两边相乘,求源代码
最佳答案
2018-6-8 17:57:09
c语言的卢克c 发表于 2018-6-8 17:48
c++我现在还不会呀,麻烦你写这么多了,晚点我问问我表哥看看

C语言好像也不麻烦
这个应该可以了
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int data[2][4] = {{2, 2, 2, 3}, {2, 2, 3, 5}};
  5.         int flag[2][4] = {0};
  6.         int left[100];
  7.         int left_count = 0;
  8.         int right[100];
  9.         int right_count = 0;

  10.         for(int i = 0; i < 4; ++i)
  11.         {
  12.                 for(int j = 0; j < 4; ++j)
  13.                 {
  14.                         if(flag[0][i] || flag[1][j])
  15.                                 continue;

  16.                         if(data[0][i] == data[1][j])
  17.                         {
  18.                                 left[left_count++] = data[0][i];
  19.                                 flag[0][i] = 1;
  20.                                 flag[1][j] = 1;

  21.                                 i = 0;                // reset
  22.                                 j = 0;                // reset
  23.                         }
  24.                 }
  25.         }

  26.         for(int i = 0; i < 4; ++i)
  27.         {
  28.                 if(!flag[0][i])
  29.                         right[right_count++] = data[0][i];
  30.         }
  31.         for(int i = 0; i < 4; ++i)
  32.         {
  33.                 if(!flag[1][i])
  34.                         right[right_count++] = data[1][i];
  35.         }

  36.         int result = 1;
  37.         for(int i = 0; i < left_count; ++i)
  38.         {
  39.                 result *= left[i];
  40.         }
  41.         for(int i = 0; i < right_count; ++i)
  42.         {
  43.                 result *= right[i];
  44.         }
  45.         printf("%d\n", result);

  46.         return 0;
  47. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-7 22:00:23 | 显示全部楼层
“然后相等的实参放一边,不相等的放在另一边”
是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-7 22:01:02 | 显示全部楼层
“然后两边相乘”
又是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-7 23:14:40 | 显示全部楼层
人造人 发表于 2018-6-7 22:00
“然后相等的实参放一边,不相等的放在另一边”
是什么意思?

就是求一个最小公倍数,需要将二维数组里面第一和第二行的值做比较,我直接举一个例子吧,[2][4]={2,2,2,3,2,2,3,5};然后将第一行和第二行进行比较,相等的存放到一个变量里面,不相等的放到另外一个变量里面,然后两个变量相乘,得到的结果就是最小公倍数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:19:13 | 显示全部楼层
c语言的卢克c 发表于 2018-6-7 23:14
就是求一个最小公倍数,需要将二维数组里面第一和第二行的值做比较,我直接举一个例子吧,[2][4]={2,2,2, ...

看不懂你在说什么
就这个例子 [2][4]={2,2,2,3,2,2,3,5};
你先来算一遍


“第一行和第二行进行比较”
说的太笼统了,如何比较


“相等的存放到一个变量里面,不相等的放到另外一个变量里面”
“相等的” ?
说明不止一个?那么这个变量是什么类型的?应该不是简单的 int 或是 char 吧?
是一个数组?或是结构体?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 08:17:43 From FishC Mobile | 显示全部楼层
没看懂什么意思啊?2放左边,3放左边,5放右边?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 12:46:20 | 显示全部楼层
人造人 发表于 2018-6-8 00:19
看不懂你在说什么
就这个例子 [2][4]={2,2,2,3,2,2,3,5};
你先来算一遍

是int型的,一个数组比较的步骤我不会
#include <stdio.h>
int main()
{
    int dedivisor,divisor,a,b;
    printf("Please enter two integers:");
    scanf("%d,%d",&a,&b);
    printf("The result is:\n");
    dedivisor=a;
    while(1)
    {
        for(divisor=2; divisor<=dedivisor; divisor++)
        {

            if(dedivisor%divisor==0)
            {
                dedivisor=dedivisor/divisor;
                break;
            }
        }
        printf("%d ",divisor);
        if(dedivisor==1)
        {
            printf("\n");
            break;
        }
    }
    dedivisor=b;
     while(1)
    {
        for(divisor=2; divisor<=dedivisor; divisor++)
        {

            if(dedivisor%divisor==0)
            {
                dedivisor=dedivisor/divisor;
                break;
            }
        }
        printf("%d ",divisor);
        if(dedivisor==1)
        {
            break;
        }
    }
这是我之前几个步骤的源代码,下一步是要利用数组,之后我的思路就一些乱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 13:53:45 | 显示全部楼层
c语言的卢克c 发表于 2018-6-8 12:46
是int型的,一个数组比较的步骤我不会
#include
int main()
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int arr[2][4] = {{2, 2, 2, 3}, {2, 2, 3, 5}};
  5.         int a;
  6.         int b;

  7.         for(int i = 0; i < 4; ++i)
  8.         {
  9.                 if(arr[0][i] == arr[1][i])        // 做比较?如何比较? == 比较?
  10.                 {
  11.                         // 相等的存放到一个变量里面?
  12.                         // 如何放?这个变量是int类型?
  13.                         a = arr[0][i];
  14.                 }
  15.                 else
  16.                 {
  17.                         b = arr[0][i];
  18.                 }
  19.         }

  20.         // 然后两个变量相乘?
  21.         int result = a * b;

  22.         return 0;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 16:20:32 | 显示全部楼层

你这个程序已经可以把我的思路表达出来了,但是你可以试试看加一个输出语句,把你这个程序的步骤打印出来,数学上正确的答案是,12*10=120
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 16:36:29 | 显示全部楼层
三千芳华 发表于 2018-6-8 08:17
没看懂什么意思啊?2放左边,3放左边,5放右边?

2,2,3            2,5
然后两边相乘得到的结果就是最小公倍数了,感觉自己对数组有些迷,应该题目接触的比较少的原因吧,目前还没有找到程序解决方案      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 17:43:55 | 显示全部楼层
c语言的卢克c 发表于 2018-6-8 16:20
你这个程序已经可以把我的思路表达出来了,但是你可以试试看加一个输出语句,把你这个程序的步骤打印出来 ...

这个程序用C语言写比较麻烦
我用C++写了一个
不知行不行
  1. #include <iostream>
  2. #include <vector>

  3. int main()
  4. {
  5.         std::vector<std::vector<int>> data = {{2, 2, 2, 3}, {2, 2, 3, 5}};
  6.         std::vector<int> left;
  7.         std::vector<int> right;

  8.         for(auto i = data.at(0).begin(); i != data.at(0).end(); ++i)
  9.         {
  10.                 for(auto j = data.at(1).begin(); j != data.at(1).end(); ++j)
  11.                 {
  12.                         if(*i == *j)
  13.                         {
  14.                                 left.push_back(*i);
  15.                                 data.at(0).erase(i);
  16.                                 data.at(1).erase(j);
  17.                                 i = data.at(0).begin();                // reset
  18.                                 j = data.at(1).begin();                // reset
  19.                         }
  20.                 }
  21.         }

  22.         for(auto i = data.at(0).begin(); i != data.at(0).end(); ++i)
  23.         {
  24.                 right.push_back(*i);
  25.         }
  26.         for(auto i = data.at(1).begin(); i != data.at(1).end(); ++i)
  27.         {
  28.                 right.push_back(*i);
  29.         }

  30.         int result = 1;
  31.         for(auto i = left.begin(); i != left.end(); ++i)
  32.         {
  33.                 result *= *i;
  34.         }
  35.         for(auto i = right.begin(); i != right.end(); ++i)
  36.         {
  37.                 result *= *i;
  38.         }
  39.         std::cout << result << std::endl;

  40.         return 0;
  41. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 17:48:05 | 显示全部楼层
c++我现在还不会呀,麻烦你写这么多了,晚点我问问我表哥看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 17:57:09 | 显示全部楼层    本楼为最佳答案   
c语言的卢克c 发表于 2018-6-8 17:48
c++我现在还不会呀,麻烦你写这么多了,晚点我问问我表哥看看

C语言好像也不麻烦
这个应该可以了
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int data[2][4] = {{2, 2, 2, 3}, {2, 2, 3, 5}};
  5.         int flag[2][4] = {0};
  6.         int left[100];
  7.         int left_count = 0;
  8.         int right[100];
  9.         int right_count = 0;

  10.         for(int i = 0; i < 4; ++i)
  11.         {
  12.                 for(int j = 0; j < 4; ++j)
  13.                 {
  14.                         if(flag[0][i] || flag[1][j])
  15.                                 continue;

  16.                         if(data[0][i] == data[1][j])
  17.                         {
  18.                                 left[left_count++] = data[0][i];
  19.                                 flag[0][i] = 1;
  20.                                 flag[1][j] = 1;

  21.                                 i = 0;                // reset
  22.                                 j = 0;                // reset
  23.                         }
  24.                 }
  25.         }

  26.         for(int i = 0; i < 4; ++i)
  27.         {
  28.                 if(!flag[0][i])
  29.                         right[right_count++] = data[0][i];
  30.         }
  31.         for(int i = 0; i < 4; ++i)
  32.         {
  33.                 if(!flag[1][i])
  34.                         right[right_count++] = data[1][i];
  35.         }

  36.         int result = 1;
  37.         for(int i = 0; i < left_count; ++i)
  38.         {
  39.                 result *= left[i];
  40.         }
  41.         for(int i = 0; i < right_count; ++i)
  42.         {
  43.                 result *= right[i];
  44.         }
  45.         printf("%d\n", result);

  46.         return 0;
  47. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 17:57:48 | 显示全部楼层
多了一个标志,一个不存在标志
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 19:37:03 | 显示全部楼层
哪呢,我怎么没发现呢,正在思考你写的这个程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 19:45:26 | 显示全部楼层
人造人 发表于 2018-6-8 17:57
多了一个标志,一个不存在标志

为什么你for循环里面要声明一个int呢,我觉得没必要的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 19:47:04 | 显示全部楼层
c语言的卢克c 发表于 2018-6-8 19:45
为什么你for循环里面要声明一个int呢,我觉得没必要的

什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 19:54:34 | 显示全部楼层

(int i=1;i<4;++i),可以直接这样的(i=1;i<4;++i),节省空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 20:02:34 | 显示全部楼层

这个你现在先忽略吧,学到后面你就明白了
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-8 20:26:04 | 显示全部楼层
人造人 发表于 2018-6-8 20:02
这个你现在先忽略吧,学到后面你就明白了
^_^

谢谢啦,能加个好友吗,不过我好像因为等级不够,没有加好友的权限
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 15:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表