C语言编程实现西西弗斯串

来源:互联网 发布:贵金属软件下载 编辑:程序博客网 时间:2024/05/22 23:59
/*设定一个任意数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数,例如:1234567890,偶:数出该数数字中的偶数个数,在本例中为2,4,6,8,0,总共有 5 个。奇:数出该数数字中的奇数个数,在本例中为1,3,5,7,9,总共有 5 个。总:数出该数数字的总个数,本例中为 10 个。新数:将答案按 “偶-奇-总” 的位序,排出得到新数为:5510。重复:将新数5510按以上算法重复运算,可得到新数:134。如此反复操作下去,最后总是达到一个神秘的数,请编程求出这个神秘的数。
根据我自己的总结是这样的,最后这个数无论怎样在计算都是它自己了*/#include <stdio.h>#include<string.h>#define ARRAY_LEN 100/* 将整形转化为字符串 参数顺序为:字符串用来盛转化后的值,要转化的Value值,转化后字符的个数 */char *iToStr(char *s, int value, int *num){int i = 0;int modtmp = 0;int tmp = value;int j = 0;char ctmp = '0';*num = 0; /* 进入函数之后改写为0,防止对后面产生影响 *//* 将整数拆分,放到数组里面 */while (0 != tmp){modtmp = tmp % 10;s[i++] = modtmp + '0';tmp = tmp / 10;}s[i] = '\0'; /* 将最末尾置为0 *//* 因为转化过来之后,值是倒叙的,所以在反过来 */for (j = 0; j < i/2; j++){ctmp = s[j];s[j] = s[i-j-1];s[i-j-1] = ctmp;}*num = i;return s;}char* fun(char a[]){char *pTmp = a;int oddNum = 0;//奇数个数int evenNum = 0; //偶数个数int totalNum = 0;int i = 0;char cstr[20] = {0};char *pcstr = cstr;int cnum = 0; /*记录一个整数转化为字符串后有几个字符*/int tmp = 0;/* 将奇数 偶数 总数记录下来 */for (; *pTmp != '\0'; ++pTmp){tmp = *pTmp - '0';if (0 <= tmp && tmp <= 9){if(tmp % 2 == 0){evenNum++;}else{oddNum++;}totalNum++;}else{break;//遇到不是数字的字符了}}/* 将三个数构造成一个字符串 我想不出更好的办法了*/iToStr(pcstr, evenNum, &cnum);pcstr = pcstr+cnum;iToStr(pcstr, oddNum, &cnum);pcstr = pcstr+cnum;iToStr(pcstr, totalNum, &cnum);printf("%s \n", cstr);if (0 == strcmp(a, cstr)){/*如果计算一遍之后,该值等于他本身,那就返回 */memcpy(a, cstr, strlen(cstr));a[strlen(cstr)] = '\0';return a;}else{return fun(cstr);}}void main(){char a[ARRAY_LEN];printf("请输入一个数字串: ");int b = 0;fgets(a, ARRAY_LEN, stdin); //这样不会照成溢出printf("神秘的数是:%s\n",fun(a));}

原创粉丝点击