最近关注了CSDN的程序员小灰,前两天发了个红包算法看着还蛮有意思的,自己使用C实现一下!(PS:后来才发现早已烂大街了……o(╥﹏╥)o)
规则:
1. 所有人抢到金额之和等于红包金额,不能超过,也不能少于
2. 每个人至少抢到一分钱
3. 要保证所有人抢到金额的几率相等
先做好准备:
#include<stdio.h> #include<stdlib.h> #include<time.h> #define random(x) (rand()%x) struct Node { float Money; struct Node *Next; }; typedef struct Node *List; List CreateList(); void Add(float current, List *last); int Find(int money, List L); void Sort(List L); void PrintList(List L); void Algorithm1(float money, int num, List L); void Algorithm2(float money, int num, List L); void Algorithm3(float money, int num, List L); int main() { List L= CreateList(); //Algorithm1(100,10,L); //Algorithm2(100, 10, L); //PrintList(L); Algorithm3(100, 10, L); } List CreateList() { List L; L = (List)malloc(sizeof(List)); L->Next = NULL; return L; } void Add(float current,List *last) { List L = (List)malloc(sizeof(List)); L->Money = current; L->Next = NULL; (*last)->Next = L; (*last) = L; } int Find(int money,List L) { List ptr = L->Next; while (ptr) { if (ptr->Money == money) { return 1; } ptr = ptr->Next; } return 0; } void Sort(List L) { List cur = NULL, tail = NULL; cur= L->Next; while (cur->Next!=tail){ int flag = 1; while (cur->Next != tail){ if (cur->Money > cur->Next->Money) { float tmp = cur->Money; cur->Money = cur->Next->Money; cur->Next->Money = tmp; flag = 0; } cur = cur->Next; } if (flag) break; tail = cur; //下一次遍历的尾结点是当前结点(仔细琢磨一下里面的道道) cur = L->Next; //遍历起始结点重置为头结点 } } void PrintList(List L) { List ptr = L->Next; int i = 0; while (ptr) { printf("第%d人抽中金额:%.2f\n", ++i,ptr->Money); ptr = ptr->Next; } }