poj1350 Cabric Number Problem

该博客讨论了POJ1350题目,即给定一个四位数,找出其数字排列的最大值和最小值并相减,重复此过程直到差为0或6174。博主分享了在解决过程中遇到的字符串与数字转换的优化方法,以及读题的重要性。
摘要由CSDN通过智能技术生成

1350题给定一个四位数(4位数字不全相同),得到四个数字排出的最大值和最小值,最大值减最小值后得到的数字继续重复,直到所得的差为0或者6174结束。

此题感觉自己的字符串转与数字的转换做繁了,可以用atoi()和sprintf()函数,另外自己开始没有判断输入的是否是四位数,导致提交时提示output limit exceeded,搞了1个小时才发现这问题,读题还是非常重要啊!

#include<stdio.h>
#include<string.h>

int compar_a(const void *a, const void *b){
	return (*(char *)a - *(char * )b);
}

int compar_d(const void *a, const void * b){
	return (*(char * )b- *(char *)a);
}

char s[5];
char max[5];
char min[5];

void do_minus(char * max, char * min){
	int i=1;
	int num_max,num_min,result;
	num_max=(max[0]-'0')*1000+(max[1]-'0')*100+(max[2]-'0')*10+(max[3]-'0');
	num_min=(min[0]-'0')*1000+(min[1]-'0')*100+(min[2]-'0')*10+(min[3]-'0');
	result=num_max-num_min;
	printf("%d-%d=%d\n",num_max,num_min,result);
	while((result != 6174)&&(result != 0)){
		if(result/1000){
			s[0]=result/1000+'0';
			s[1]=(result%1000)/100+'0';
			s[2]=(result%100)/10+'0';
			s[3]=result%10+'0';
		}
		else{
			s[0]=(result%1000)/100+'0';
			s[1]=(result%100)/10+'0';
			s[2]=result%10+'0';
			s[3]='\0';
		}
		qsort(s,strlen(s),1,compar_d);
		strcpy(max,s);
		qsort(s,strlen(s),1,compar_a);
		strcpy(min,s);
		if(0 == strcmp(max,min)){
			i++;
			printf("%s-%s=0\n",max,min);
			break;
		}
		num_max=(max[0]-'0')*1000+(max[1]-'0')*100+(max[2]-'0')*10+(max[3]-'0');
		num_min=(min[0]-'0')*1000+(min[1]-'0')*100+(min[2]-'0')*10+(min[3]-'0');
		result=num_max-num_min;
		printf("%d-%d=%d\n",num_max,num_min,result);
		i++;
	}	printf("Ok!! %d times\n",i);
			
}

void main(){
	gets(s);
	while(strcmp(s,"-1")){
		printf("N=%s:\n",s);
		qsort(s,strlen(s),1,compar_d);
		strcpy(max,s);
		qsort(s,strlen(s),1,compar_a);
		strcpy(min,s);
		if(0 == strcmp(max,min)||(4 != strlen(s)))
			printf("No!!\n");
		else
			do_minus(max,min);
		gets(s);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值