【发布时间】:2011-06-09 17:03:23
【问题描述】:
我的部分作业基于一个数组(其大小由用户指定),其中包含从 1 到 10^10 的随机数。然后我们必须找到数组的第 k 个较小的数字。这是我尝试过的:
#include <cstdlib>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int choose_pivot(int i,int j )
{
return((i+j) /2);
}
// Print array
void printarr(int arr[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d\t",arr[i]);
}
// Find algorithm
int find1(int arr[],int left,int right,int k)
{
int i,j,pivot;
if (left==right)
return arr[left];
else
{
i=left;
j=right+1;
pivot= arr[left];
do
{
do {
i=i+1;
} while (arr[i]>=pivot);
do {
j =j-1;
} while (arr[j]<=pivot);
if (i<j)
swap(arr[i],arr[j]);
} while (j<=i);
}
swap(arr[left],arr[j]);
if (k==j)
return arr[j];
else if (k<j)
find1(arr,left,j-1,k);
else
find1(arr,j+1,right,k-j);
}
int main(int argc, char *argv[])
{
srand(time(NULL));
int n,i,fi,k;
printf("Give array's size:\n");
scanf("%d",&n);
int pin[n];
for (i=0;i<n;i++)
pin[i]=((rand()*rand()) % 1000000000) +1;
printf("Give k: \n");
scanf("%d",&k);
printf("The array contains the following numbers:\n\n");
printarr(pin,n);
fi=find1(pin,0,n-1,k);//find the k-th smallest number in the array
printf("The k-th smallest number is: %d",fi);
system("PAUSE");
}
正如您所见,10^10 是一个非常大的值,我做了一些其他的事情来用随机数填充数组。这是正确的吗?还有什么我可以做的吗? 我的第二个问题是关于查找算法的。它不起作用。谁能帮我解决这些问题?非常感谢
【问题讨论】:
-
你真的应该使用 rand()*rand()。这没有均匀分布。
-
@Kieth,你的意思是不应该,对吧?
-
我们真的不应该做一些孩子的作业,尤其是当他懒得尝试编译的时候。
-
@Tim 我的大多数前学校同事只是在编写完代码后才编译他们的代码(他们中的大多数也只是在那时才保存......)。我认为这是刚开始学习编程的人的共同特征。然而,这并不会让他变得懒惰。正如你所看到的,他试了一下,并带着一些关于 他的 代码的问题来到这里。另一件事是,通常,如果一个人将他的代码识别为作业,那么回答他的人只会给他提示,所以没有人在做作业。
-
@Alin 我完全可以帮助那些被困在家庭作业中的人——我只想强调我们不应该提供答案。我认为发布“这是我的编译错误,但我不明白”是完全有效的。然而,pr_prog84 只是发布了他的代码并说“它不起作用”。这对我来说是一个危险信号。