一:6174问题 poj 1350 Cabric Number Problem
注意看清这题题意:
1:若输入的不是四位数或者输入的四位数各个数字相同,那么输出“No!!”
2:循环到最大与最小值相差为6174或者0时结束循环,输出过程和答案。
下面是我按自己想的写的,纯暴力模拟(虽然可以过,但是真是长的乱的惨不忍睹),书上的貌似要更简单一些,但是总体思路也差不多,我就不改了(^o^)
#include<stdio.h> #include<algorithm> using namespace std; int main() { int n,ans,num,flag,s[1010],s1[1010],s2[1010]; while(scanf("%d",&n)!=EOF) { if(n==-1)break; printf("N=%d: ",n); int Q[5],T=n; Q[0]=T/1000;T=T%1000; Q[1]=T/100;T=T%100; Q[2]=T/10;T=T%10; Q[3]=T; if(Q[0]==Q[1]&&Q[1]==Q[2]&&Q[2]==Q[3]) n=0; if(n/1000!=0&&n/10000==0) { ans=0; num=1; flag=0; s[0]=n; while(n) { if(n==0||n==6174)break; int a[5],b,c=0,jin=0; b=n; if(b/1000!=0)//4 { a[0]=b/1000;b=b%1000; a[1]=b/100;b=b%100; a[2]=b/10;b=b%10; a[3]=b; sort(a,a+4); s1[num]=a[3]*1000+a[2]*100+a[1]*10+a[0]; s2[num]=a[0]*1000+a[1]*100+a[2]*10+a[3]; int shi=1; for(int i=0;i<4;i++) { int d=a[i]-a[3-i]-jin; if(d<0) d=d+10,jin=1; else jin=0; c=c+d*shi; shi=shi*10; } if(c!=0&&c!=6174) { ans++;n=c; for(int i=0;i<num;i++) { if(s[i]==c) { flag=1; break; } } if(flag==1){ans++;break;} else s[num++]=n; } else { s[num++]=c; ans++; break; } } else if(b/1000==0&&b/100!=0)//3 { a[0]=b/100;b=b%100; a[1]=b/10;b=b%10; a[2]=b; sort(a,a+3); s1[num]=a[2]*100+a[1]*10+a[0]; s2[num]=a[0]*100+a[1]*10+a[2]; int shi=1; for(int i=0;i<3;i++) { int d=a[i]-a[2-i]-jin; if(d<0) d=d+10,jin=1; else jin=0; c=c+d*shi; shi=shi*10; } if(c!=0&&c!=6174) { ans++;n=c; for(int i=0;i<num;i++) { if(s[i]==c) { flag=1; break; } } if(flag==1){ans++;break;} else s[num++]=n; } else { ans++; s[num++]=c; break; } } else if(b/100==0&&b/10!=0)//2 { a[0]=b/10;b=b%10; a[1]=b; sort(a,a+2); s1[num]=a[1]*10+a[0]; s2[num]=a[0]*10+a[1]; int shi=1; for(int i=0;i<2;i++) { int d=a[i]-a[1-i]-jin; if(d<0) d=d+10,jin=1; else jin=0; c=c+d*shi; shi=shi*10; } if(c!=0&&c!=6174) { ans++;n=c; for(int i=0;i<num;i++) { if(s[i]==c) { flag=1; break; } } if(flag==1){ans++;s[num++]=c;break;} else s[num++]=n; } else { ans++; s[num++]=c; break; } } else if(b/10==0)//1 { s1[num]=b; s2[num]=b; s[num++]=c; ans++; break; } } for(int i=1;i<=ans;i++) { printf("%d-%d=%d ",s1[i],s2[i],s[i]); } printf("Ok!! %d times ",ans); } else printf("No!! "); } return 0; }
二:字母重排,,,,oj上在哪里暂时搜不到,不过我记得我以前做过。所以我就先跳过这题了。