主题:[讨论]二维数组里面暗藏的相对二维数组的计算
论坛爱好者
[专家分:0] 发布于 2010-07-03 15:36:00
我用C++编写了如下的一段程序:
#include<iostream.h>
void main()
{
//声明变量
int m4,i;
double k;
double a[12][10]={
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
{3,3,3,3,3,3,3,3,3,3},
{4,4,4,4,4,4,4,4,4,4},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{2,2,2,2,2,2,2,2,2,2},
{5,5,5,5,5,5,5,5,5,5},
{1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0},
{2,2,2,2,2,2,2,2,2,2},
{1,1,1,1,1,1,1,1,1,1}
};
for (i=1;i<=11;i++)
{k=a[0][0]*a[i+0][0];
if (k==4)
{
cout<<" a["<<i<<"][0]";
cout<<" i="<<i<<endl;
}
}
}
程序运行一切正常,运行结果如下:
a[1][0] i=1
a[6][0] i=6
a[10[0] i=10
其中 a[1][0]表示 a[1][0]所在位置的元素的值与a[0][0]所在位置的元素的乘积为我预先给定的值k==4 i=1表示 a[1][0]所在位置的元素的行数。
同理 a[6][0]表示 a[6][0]所在位置的元素的值与a[0][0]所在位置的元素的乘积为我预先给定的值k==4 i=6 表示 a[6][0]所在位置的元素的行数。
现在我想请教大家一个问题:运行结果里面有一句话:a[6][0] i=6。
如何将行数i=6变为i=0,相应的该元素的列的值就增加6,也就是行减少多少行,列数就增加多少列。相当于a[6][0]变为了a[0][6],但是a[10][0]
不是变为了a[0][10] ,而是变为了a[4][6],(也就是说,原先a[6][0]的行减少多少行,a[10][0]的行也减少多少行 ,a[6][0]的列 增加多少列 ,
a[10][0]的列 也增加多少列,他们的相对位置没有发生改变)再来计算变换后的两个位置a[0][6]和a[4][6]的乘积。请问,在原程序的基础上该怎
么修改?最好把修改后的原程序发上来,因为我学得不好,要好好学学,谢谢!!
回复列表 (共22个回复)
沙发
强强 [专家分:4740] 发布于 2010-07-03 17:04:00
把自己想象成为一个CPU就容易理解数组了
板凳
雪光风剑 [专家分:27190] 发布于 2010-07-03 19:52:00
我现在不理解你的代码到底要做什么
最清楚要做什么的只有你自己
所谓算法,就是把自己要做的事一步一步完整地写下来,然后转化成代数表达式,再转化成计算机表达式,最终通过具体编程语言实现的一个过程
3 楼
论坛爱好者 [专家分:0] 发布于 2010-07-03 23:21:00
我说的内容后,不明白我说的啥??我在这里再简明地说明一下,是这样的:
在一个二维数组里面,在它的第一列你随便取一个位置(比如我取[5][0])的数作为研究对象,假设我们给它定义它的新坐标是[0][5],那么它右边第一个数[5][1] 的新坐标是[0][6],它右边第二个数[5][2] 的新坐标是[0][7],它右边第三个数[5][3] 的新坐标是[0][8],依次类推;它[5][0]下面第一个数[6][0]的新坐标是[1][5],它[5][0]下面第二个数[7][0]的新坐标是[2][5],它[5][0]下面第三个数[8][0]的新坐标是[3][5]. 依次类推.然后在,新 坐标里面再来计算两个数(任意的数)乘积.就是这么会事.
{2,2,2,2,2,2,2,2,2,2},
{3,3,3,3,3,3,3,3,3,3},
{4,4,4,4,4,4,4,4,4,4},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{2,2,2,2,2,2,2,2,2,2},
{5,5,5,5,5,5,5,5,5,5},
{1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0},
{2,2,2,2,2,2,2,2,2,2},
{1,1,1,1,1,1,1,1,1,1}
4 楼
雪光风剑 [专家分:27190] 发布于 2010-07-04 01:41:00
因为不知道你这么做的意义,而且这么变幻之后你没说明下标是否不允许超界,所以我很迷茫
5 楼
论坛爱好者 [专家分:0] 发布于 2010-07-04 12:05:00
假设列数是行数的2倍(如下数组),并且,下标在不超界的情况(超界就失去了做题的意义了)下来考虑问题.数组的内容可以自己随意编写.
{2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2},
{3,3,3,3,3,3,3,3,3,3,3,3},
{4,4,4,4,4,4,4,4,4,4,4,4},
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1},
该怎么做呢??
6 楼
强强 [专家分:4740] 发布于 2010-07-04 15:08:00
先把新坐标转成旧坐标再计算不就行了
7 楼
论坛爱好者 [专家分:0] 发布于 2010-07-04 21:58:00
就是因为不好转换呀,现在我编写了如下一段代码:
#include<iostream.h>
int main()
{
//声明变量
int i,mix,m1;
double k;
double a[12][24]={
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
{4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
mix=11;
for (i=1;i<=11;i++)
{k=a[0][0]*a[i+0][0];
if (k==4)
{
cout<<" a["<<i<<"][0]";
cout<<" i="<<i<<endl;
if (i<mix)
mix=i;
}
}
i=mix;
cout<<"mix= "<<mix<<endl;
m1=a[0][0+i];
cout<<"a["<<i<<"][0]"<<"转换后的为:"<<"a[0]["<<i<<"]"<<endl;
cout<<"转换后的值 m1="<<m1<<endl;
}
这段代码可以自动地将满足条件的第一个坐标进行转换,并且将转换后的新坐标的值也保存下来了,也就是a[6][0]转换成了a[0][6],但是a[10][0]还没有转换成我所需要的a[4][6],暂时就编写到这里了.后面的我就不会了.
8 楼
雪光风剑 [专家分:27190] 发布于 2010-07-04 23:33:00
主要就是你记录下那个i之后要对两个维度都进行关于i的处理
9 楼
论坛爱好者 [专家分:0] 发布于 2010-07-05 09:30:00
都转换好了,所有满足条件的都转换好了,但是只有第一个转换好的值是存如变量里面的,后面的,还没有,也就是说,还不能对它们做进一步的处理(比如相加,相乘法),遗憾,代码如下:
#include<iostream.h>
int main()
{
//声明变量
int i,mix,m1;
double k;
double a[12][24]={
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
{4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
{1,1,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1},
{4,4,4,4,41,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1}
};
mix=11;
for (i=1;i<=11;i++)
{k=a[0][0]*a[i+0][0];
if (k==10)
{
cout<<" a["<<i<<"][0]";
cout<<" i="<<i<<endl;
if (i<mix)
mix=i;
}
}
cout<<"mix= "<<mix<<endl;
for (i=1;i<=11;i++)
{k=a[0][0]*a[i+0][0];
if (k==1)
{
cout<<" a["<<i<<"][0]";
cout<<" i="<<i<<endl;
cout<<"a["<<i<<"][0]"<<"转换后的为:"<<"a["<<i-mix<<"]["<<mix<<"]"<<endl;
cout<<"转换后的值 m1="<<a[i-mix][mix]<<endl;
}
}
m1=a[0][0+i];
}
10 楼
雪光风剑 [专家分:27190] 发布于 2010-07-05 22:48:00
老实说,你的程序基于的数学依据我们没看懂,所以我们不知道该怎么给你建议。能不能把你要做的事尝试用较简单的数学语言描述一下
我来回复