佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1039|回复: 18

一个基本的数学程式!!!

[复制链接]
发表于 18-5-2006 11:57 AM | 显示全部楼层 |阅读模式
叫使用者输入10个数字,然后显示出最大的两个数字(只能用 if, while, for, else)
Example:-->

Please enter 10 integer number: 0 1 2 3 4 5 6 7 8 9
The two largest number is 9 and 8

可以吗??拜托了,我想很久都想不到。。。

这是我写的!!!但是有bug!!!

#include <stdio.h>
int main ()
{
int max,sec,num,counter=1;
printf ("Enter 10 integer number:";
while (counter<=10)
{
scanf ("%d",&num);
if (counter==1)
{if (num>max)
sec=max;
max=num;
if (num<=max)
sec=num;
counter++;}
else
{if (num>max)
sec=max;
max=num;
counter++;}
}
printf ("The two largest number are %d and %d\n",max,sec);

return 0;
}

回复

使用道具 举报


ADVERTISEMENT

发表于 18-5-2006 01:53 PM | 显示全部楼层
还米有测试过
#include <stdio.h>
int main ()
{
int max=0,sec=0,num,counter=1;
printf ("Enter 10 integer number:");
        while (counter<=10)
        {
        scanf ("%d",&num);
        if(num>max)
        {
                sec=max;
                max=num;
        }
        counter++;
        }
printf ("The two largest number are %d and %d\n",max,sec);

return 0;
}
回复

使用道具 举报

发表于 18-5-2006 01:55 PM | 显示全部楼层
我看不懂哦...
回复

使用道具 举报

发表于 18-5-2006 04:30 PM | 显示全部楼层
我的 C 已经忘到一干二净... 所以我用 Java 来写, 基本上是一样, 只要你把所有的 scanf 收录成一个 array 再来做以下的 code 即可.


int[] number_array = {100,67, 88, 41, 21, 32, 43, 99, 67, 82, 100, 32}; // 例子
int max = 0, sec = 0;
               
for (int x = 0; x < number_array.length; x++) {
                       
   if (number_array[x] > max) {
     sec = max;
     max = number_array[x];
   }
                               
   if ((sec == 0 || number_array[x] > sec) && number_array[x] < max)
     sec = number_array[x];

}


[ 本帖最后由 goatstudio 于 18-5-2006 04:32 PM 编辑 ]
回复

使用道具 举报

发表于 18-5-2006 04:45 PM | 显示全部楼层
原帖由 ahjing 于 18-5-2006 11:57 AM 发表
#include <stdio.h>
int main ()
{
int max,sec,num,counter=1;  
//你的max和sec没有给一个initial value,就去做比较,有可能会出错

printf ("Enter 10 integer number:";
while (counter<=10)
{
scanf ("%d",&num);
if (counter==1)
{if (num>max) //刚开始的时候,max = 什么?
sec=max;//刚开始的时候,max = 什么?
max=num;
if (num<=max)
sec=num;
counter++;}
else
{if (num>max)
sec=max;
max=num;/*这个max=num你是不是要放在if(num>max)里的?因为你没有括号{ },所以无论num>max or num<=max,他都会执行max=num;这样就有问题了*/
counter++;}
}
printf ("The two largest number are %d and %d\n",max,sec);

return 0;
}


#include <stdio.h>

int main ()
{
        int max,sec,num,counter=1;
        printf ("Enter 10 integer number:");
        while (counter<=10)
        {
                scanf ("%d",&num);
                if (counter == 1)
                {
                        max=num;
                }
                else if (counter == 2)
                {
                        if (num>max)
                        {
                                sec=max;
                                max=num;
                        }
                        else
                                sec=num;
                }
                else
                {
                        if (num>max)
                        {
                                sec=max;
                                max=num;
                        }
                        else if (num>sec)
                                sec=num;
                }
                counter++;
        }
        printf ("The two largest number are %d and %d\n",max,sec);
        return 0;
}

应该没问题了,但还没优化,应该把counter == 1和counter == 2 放在后面来比较,整体会快很多。
回复

使用道具 举报

发表于 18-5-2006 08:38 PM | 显示全部楼层
原帖由 goatstudio 于 18-5-2006 04:30 PM 发表
我的 C 已经忘到一干二净... 所以我用 Java 来写, 基本上是一样, 只要你把所有的 scanf 收录成一个 array 再来做以下的 code 即可.


int[] number_array = {100,67, 88, 41, 21,  ...


may be can change this:


  1.    if (number_array[x] > max) {
  2.      sec = max;
  3.      max = number_array[x];
  4.    }
  5.                                 
  6.    if ((sec == 0 || number_array[x] > sec) && number_array[x] < max)
  7.      sec = number_array[x];
复制代码


to


  1.   if( number_array[x] > sec) {
  2.    sec = number_array[x];
  3.    
  4.    if( sec > max) {
  5.      sec = sec ^ max;
  6.      max = sec ^ max;
  7.      sec = sec ^ max;
  8.    }
  9.   }
复制代码

[ 本帖最后由 astral 于 18-5-2006 08:42 PM 编辑 ]
回复

使用道具 举报

Follow Us
 楼主| 发表于 18-5-2006 11:30 PM | 显示全部楼层
谢谢qiyan 兄的相助!!!可是你写的程式有点复杂,有点看不明白!!
回复

使用道具 举报

发表于 18-5-2006 11:51 PM | 显示全部楼层

回复 #7 ahjing 的帖子

其实你只要把第一个数值assign去max~
然后拿第二个来比,当第二个大过第一个就把第一个assign去 sec
然后再把第二个assign去max一直做到最后就可以了!!
回复

使用道具 举报


ADVERTISEMENT

发表于 19-5-2006 12:22 AM | 显示全部楼层
ahjing,
这是你写的:
#include <stdio.h>
int main ()
{
   int max,sec,num,counter=1;
   printf ("Enter 10 integer number: " );
   while (counter<=10)
   {
      scanf ("%d",&num);
      if (counter==1)
      {
          if (num>max)
             //这里漏掉 “{”

             sec=max;
          max=num;   
             //这里漏掉 “}”
          if (num<=max)
             //这里漏掉 “{”
             sec=num;
          counter++;
             //这里漏掉 “}”
      }
      else
      {
         if (num>max)
             //这里漏掉 “{”
            sec=max;
         max=num;
              //这里漏掉 “}”
         这里应该再加以下几行
         else
         {
            if (num>sec)
            {
               sec = num;
            }
         }

         counter++; //这行不应该在这里
      }
      上面黑色 counter ++; 应该放在这里
   }
   printf ("The two largest number are %d and %d\n",max,sec);
   return 0;
}
回复

使用道具 举报

发表于 19-5-2006 07:36 PM | 显示全部楼层
  if (number_array[x] > max) {
     sec = max;
     max = number_array[x];
   }
                                
   if ((sec == 0 || number_array[x] > sec) && number_array[x] < max)
     sec = number_array[x];


看起來有點亂.


原帖由 疯牛 于 18-5-2006 11:51 PM 发表
其实你只要把第一个数值assign去max~
然后拿第二个来比,当第二个大过第一个就把第一个assign去 sec
然后再把第二个assign去max一直做到最后就可以了!!


可以直接在一開始把 max 和 sec 設定為 0

max = 0;
sec = 0;

while (...) {
  if( number_array[x] >= max) {
       sec = max;
       max = number_array[x];
  }
}
回复

使用道具 举报

发表于 19-5-2006 08:32 PM | 显示全部楼层
原帖由 flashang 于 19-5-2006 07:36 PM 发表


看起來有點亂.




可以直接在一開始把 max 和 sec 設定為 0

max = 0;
sec = 0;

while (...) {
  if( number_array >= max) {
       sec = max;
       max = number_array;
  }
}

这样可能会拿不到两个最大值

eg:16, 2, 8, 9, 13, 1
本来应该是16,13
结果变成了0, 16

我想暂时羊兄的方法比较好。。。只是compare的次数比较多,所以我把那部分换成swap...

1. if max > array[index] then max = array[index]
2. if max > sec then swap <---- *

[ 本帖最后由 astral 于 19-5-2006 08:38 PM 编辑 ]
回复

使用道具 举报

发表于 20-5-2006 09:55 AM | 显示全部楼层
原帖由 astral 于 19-5-2006 08:32 PM 发表

这样可能会拿不到两个最大值

eg:16, 2, 8, 9, 13, 1
本来应该是16,13
结果变成了0, 16

我想暂时羊兄的方法比较好。。。只是compare的次数比较多,所以我把那部分换成swap...

1. if max > array t ...


oops, 忘了第二大的比較
修改後 :

max = 0;
sec = 0;

while (...) {
  
  if( number_array[n] >= sec) {
       sec = number_array[n];
  }
  


  if( number_array[n] >= max) {
       sec = max;
       max = number_array[n];
  }
}

[ 本帖最后由 flashang 于 20-5-2006 09:58 AM 编辑 ]
回复

使用道具 举报

发表于 21-5-2006 02:56 AM | 显示全部楼层

回复 #11 astral 的帖子

那里有羊兄??
其实大家都忘记了~
楼主只是需要到一个简单的program
大家的解答都太复杂化了~
大家只需要给予他简单的概念就可以了~
而且大家给的答案都太复杂化的话,对于programming的初学者会造成一定的障碍!
回复

使用道具 举报

发表于 21-5-2006 09:22 AM | 显示全部楼层
羊兄=goatstudio
回复

使用道具 举报

发表于 22-5-2006 08:43 AM | 显示全部楼层
原帖由 疯牛 于 21-5-2006 02:56 AM 发表
那里有羊兄??
其实大家都忘记了~
楼主只是需要到一个简单的program
大家的解答都太复杂化了~
大家只需要给予他简单的概念就可以了~
而且大家给的答案都太复杂化的话,对于programming的初学者会造成一定的障碍!


没有复杂啊,都很直接明了,要花点心思看。

你#2楼post的,有点问题:
1。有负数的话就错。
2。第一个input如果是最大的话,sec永远 = 0。eg. 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
回复

使用道具 举报

发表于 22-5-2006 08:49 AM | 显示全部楼层
原帖由 flashang 于 20-5-2006 09:55 AM 发表


oops, 忘了第二大的比較
修改後 :

max = 0;
sec = 0;

while (...) {
  
  if( number_array >= sec) {
       sec = number_array;
  }
  

  if( number_array >= max) {
       sec  ...


嗯,如果是 -10,-9,-8,-7,-6,-5,-4,-3...就不行了
回复

使用道具 举报


ADVERTISEMENT

发表于 22-5-2006 10:39 AM | 显示全部楼层
原帖由 qiyan 于 22-5-2006 08:49 AM 发表


嗯,如果是 -10,-9,-8,-7,-6,-5,-4,-3...就不行了


max = &#8722;32768;
sec = &#8722;32768;

其實任何程式都有最大以及最小的限制
就看設計時考慮的因素
回复

使用道具 举报

发表于 22-5-2006 10:56 AM | 显示全部楼层
關于 #5 的例子

               if (counter == 1)
                {
                        max=num;
                }
                else if (counter == 2)
                {
                        if (num>max)
                        {
                                sec=max;
                                max=num;
                        }
                        else
                                sec=num;
                }
                else
                {
                        if (num>max)
                        {
                                sec=max;
                                max=num;
                        }
                        else if (num>sec)
                                sec=num;
                }
                counter++;


可以寫成
switch( counter ) {
    1:
        max=num;
        break;

    2:
        if (num>max) {
               sec=max;
               max=num;
        } else
               sec=num;
        break;

    default:
        if (num>max) {
               sec=max;
               max=num;
        } else if (num>sec)
               sec=num;
        break;
}

但是
只有輸入 第一個數字時才會執行 1: 第二個數字時才會執行 2:
第三開始全部執行 default
而如果預先設定 max, sec, 那麼 default 裡面的可以代替 1; 以及 2:
回复

使用道具 举报

发表于 22-5-2006 02:24 PM | 显示全部楼层
原帖由 flashang 于 22-5-2006 10:56 AM 发表
關于 #5 的例子



可以寫成
switch( counter ) {
    1:
        max=num;
        break;

    2:
        if (num>max) {
               sec=max;
               max=num;
        } else
...


楼主没说int是2 bytes。visual C++上, gnu上就不是2 bytes了。预先设定的话程序就有依赖了,写程序就要写generic的,通用的。能够就是用precompiler来define int下限,但在这里这样用又好像太复杂了。
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 22-9-2024 05:16 PM , Processed in 0.153857 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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