//------定义bool类型及其常量true false------ typedefintbool; enum {false, true }; //------定义一个表示四位数字的结构体------ typedefstruct { int thousand; int hundred; int ten; int one; } Number; //------通过指针交换两个数字的值------ voidexchange(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } //------将数组转换为Number结构体------ voidfill(Number *num, int *arr){ num->thousand = arr[0]; num->hundred = arr[1]; num->ten = arr[2]; num->one = arr[3]; } //------冒泡排序,其中predicate是一个函数指针,用于决定两个数的“大小”------ voidbubbleSort(int *arr, int size, bool (*predicate)(int, int)){ for(int i=0; i<size; i++) { int *prev = arr+i; for(int j=i+1; j<size; j++) { int *current = arr+j; if((*predicate)(*prev, *current) == true) exchange(prev, current); } } } //------a小于b返回true,否则返回false------ boolless(int a, int b){ if(a<b) returntrue; elsereturnfalse; } //------a大于等于b返回true,否则返回false------ boolgreaterEqual(int a, int b){ if(less(a,b)==true) returnfalse; elsereturntrue; } //------返回两个Number相减的结果------ intdiff(Number *arr){ int bigger = arr->thousand*1000 + arr->hundred*100 + arr->ten*10 + arr->one; int smaller = (arr+1)->thousand*1000 + (arr+1)->hundred*100 + (arr+1)->ten*10 + (arr+1)->one; int result = bigger-smaller;
printf("%d - %d = %d\n", bigger, smaller, result); return result; } //------将一个四位数重新排序得到最大数和最小数,并返回大数减小数的结果------ //------ and then return the result of substraction------ intget(Number ori){ int num[4] = {ori.thousand, ori.hundred, ori.ten, ori.one};
Number ret[2]; bubbleSort(num, 4, less); fill(ret, num); bubbleSort(num, 4, greaterEqual); fill(ret+1, num); return diff(ret); } //------给定一个数字,检查其能否在给定的测试次数里运算为6174------ boolcompute(int num, int cnt){ if(cnt==0) returnfalse; //通过除法和求余数来分割四位数 Number n; int rem = 0; n.thousand = num/1000; rem = num%1000; n.hundred = rem/100; rem = rem%100; n.ten = rem/10; rem = rem%10; n.one = rem; //忽略四位数字全部相同的四位数 if(n.thousand==n.hundred && n.hundred==n.ten && n.ten==n.one) return0; int newNum = get(n); if(newNum == 6174) returntrue; elsereturn compute(newNum, cnt-1); } //------默认计算多少次------ int DEFAULT_CNT = 7; //------入口函数------ intmain(int argc, char **argv){ if(argc<2) { printf("No input\n"); return0; }
map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, "1");
reduce(String key, Iterator values):
// key: a word
// values: a list of counts
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));