user-0 提问: 关于1019-PAT(乙级) 数字黑洞，请教各位前辈

回复:
user: user-1
content: c!=4你能正确输出非递减的4位数吗

user: user-0
content: 引用 12 楼 qq_28449187 的回复:[quote=引用 11 楼 黑白判官 的回复:] [quote=引用 10 楼 qq_28449187的回复:][quote=引用 9 楼 黑白判官 的回复:] [quote=引用 8 楼 qq_28449187的回复:][quote=引用 7 楼 黑白判官 的回复:] [quote=引用 4 楼 qq_28449187的回复:][quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 也就是说它里面不能保证每个值都是0[/quote] 我给2个函数里的a都赋初值a={NULL},还是错误的[/quote] int类型你赋NULL？ [/quote]int a[10]={0};这样吗？话说其实我觉得不是a的问题[/quote] 除了数组还有c，c的值得为4[/quote]哇噻真的对了，大佬好强！不过为什么一定要c等于4啊?[/quote]我懂了！！！谢谢大佬！！！

user: user-0
content: 引用 11 楼 黑白判官 的回复:[quote=引用 10 楼 qq_28449187的回复:][quote=引用 9 楼 黑白判官 的回复:] [quote=引用 8 楼 qq_28449187的回复:][quote=引用 7 楼 黑白判官 的回复:] [quote=引用 4 楼 qq_28449187的回复:][quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 也就是说它里面不能保证每个值都是0[/quote] 我给2个函数里的a都赋初值a={NULL},还是错误的[/quote] int类型你赋NULL？ [/quote]int a[10]={0};这样吗？话说其实我觉得不是a的问题[/quote] 除了数组还有c，c的值得为4[/quote]哇噻真的对了，大佬好强！不过为什么一定要c等于4啊?

user: user-1
content: 引用 10 楼 qq_28449187的回复:[quote=引用 9 楼 黑白判官 的回复:] [quote=引用 8 楼 qq_28449187的回复:][quote=引用 7 楼 黑白判官 的回复:] [quote=引用 4 楼 qq_28449187的回复:][quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 也就是说它里面不能保证每个值都是0[/quote] 我给2个函数里的a都赋初值a={NULL},还是错误的[/quote] int类型你赋NULL？ [/quote]int a[10]={0};这样吗？话说其实我觉得不是a的问题[/quote] 除了数组还有c，c的值得为4

user: user-0
content: 引用 9 楼 黑白判官 的回复:[quote=引用 8 楼 qq_28449187的回复:][quote=引用 7 楼 黑白判官 的回复:] [quote=引用 4 楼 qq_28449187的回复:][quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 也就是说它里面不能保证每个值都是0[/quote] 我给2个函数里的a都赋初值a={NULL},还是错误的[/quote] int类型你赋NULL？ [/quote]int a[10]={0};这样吗？话说其实我觉得不是a的问题

user: user-1
content: 引用 8 楼 qq_28449187的回复:[quote=引用 7 楼 黑白判官 的回复:] [quote=引用 4 楼 qq_28449187的回复:][quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 也就是说它里面不能保证每个值都是0[/quote] 我给2个函数里的a都赋初值a={NULL},还是错误的[/quote] int类型你赋NULL？

user: user-0
content: 引用 7 楼 黑白判官 的回复:[quote=引用 4 楼 qq_28449187的回复:][quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 也就是说它里面不能保证每个值都是0[/quote] 我给2个函数里的a都赋初值a={NULL},还是错误的

user: user-1
content: 引用 4 楼 qq_28449187的回复:[quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 也就是说它里面不能保证每个值都是0

user: user-1
content: 引用 4 楼 qq_28449187的回复:[quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 但是你a那个数组a里面是没有初值的

user: user-1
content: 引用 4 楼 qq_28449187的回复:[quote=引用 3 楼 qq_28449187 的回复:] [quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果[/quote] 但是你a那个数组a里面是没有初值的

user: user-0
content: 引用 3 楼 qq_28449187 的回复:[quote=引用 1 楼 黑白判官 的回复:] 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数[/quote] 996 0996 - 0699 = 0297 0972 - 0279 = 0693 0963 - 0369 = 0594 0954 - 0459 = 0495 这是测试结果

user: user-0
content: 引用 1 楼 黑白判官 的回复:你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束 我在那个函数里面用c来记录了位数，应该没问题吧，我输入三位数也能运行出三位数黑洞数

user: user-2
content: /******************************************************************** 	Description: PAT(B)1019数字黑洞 	Score: 20 	Run Time: 2ms 	Author: user-2 	Id: pfdvnah 	Date: 2019-11-10 15:49:10 ********************************************************************/ #include <stdio.h> #include <stdlib.h>  #define N_LEN 4  void output_step(int result, int max, int min); int compare(const int* a, const int* b); int step(int result);  int main(void) { 	int n; 	// scanf_s("%d", &n); 	scanf("%d", &n); 	int result = n; 	do { 		result = step(result); 	} while (6174 != result && 0 != result); 	return 0; } void output_step(int result, int max, int min) { 	if (0 == result) { 		printf("%04d - %04d = 0000\n", max, min); 	} else { 		printf("%04d - ", max); 		printf("%04d = ", min); 		printf("%04d\n", result); 	} } int compare(const int* a, const int* b) { 	return (*a) < (*b) ? -1 : 1; } int step(int result) { 	int arr[N_LEN]; 	for (int i = 0; i < N_LEN; ++i) { 		arr[i] = result % 10; 		result /= 10; 	} 	qsort(arr, N_LEN, sizeof(int), compare); 	int max = 0; 	for (int i = N_LEN - 1; i >= 0; --i) { 		max = max * 10 + arr[i]; 	} 	int min = 0; 	for (int i = 0; i < N_LEN; ++i) { 		min = min * 10 + arr[i]; 	} 	result = max - min; 	output_step(result, max, min); 	return result; }

user: user-1
content: 你那个两个函数有问题。如果 r 不是四位数，那个 while 循环次数就会少于4，那你最后的返还值就会错了。 你要么把数组赋初值，要么就规定它必须循环满四次才能结束