3 条题解
-
1
C++ :
#include <iostream> #include <cstdio> using namespace std; int maxn(int m); int minn(int m); int main() { int n; scanf("%d",&n); int max1,min1,step=0; while(n!=6174){ max1=maxn(n); min1=minn(n); n=max1-min1; step++; } printf("%d\n",step); return 0; } int maxn(int m) { int a=m/1000; int b=m/100%10; int c=m%100/10; int d=m%10; if(b>a){swap(a,b);} if(c>a){swap(a,c);} if(d>a){swap(a,d);} if(c>b){swap(b,c);} if(d>b){swap(b,d);} if(d>c){swap(c,d);} return a*1000+b*100+c*10+d; } int minn(int m) { int a=m/1000; int b=m/100%10; int c=m%100/10; int d=m%10; if(b<a){swap(a,b);} if(c<a){swap(a,c);} if(d<a){swap(a,d);} if(c<b){swap(b,c);} if(d<b){swap(b,d);} if(d<c){swap(c,d);} return a*1000+b*100+c*10+d; }
-
0
#include<bits/stdc++.h> using namespace std; const int N=10; int main() { int s1[N];//正数数 int s2[N];//反向数 int s3[N];//不符合条件时正数减反向 int s4[N];//正着储存a string a; cin>>a; int cnt=1; for(int i=1;i<=4;i++) { s4[i]=a[i-1]; } for(int j=0;;j++) { sort(s4+1,s4+5); for(int i=1;i<=4;i++) { s1[i]=s4[i]; } for(int i=1;i<=4;i++) { s2[i]=s4[5-i]; } int o=s1[1]*1000+s1[2]*100+s1[3]*10+s1[4]; int t=s2[1]*1000+s2[2]*100+s2[3]*10+s2[4]; if(t-o==6174) { cout<<cnt; break; } else{ cnt++; for(int i=4;i>=1;i--) { s3[i]=s2[i]-s1[i]; if(s3[i]<0) { s3[i-1]--; s3[i]=s3[i]+10; } } for(int i=1;i<=4;i++) { s4[i]=s3[i]; } } } }
原理如图 以4312为例
-
0
#include<bits/stdc++.h> using namespace std; bool cmp(int a,int b){ return a>b; } int main() { int n,a,b,d[4],sum=0,maxn=0,minn=0; cin>>n; b=n; while(a!=6174) { sum++; for(int i=0;i<4;i++) { d[i]=b%10; b=b/10; } sort(d,d+4,cmp); for(int i=0;i<4;i++) { maxn=maxn*10+d[i]; } sort(d,d+4); for(int i=0;i<4;i++) { if(d[i]==0)continue; minn=minn*10+d[i]; } a=maxn-minn; b=a; maxn=0; minn=0; } cout<<sum; }
- 1
信息
- ID
- 123
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 66
- 已通过
- 43
- 上传者