1019 数字黑洞 (20分)/1069 The Black Hole of Numbers (20分)
//之前是想这样写的,用sscanf和sprintf。但是部分错误,有两个点错误,一个运行时错误 PS:sprintf转成的是字符串不是单个字符吗?。因为是字符串转,所以忽略了如1000-0001=900等问题,还 超时了
// 老老实实的用各位相加吧
来自大佬的告诫:https://www.cnblogs.com/daker-code/p/12169036.html
1.结束程序的情况有两个,while (n != 6174 && n != 0)
2.注意一下输入是6174的情况。如果你写的不是先减后判断的退出条件的话那就出现直接推出的情况,但理论上应该输出7641 - 1467 = 6174,所以要么用do……while,
要么换一下逻辑顺序,先减再判断
3.注意一下1000 这种东西输出的时候得是 1000 - 0001 = 999
#include<algorithm> #include<cstdio> #include<cstring> using namespace std; bool cmp(char a,char b){ return a>b; } int main () { int a,maxn,minn; scanf("%d",&a); char num[5]; while(1){ sprintf(num, "%d",a); sort(num,num+4); sscanf(num, "%d",&minn); sort(num,num+4,cmp); sscanf(num, "%d",&maxn); a=maxn-minn; printf("%04d - %04d = %04d\n",maxn,minn,a); if(a==0||a==6174) break; } return 0; }
#include<cstdio> #include<algorithm> using namespace std; bool cmp(char a,char b){ return a>b; } int main(){ char str[10]; int n; int a,b,ans; scanf("%d",&n); sprintf(str,"%04d",n); do{ sort(str,str+4,cmp); sscanf(str,"%d",&a); printf("%s - ",str); sort(str,str+4);// sscanf(str,"%d",&b); printf("%s = ",str); sprintf(str,"%04d",a-b); printf("%s\n",str); }while(a-b!=6174&&a-b!=0); return 0; }
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; bool cmp(int a,int b){ return a>b; } void to_array(int n,int num []) { for(int i=0;i<4;i++) { num[i]=n%10; n/=10; } } int to_number(int num[])//void to_number(int num[],int n)这样写就错了; { int sum=0; for(int i=0;i<4;i++){ sum=sum*10+num[i];//注意sum*10 这才是 x10 累加 的正确写法 } return sum;//记得返回总值; } int main () { int a,maxn,minn; cin>>a; int num[5]; while(1){ to_array(a,num); //是num 不是num[5]!!! sort(num,num+4); minn=to_number(num); sort(num,num+4,cmp); maxn=to_number(num); a=maxn-minn; // cout<<maxn<<"-"<<minn<<"="<<a<<endl; // 这种写法不能输出如7850 转换的 0587 ,会错误输出587 printf("%04d - %04d = %04d\n",maxn,minn,a);// 别忘了换行符 // 这里有个比较狗的格式错误“"%04d-%04d=%04d"” (已改) if(a==0||a==6174) break; } return 0; }
唯有学习才能求生