zapline 发表于 2010-2-28 13:30

编程小练习(4)

题目:

随机生成500个大于1小于1000的正整数

计算这500个数中10个最大的数之和

blueapplez 发表于 2010-2-28 15:21

#include "stdafx.h"
#include "windows.h"
#include "stdlib.h"
#include "time.h"

//不排序的方法里面用到的一个function
int GetMinIndex(WORD nSort[], int iCount)
{
    int iRet = 0;
    for (int i=1; i<iCount; i++)
    {
      if (nSort > nSort)
      {
            iRet = i;
      }
    }
    return iRet;
}

int main(int argc, char* argv[])
{
    WORD nSort = {0};
    srand(unsigned int(time(NULL)));
    for (int i=0; i<500; i++)
    {
      //2~999
      // 0~997 + 2=>2~999
      nSort = rand()%998 + 2;
    }
    WORD wCount = 0;

    //冒泡排序   
    for (i=0; i<500; i++)
    {
      WORD iminIndex = i;
      for (int j=i+1; j<500; j++)
      {
            if (nSort>nSort)
            {
                nSort ^= nSort;
                nSort ^= nSort;
                nSort ^= nSort;
            }
      }
    }
    for (i=490; i<500; i++)
    {
      wCount += nSort;
    }
    printf("冒泡排序的结果:%d \n", wCount);
   
    //下面是桶排序
    WORD wSortTemp = {0};
    for (i=0; i<500; i++)
    {
      wSortTemp]++;
    }
    int j=0;
    for (i=0; i<1000; i++)
    {
      while (wSortTemp--)
      {
            nSort = i;
            j++;
      }
    }
    wCount = 0;
    for (i=490; i<500; i++)
    {
      wCount += nSort;
    }
    printf("桶排序的结果:%d\n", wCount);

    //下面是不排序
    WORD wSortBig = {0};
    for (i=0; i<10; i++)
    {
      wSortBig = nSort;
    }
    for (i=10; i<500; i++)
    {
      int iIndexMin = GetMinIndex(wSortBig, 10);
      if (wSortBig < nSort)
      {
            wSortBig = nSort;
      }
    }
    wCount = 0;
    for (i=0; i<10; i++)
    {
      wCount += wSortBig;
    }
    printf("不排序的结果:%d\n", wCount);

    return 0;
}

blueapplez 发表于 2010-2-28 15:33

本帖最后由 blueapplez 于 2010-2-28 15:35 编辑

回复 2# blueapplez


    其实这样有点不能说明问题, 因为第一个排序就把原数组给修改了   下面这样比较能说明问题
#include "stdafx.h"
#include "windows.h"
#include "stdlib.h"
#include "time.h"

//不排序的方法里面用到的一个function
int GetMinIndex(WORD nSort[], int iCount)
{
    int iRet = 0;
    for (int i=1; i<iCount; i++)
    {
      if (nSort > nSort)
      {
            iRet = i;
      }
    }
    return iRet;
}

int main(int argc, char* argv[])
{
    WORD nSort = {0};   
    WORD wCount = 0;

    //初始化数据...
    srand(unsigned int(124272));
    for (int i=0; i<500; i++)
    {
      //2~999
      // 0~997 + 2=>2~999
      nSort = rand()%998 + 2;
    }

    //冒泡排序   
    for (i=0; i<500; i++)
    {
      WORD iminIndex = i;
      for (int j=i+1; j<500; j++)
      {
            if (nSort>nSort)
            {
                nSort ^= nSort;
                nSort ^= nSort;
                nSort ^= nSort;
            }
      }
    }
    for (i=490; i<500; i++)
    {
      wCount += nSort;
    }
    printf("冒泡排序的结果:%d \n", wCount);
   
    //重置数据...
    srand(unsigned int(124272));
    for (i=0; i<500; i++)
    {
      //2~999
      // 0~997 + 2=>2~999
      nSort = rand()%998 + 2;
    }
    //下面是桶排序
    WORD wSortTemp = {0};
    for (i=0; i<500; i++)
    {
      wSortTemp]++;
    }
    int j=0;
    for (i=0; i<1000; i++)
    {
      while (wSortTemp--)
      {
            nSort = i;
            j++;
      }
    }
    wCount = 0;
    for (i=490; i<500; i++)
    {
      wCount += nSort;
    }
    printf("桶排序的结果:%d\n", wCount);

    //重置数据...
    srand(unsigned int(124272));
    for (i=0; i<500; i++)
    {
      //2~999
      // 0~997 + 2=>2~999
      nSort = rand()%998 + 2;
    }
    //下面是不排序
    WORD wSortBig = {0};
    for (i=0; i<10; i++)
    {
      wSortBig = nSort;
    }
    for (i=10; i<500; i++)
    {
      int iIndexMin = GetMinIndex(wSortBig, 10);
      if (wSortBig < nSort)
      {
            wSortBig = nSort;
      }
    }
    wCount = 0;
    for (i=0; i<10; i++)
    {
      wCount += wSortBig;
    }
    printf("不排序的结果:%d\n", wCount);

    return 0;
}

chenyuzheng 发表于 2010-2-28 15:52

本帖最后由 chenyuzheng 于 2010-2-28 16:33 编辑

#include "stdio.h"
#include "stdlib.h"
#define size 500
void main()
{ int r,i,j,max,isum=0;
   int a;                     
                                                      //观看了楼上的代码后,真是醍醐灌顶,所以这里应该加句srand(time(0))函数比较合乎情理.
for(i=0;i<500;i++){
       r=1+rand()%999;//1到999之间的数
       a=r;}
for(i=0;i<10;i++)
{ for(j=0;j<500-i;j++)
      if(a<a)max=a;
      else max=a; //找出10个最大的数
isum=max+isum; }
printf("%d",isum);
}

我没有误解题目意思吧?
请指教!

zapline 发表于 2010-2-28 16:36

我没有误解题目意思吧?
请指教!
chenyuzheng 发表于 2010-2-28 15:52


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

{ for(j=0;j<500-i;j++)

      if(a<a)max=a;

      else max=a; //找出10个最大的数

isum=max+isum; }

这里排序/选最大算法有问题

题目是要 isum = 大小排名前十的10个数之和

chenyuzheng 发表于 2010-2-28 16:49

本帖最后由 chenyuzheng 于 2010-2-28 16:52 编辑

不是吧!我就找了最大的10个数,其他数字大小我就不找.

for(j=0;j<500-i;j++)

      {if(a<a)max=a;

      else max=a;}加括号吗?

zapline 发表于 2010-2-28 17:24

不是吧!我就找了最大的10个数,其他数字大小我就不找.

for(j=0;j
chenyuzheng 发表于 2010-2-28 16:49 http://bbs.52pojie.cn/images/common/back.gif


    for(j=0;j<500-i;j++)

      {if(a<a)max=a;

      else max=a;}

假设 4 2 1 3
用你的算法来获取最大的
4 < 2   不成立max = 4
2 < 1   不成立然后max就变成2了

所以最后得到的只是最后两个数的较大值

chenyuzheng 发表于 2010-2-28 17:32

本帖最后由 chenyuzheng 于 2010-2-28 17:59 编辑

#include "stdio.h"
#include "stdlib.h"
#include"time.h"
#define size 501
void main()
{ int r,i,j,max,isum=0,t;
int a;
srand(time(0));
for(i=0;i<500;i++)
{ r=2+rand()%998;
a=r;}
for(i=0;i<10;i++)
{ for(j=0;j<500-i;j++)
if(a<a)max=a;
else t=a,a=a,a=t;
isum+=max;
}
printf("%d\n",isum);
}:handshake:handshake:handshake..............
应该是这样了.
斑竹!!!这个应该没问题吧?

vienna 发表于 2010-2-28 17:45

冗长的是我的

#include <iostream>
#include <ctime>

int main() {
        srand(unsigned (time(NULL)));

        //随机500个数字
        unsigned rand_no;
        for (int i = 0;i < 500;++i) {
                rand_no = (rand()%998 + 2);
        }

        //冒泡啊冒泡
        for (int y = 0,temp;y < 500;++y) {
                for (int j = 499;j > y;j--) {
                        if (rand_no > rand_no) {
                                temp = rand_no;
                                rand_no = rand_no;
                                rand_no = temp;
                        }
                }
        }

        //排序测试
//        for (int x = 0;x < 500;++x){
//                std::cout << "" << rand_no;
//        }

        //输出
        unsigned sum = 0;
        for (int x = 0;x < 10;++x) {
                sum += rand_no;
        }
        std::cout << sum << std::endl;
}

这个抄考别人的
#include <iostream>
#include <algorithm>
#include <ITERATOR>
#include <vector>
#include <ctime>

struct rand_from_1_to_1000 {
        int operator () () {
                return (rand()%998 + 2);
        }
};

int main() {
        srand(unsigned (time(NULL)));
        std::vector <int> v;
        std::generate_n(std::back_inserter(v), 500, rand_from_1_to_1000());
        std::sort(v.begin(), v.end());

        unsigned sum = 0;
        for (int i = 499;i > 489;i--) {
                sum += v;
        }
        std::cout << sum << std::endl;
}

zapline 发表于 2010-2-28 18:09

..............
应该是这样了.
斑竹!!!这个应该没问题吧?
chenyuzheng 发表于 2010-2-28 17:32 http://bbs.52pojie.cn/images/common/back.gif


    还是有问题
如果最后一个数不是最大的十个数之一则结果会错误
另外效率也非常低
页: [1] 2
查看完整版本: 编程小练习(4)