1019 数字黑洞(用C语言精简的解决每日两题)

1019 数字黑洞(用C语言精简的解决每日两题)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int compare(const void *a,const void *b){  //qsot的第四个参数,按递减顺序
    return (*(char *)b)-(*(char *)a);
}
char *srev(char *n){  //字符串的反转函数,返回值是反转后的字符串
    int i=0;
    int j=strlen(n)-1;
    char temp;
    while(i<j){
        temp=*(n+j);
        *(n+j)=*(n+i);
        *(n+i)=temp;
        i++;
        j--;
    }
    return n;
}
int main(){
    char n[5];
    int answer=0;
    scanf("%s",n);
    strncat(n,"000",4-strlen(n));  //一个坑人点,如果输入1,需要把它变成1000
    while(answer!=6174){ //6174是循坏结束点
        qsort(n,4,sizeof(char),compare);  //排序
        answer=atoi(n)-atoi(srev(n));  //计算差值 ,注意这里字符串已经反转过一次
        if(answer==0){  //如果结果是0,说明字符串是1111,2222这样的,直接输出0000,然后结束循环
            printf("%s - %s = 0000\n",n,n);
            break;
        }
        else{  
            printf("%s -",srev(n)); //因为前面已经翻转一次,所以这里要反转
            printf(" %s =",srev(n));  //前面已经翻转两次,这里也要翻转
            printf(" %.4d\n",answer);  //“注意每个数字按 4 位数格式输出”
        }
        sprintf(n,"%.4d",answer);  //要把每次算出的差值作为新的字符串进行下一次循环
    }
return 0;
}

1.开始发现了一个函数叫strrev,但不是c的标准库函数,所以自己就写了一个srev

2.一个坑人点,如果输入的数不是四位,需要在后面补上0补成四位(真的真的真的很坑人)

3.注意输出格式,一定也要是四位的,不够前面补0

4.为什么不写成 printf("%s - %s = %.4d\n",srev(n),srev(n),answer)呢?因为这样写不行

上一篇:【1019】浮点数向零舍入


下一篇:SZTUOJ 1019.总之就是不太可爱