首页 > 代码库 > 出数据

出数据

ACM竞赛中题目的数据一般都可以用随机生成法+手动法。随机生成法主要用到随机函数rand().
int rand(void);
返回一个伪随机数a,a的取值范围是[0,RAND_MAX]。每次调用rand函数,都会返回内部算法生成的看似
不相关的一连串的数。该算法使用随机种子,随机种子的值可以用srand()函数初始化。
RAND_MAX是<cstdlib>头文件里定义的常量, 其值为32767.
例:生成范围是[a,b]的一个随机数,其中a > -1 , b < 32768.

int value;
srand();
value
= rand()%(a-b+1) + b;

如果要生成有负数的随机数,可以减去一个常数。
如果要生成64位的数,两个32位的随机数相乘。
类似的,可以根据情况而做相应的变换。
如果数据对象是字符串,大可以找一些英文文章。
总之呢,随机数的方法只是一个基本方法,数据的来源可以是很广泛的,这要根据你题目的需要而定。

当然,测试数据要尽可能的hack掉不正确的程序,所以出题人要尽可能的考虑到每一个边角数据,而边角数据
主要是手动法了。

下面看个实例:

HDOJ-2096

先写数据生成程序:

生成数据程序:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main()
{
    int a, t=100;
    freopen("in.txt", "w", stdout); //打开文件in.txt,进行写操作,这样printf()输出的信息将保存在文件里。


    /* initialize random seed: */
    srand(time(NULL));
    a = rand();
    printf("%d\n", t);
    while (t--) {
        a = rand();
        printf("%d ", a);
        a = rand();
        printf("%d\n", a);
    }
    return 0;


然后用正确的解题程序(或称为标程),运行数据,并生成输出文件out.txt:
#include "stdio.h"

int main() {
    //打开输入输出文件
    freopen("in.txt", "r", stdin);
    freopen("out.txt","w", stdout);
    //代码部分
    int a, b, sum;
    int n;
    scanf("%d", &n);
    while (n--) {
        sum = 0;
        scanf("%d %d", &a, &b);
        if (a >= 100) a %= 100;
        if (b >= 100) b %= 100;
        sum = a + b;
        if (sum >= 100)
            sum %= 100;
        printf("%d\n", sum);
    }
    return 0;
}

本文转自:http://www.cnblogs.com/superbin/archive/2011/03/27/1997089.html