1.27日的学习小成果
一.数字黑洞问题
题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805302786899968
题目如下:
1)不足四位数要在前面补零的书写办法:
printf("%04d - %04d = %04d\n",max,min,n);
表明该数字一定占四个空位,若不足四位数则在数字前面补0
(代替了原来笨笨的枚举法)情况太多了,以后用上面方法
eg: if(n==0){ printf("%d - %d = 000%d\n",max,min,n); }else{ if(min<10){ if(n<1000){ printf("%d - 000%d = 0%d\n",max,min,n); }else { printf("%d - 000%d = %d\n",max,min,n); } }else if(min<100){ if(n<1000){ printf("%d - 00%d = 0%d\n",max,min,n); }else { printf("%d - 00%d = %d\n",max,min,n); } }else if(min<1000){ if(n<1000){ printf("%d - 0%d = 0%d\n",max,min,n); }else { printf("%d - 0%d = %d\n",max,min,n); } }else { if(n<1000){ printf("%d - %d = 0%d\n",max,min,n); }else { printf("%d - %d = %d\n",max,min,n); } } }
该题while()里不能写n!=6174&&n!=0如果这样写,当输入数字为6174时,就不会输出任何东西。
不符合题意。
正确的做法应该时while()里面写 1 即可,在循环体里面再判断是否为6174或者0,这样才能保证,每次输入都会进入循环,至少会输出一个东西。
错误代码如下:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int main() { int n,sum,i,j,k,max,min; int a[4]; cin>>n; while(n!=6174&&n!=0){ for(i=0;i<4;i++){ a[i]=n%10; n/=10; } sort(a,a+4); max=a[3]*1000+a[2]*100+a[1]*10+a[0]; min=a[0]*1000+a[1]*100+a[2]*10+a[3]; n=max-min; printf("%04d - %04d = %04d\n",max,min,n); } return 0; }
输出结果如下:
正确代码如下:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int main() { int n,sum,i,j,k,max,min; int a[4]; cin>>n; while(1){ for(i=0;i<4;i++){ a[i]=n%10; n/=10; } sort(a,a+4); max=a[3]*1000+a[2]*100+a[1]*10+a[0]; min=a[0]*1000+a[1]*100+a[2]*10+a[3]; n=max-min; printf("%04d - %04d = %04d\n",max,min,n); if(n==0||n==6174){ break; } } return 0; }
输出结果如下: