PDA

View Full Version : Cac' bac' vao` giup' em voi'



emlanewbie
26-08-2009, 08:09
Em có 1 dãy số gồm 10 chữ số: 0,1,2,3,4,5,6,7,8,9

Em muốn xuất ra 1 file .txt (hoặc excel, word gì cũng được) 1 loạt số chỉnh hợp chập 7 của 10 chữ số đó, mỗi số cách nhau 1 dấu "phẩy" (,) hoặc dấu "chấm" (.) thì em phải làm sao? dùng chương trình gì để làm.

Em nhắc lại công thức tính Chỉnh hợp lặp để bác nào quên còn nhớ lại:
Chỉnh hợp lặp chập k của n chữ số được tính bằng công thức: A=n mũ k
Trường hợp của em sẽ có là n = 10 mũ 7 số

Em cần xuất ra file chứa số random, mỗi lần xuất ra là thứ tự sắp xếp nó khác nhau chứ không giống nhau như đúc, mỗi số các nhau 1 dấu chấm hoặc dấu phẩy hay gạch ngang gì đó cũng được

Nhờ các bác ra tay giúp em. Xin cảm ơn các bác!

[=========> Bổ sung bài viết <=========]

Các bác ơi.........................

nhadautu
30-08-2009, 15:52
Up lên bác nào biết ra tay giúp nè

emlanewbie
30-08-2009, 17:48
Em xin các bác, các bác ra tay giúp em với...

cal
01-09-2009, 14:47
Nhận xét:
Các chỉnh hợp cần tìm là tập các số từ 0 đến (10^7 - 1). Ở đây, nếu số ít hơn 7 chữ số, sẽ được thêm các số 0 bên trái để có chiều dài 7.
Thí dụ:
số 1 ==> chỉnh hợp tương đương là 0000001
số 123456 ==> chỉnh hợp tương đương là 0123456

Giải thuật:
- Tạo mảng (10^7) phần tử, chứa các số từ 0 - (10^7-1)
- Sinh ra 1 cặp số ngẫu nhiên i1 & i2, hoán chuyển giá trị của 2 phần tử mảng ở vị trí i1 & i2. Lặp lại nhiều lần để xáo trộn mảng.
- Xuất mảng ra file. (vận dụng format string của hàm fprintf để ghép thêm số 0 vào những số ít hơn 7 chữ số)

Vấn đề phát sinh:
hàm rand có phạm vi 0 - 32767 ==> không đủ bao trùm cho (10^7) phần tử mảng ==> tạo ra hàm rand32. (thật ra hàm rand32 tôi viết chỉ sinh được các số từ 0 - (10^30-1), đáng được gọi rand30 hơn là rand32 :) )



/* =================================
main.c
tested with Dev-C++ and Visual C++ 2008
================================= */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <conio.h>

int rand32()
{
return (rand() << 15) | rand();
}

int main(int argc, char *argv[])
{
int i, count;
int* ar;
FILE * pFile;

// so phan tu cua tap chinh hop
count = (int)pow(10.0, 7.0);

// tao mang chua cac so tu 0 den (count-1)
ar = (int*)malloc(count*sizeof(int));
for (i = 0; i < count; i++)
ar[i] = i;

// hoan chuyen cac phan tu mang de tao su ngau nhien.
srand(time(NULL));
for (i = 0; i < 2 * count; i++)
{
int i1 = rand32() % count;
int i2 = rand32() % count;
int temp = ar[i1];
ar[i1] = ar[i2];
ar[i2] = temp;
}

// xuat mang ra file
pFile = fopen ("d:\\out.txt", "w");
if (pFile != NULL)
{
for (i = 0; i < count; i++)
{
fprintf(pFile, "%07d", ar[i]);
if (i < count - 1)
fputs(",", pFile);
}
fclose (pFile);
}

free(ar);
return 0;
}

Lưu ý: code trên viết cho môi trường HĐH 32 bit (không chạy được với Turbo C for DOS)