算法中需要注意的是第二个数的生成,需要特殊处理。下面的程序在VC++.net下面测试通过:
#include <stdio.h>
#include <time.h>
//
// 随机产生三个数(必须是1~9),它们的和等于某个数(范围是14~19)。
// 第一个参数为这三个数的和(范围是14~19)
// 第二个参数用来输出生成的随机数
//
void GetRandom(int sum, int *num)
{
int temp;
srand((unsigned)time(NULL));
// 产生一个1~9的随机数
num[0] = 1 + rand() % 8;
// 然后获得下2个数的产生范围
temp = sum - num[0];
if (temp == 18)
{
num[1] = num[2] = 9;
}
else if (temp > 9)
{
// 如果temp > 9,为了保证num[2] <= 9,必须让num[1]在temp-9到9之间。
num[1] = (temp - 9) + rand() % (18-temp);
}
else
{
// 如果temp < 9,为了保证num[2] >= 1,必须让num[1]在1到temp-1之间。
num[1] = 1 + rand() % (temp - 1);
}
num[2] = temp - num[1];
}
void main(void)
{
int num[3] = {0, 0, 0};
GetRandom(14, num);
printf("1st number: %d/n", num[0]);
printf("2nd number: %d/n", num[1]);
printf("3rd number: %d/n", num[2]);
}