比如,用户输入:356827027232780 程序输出:成功(12分) view plaincopy to clipboardprint?
?? #include
?? #include
?? char *p;
?? p=(char *)malloc(sizeof(char)*20); ?? gets(p); ?? ?? ?? ??
int strlength=strlen(p)-1; int len=strlength;
int sum_odd=0;//奇数和 int sum_even=0;//偶数和
?? int temp_even=0;//2倍偶数临时变量 ?? for (int i=len;i>=0;i=i-2) ?? {
?? sum_odd+=p[i]-'0'; ?? }
?? len=strlength;
?? for (int i=len-1;i>=0;i=i-2) ?? ?? ?? ??
{
temp_even=2*(p[i]-'0'); if (temp_even>9) {
?? temp_even=temp_even-9; ?? } ?? ?? ?? ??
sum_even+=temp_even; }
if((sum_even+sum_odd)==0) printf(\成功\\n\
?? else
?? printf(\失败\\n\ ?? ?? }
10、程序设计
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的 差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循 环圈占1行。其中5位数全都相
同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照: [82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。(20分) view plaincopy to clipboardprint?
?? #include
?? int reg[200]; ?? int number=0;
?? /* ?? 返回num组合的最大值-最小值 ?? */
?? int sub(int num){ ?? int a[5];
?? for(int i=0;i<5;i++){ ?? a[i]=num; ??? num/=10; ??? }
??? //max sort
??? for (int i=0;i<5;i++){ ??? int max=i; ??? for(int j=i;j<5;j++) ??? {
??? if(a[j]>a[max]) ??? max=j; ??? }
??? int temp=a[max]; ??? a[max]=a[i]; ??? a[i]=temp;
??? }
??? int maxnum=10000*a[0]+1000*a[1]+100*a[2]+10*a[3]+a[4]; ??? int minnum=10000*a[4]+1000*a[3]+100*a[2]+10*a[1]+a[0]; ??? return maxnum-minnum; ??? }
??? /* ??? 查找某个具体的x是否与前面已经产生的值相等, ??? 即查找 是否发现黑洞 ??? */
??? int seek(int* tempreg,int x,int i){ ??? int isfound=0;
??? for (int k=0;k
??? if (tempreg[k]==x) ??? {
??? isfound=1;//发现黑洞 ??? break;
??? } ??? }
??? tempreg[i]=x; ??? return isfound; ??? }
??? /* ??? 当发现黑洞循环圈后
??? 查找检查该黑洞循环圈是否重复 ??? */
??? void addreg(int * tempreg,int next_num,int i){ ??? int found=0;
??? for (int j=0;j ??? if (tempreg[i]==reg[j]) ??? { ??? found=1; ??? return; ??? } ??? } ??? int k; ??? for ( k=i-1;tempreg[k]!=tempreg[i];k--); ??? for (k;k ??? reg[number++]=tempreg[k]; ??? } ??? reg[number++]=-1; ??? } ??? /* ??? 打印输出 ??? */ ??? void show(){ ??? int i=0; ??? printf(\ ??? printf(\ ??? while (reg[i++]!=0) ??? { ??? if(reg[i]!=-1){ ??? printf(\ ??? } ??? else{ ??? i++; ??? printf(\ ??? if (reg[i]!=0) ??? { ??? printf(\ ??? printf(\ ??? } ??? } ??? } ??? } ??? void main(){ ??? int num=10000; ??? int next_num;//存储最大值与最小值的差 ??? int found; ??? while(num<100000){ ??? next_num=num; ??? int i=0; ??? int tempreg[100]={0}; ??? for (i=0;i<100;i++){ ??? next_num=(sub(next_num)); ??? found=seek(tempreg,next_num,i); ??? if (found) ??? break; ??? } ??? if (found) ??? { ??? addreg(tempreg,next_num,i); ??? } ??? num++; ??? } ??? show();

