C++中找一个数的程序

找出每行里最大的数,如果它恰是当列最小的数,则输出以下这个程序哪里错了?谢谢!#include<stdio.h>intmain(){inta[8][8];inti,j,r... 找出每行里最大的数,如果它恰是当列最小的数,则输出
以下这个程序哪里错了?
谢谢!

#include <stdio.h>

int main()
{
int a[8][8];
int i,j,r,p=0,max,min,row,minnum,maxnum,col;
scanf("%d,%d",&row,&col);
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
scanf("%d",&a[i][j]);
}
}
for(j=0;j<row;j++)
{
for (i=0;i<col;i++)
{
if(i==0)
{
max=a[j][i];
}
if(i!=0&&max<a[j][i])
{
max=a[j][i];
maxnum=i;
for(r=0;r<row;r++)
{
if(r==0)
{
min=a[r][i];
}
if(r!=0&&min>a[r][i])
{
min=a[r][i];
minnum=r;
}
}
if(min==max)
{
printf("%d+%d",maxnum,minnum);
p=1;
}
}
}
}
if(p!=1)
{
printf("No");
}
return 0;
}
展开
 我来答
mayadong7349
推荐于2016-06-30 · TA获得超过2356个赞
知道大有可为答主
回答量:362
采纳率:0%
帮助的人:671万
展开全部

》改后的代码:》》:

代码不足之处:数组中的重复值不能太多,

你可以输入

3,4

1 2 3 4

4 5 3 6

3 5 6 7

或:

3,4

2 4 90 7

3 4 5 8

9 1 2 3

进行测试。

但不宜用

3,4

3 3 3 3

4 5 4 5

6 6 6 6

对这道题,也没必要吧标准定的那么高。

#include<stdio.h>

void main()

{

 int i,j,r,row,col,flag1,p=0,a[8][8],max,minnum;

 scanf("%d,%d",&row,&col);

 for(i=0;i<row;i++)

  for(j=0;j<col;j++)

   scanf("%d",&a[i][j]);

 for(i=0;i<row;i++)

 {

  max=a[i][0];

  for(j=0;j<col;j++)

   if(a[i][j]>max)

   {

    max=a[i][j];

    minnum=j;

   }

  for(r=0,flag1=1;r<row&&flag1;r++)

   if(max>a[r][minnum])

    flag1=0;

   if(flag1)

   {

    printf("%d+%d\n",i,minnum,max);

    p=1;

   }

 }

 if(p!=1)

  printf("NO\n");

}

#include <stdio.h>

int main()

{

 int a[8][8];

 int i,j,r,p=0,max,min,row,minnum,maxnum,col;

 scanf("%d,%d",&row,&col);

 for (i=0;i<row;i++)

  for (j=0;j<col;j++)

   scanf("%d",&a[i][j]);

 for(j=0;j<row;j++)

  for (i=0;i<col;i++)

  {

   if(i==0)max=a[j][i];//这句是把每行的第一个元素赋给max,即给max赋一个初值,故可以简化成max=a[j][0]。

   if(i!=0&&max<a[j][i])//可以简化成if(max<a[j][i])

   {

    max=a[j][i];//循环结束后,max存放的是第j行元素的最大值

    maxnum=i;//记录最大元素的列标记

   }//您少了这个括号

    for(r=0;r<row;r++)

    {

     if(r==0)min=a[r][i];//可以简化成min=a[0][i]。

     if(r!=0&&min>a[r][i])//可以简化成if(min>a[r][i])

     {

      min=a[r][i];

      minnum=r;//记录最小元素的行标记

     }

    }

    if(min==max)

    {

     printf("%d+%d",maxnum,minnum);//如果您是想输出满足条件的数的行标后然后输出列标的话,改成printf("%d+%d",minnum,maxnum);

     p=1;

    }

 }

 if(p!=1)

  printf("No");

 return 0;

}*/

/*//除了这些小错误外,程序算法上也有些错误

//错误一:

 如果数组的行数和列数相等,那用:

 for(j=0;j<row;j++)

  for (i=0;i<col;i++)

  {

   ……

  }

就够了,但由于行数和列数不等,所以你想通过这样写来达到编程目的:

   for(j=0;j<row;j++)

  for (i=0;i<col;i++)

  {

   1……

    for(r=0;r<row;r++)

    {

     2……

    }

   3……

  }

如果我没理解错的话,您是想通过

   for(j=0;j<row;j++)

  for (i=0;i<col;i++)

  {

   1……

    来找到一行中的最大值,并记录下其列下标

然后通过

for (i=0;i<col;i++)

  {

   1……

    for(r=0;r<row;r++)

    {

     ……

这个双重循环来找到列中的最小值,然后判断他们那是否相等

这样看似合理,实际上忽略了一个问题,那就是,由于

for (i=0;i<col;i++)

  {

   1……

    for(r=0;r<row;r++)

    {

     2……

    }

从属于for(j=0;j<row;j++),所以这个双重循环实际上和for (i=0;i<col;i++)这个单重循环是平行的

所以,当j取某个值时,for (i=0;i<col;i++)循环col次找到第j行的最大值时,此时循环

for (i=0;i<col;i++)

  {

   1……

    for(r=0;r<row;r++)

    {

     2……

    }

中的循环体2已经循环了col*row次。也就是说,当找列的最小值的双重循环循环row次时,找行的最大值的循环实际上只执行了1次。

所以您在执行结果中可能看到输出行列下标时,可能得到类似-828218781+1这样的结果。这是因为由于maxnum,minnum最初都没有赋值,而j变化一次输出一次结果。

在这期间,由于找最大值的循环只循环了一次,如果行的第一个数有小于max,那maxnum就得不到一个值,一个变量在没有赋值的情况下输出就得到一个乱七八糟的负数

我试着编了这个程序,这个循环结构我是这样处理的:

 for(j=0;j<8;j++)

 {

  ……

  for (i=0;i<col&&j<row;i++)//第一个循环,找出行中最大值,在这个循环结构中i作

   {

   ……

   }

            ……

  for(r=0;r<row&&j<col;r++)//第二个循环,找出列中最小值

   {

            ……

   }

  ……

 }

 这样找最大值和最小值的循环结构是平行的,也就是说第一个循环循环col次找到了最大值的同时,第二个循环恰好循环row次找到了最小值(实际上两个循环都只执行了min(row,col)次)

//错误二:算法错误.把上述错误一一改过之后,得到:(当然还有些不妥之处)

for(j=0;j<8;j++)

{

  for (i=0;i<col&&j<row;i++)

  {

   if(i==0)max=a[j][i];

   if(i!=0&&max<a[j][i])

   {

    max=a[j][i];

    maxnum=i;

   }

  }//循环结束后,i的值变为min(row,col)(row、col两者中的最小值)

  for(r=0;r<rowj<col;r++)

  {

   min=a[r][i];//改成min=a[r][maxnum];因为您找到最大值后,接下来要判断它是不是它这一列中的最小值

   if(r!=0&&min>a[r][i])

    {

    min=a[r][i];

    minnum=r;

    }

  }

  if(min==max)

    {

     printf("%d+%d",minnum,maxnum);

     p=1;

    }

 }

进一步修改:if语句不需要这样写了:

  for(r=0;r<rowj<col;r++)

  {

   min=a[r][maxnum];

   if(r!=0&&min>a[r][i])

    {

    min=a[r][i];

    minnum=r;

    }

  }

  if(min==max)

    {

     printf("%d+%d",minnum,maxnum);

     p=1;

    }

因为第一个循环结构已经找出了行的最大值,第二个循环结构仅仅判断这个最大值是不是他所在列的最小值,所以

您可以这样写:(参见标准答案)

for(r=0,flag1=1;r<row&&flag1;r++)

   if(max>a[r][maxnum])

   {

    flag1=0;

    minnum=r;

   }

   if(flag1)

   {

   printf("%d+%d",minnum,maxnum);

      p=1;

   }

设一个新的变量flag1,令他的初值为1;如果循环过程中,发现比a[r][maxnum];大的值,就领flag1=0,就不执行输出操作了

》参考答案:》》:

#define N 10

#define M 10

#include<stdio.h>

void main()

{

 int i,j,k,m,n,flag1,flag2,a[N][M],max,maxj;

 printf("请输入行数:\n");

 scanf("%d",&n);

 printf("请输入列数:\n");

 scanf("%d",&m);

 for(i=0;i<n;i++)

 {

  printf("第%d行的元素:\n",i);

  for(j=0;j<m;j++)

   scanf("%d",&a[i][j]);

 }

 for(i=0;i<n;i++)

 {

  for(j=0;j<m;j++)

   printf("%4d",a[i][j]);

  printf("\n");

 }

 flag2=0;

 for(i=0;i<n;i++)

 {

  max=a[i][0];

  for(j=0;j<m;j++)

   if(a[i][j]>max)

   {

    max=a[i][j];

    maxj=j;

   }

  for(k=0,flag1=1;k<n&&flag1;k++)

   if(max>a[k][maxj])

    flag1=0;

   if(flag1)

   {

    printf("第%d行第%d列的%d是鞍点。\n",i,maxj,max);

    flag2=1;

   }

 }

 if(!flag2)

  printf("没有鞍点。\n");

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式