题:.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。
分析:首先54张牌分别用0到53 的数值表示并存储在一个整形数组里,数组下标代表纸牌所在的位置。接下来,遍历整个数组,在遍历过程中随机产生一个随机数,并以该随机数为下标的数组元素与当前遍历到的数组元素进行对换。时间复杂度为O(n) (注:所得到的每一种结果的概率的分母越大越好)
实现代码:
- /**
- Author:花心龟
- Blog:http://blog.youkuaiyun.com/zhanxinhang
- **/
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- void shuffle(int boke[]) //洗牌
- {
- int i,r,t;
- srand((unsigned)time(NULL)); //随机数种子
- for(i=0; i<54; i++)
- {
- r=(rand()%107)/2;
- //交换
- t=boke[i];
- boke[i]=boke[r];
- boke[r]=t;
- }
- }
- int main()
- {
- int boke[54],i;
- for(i=0;i<54;i++) //初始化纸牌
- boke[i]=i;
- printf("before shuffle:\n");
- for(i=0; i<54; i++) //打印
- printf("%d ",boke[i]);
- shuffle(boke); //洗牌
- printf("\nafter shuffle:\n");
- for(i=0; i<54; i++) //打印
- printf("%d ",boke[i]);
- return 0;
- }
题:写一个函数,检查字符串是否是整数,如果是,返回其整数值。
(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
分析:略
实现代码:
- /**
- Author:花心龟
- Blog:http://blog.youkuaiyun.com/zhanxinhang
- **/
- #include <stdio.h>
- long convert(const char *str) // 4行代码?下面我用了四句语句,不知当不当否,权当娱乐^^
- {
- long value=0,f=1; //f将决定value是否为负数
- if(*str == '-') str++,f=-1;
- for(;*str!='\0' && *str>='0' && *str<='9'; str++)
- value=value*10+(*str-'0');
- return *str=='\0'?value*f:0; //如果不为整数返回
- }
- int main()
- {
- char str0[] = "1234567";
- printf("%d\n",convert(str0));
- char str1[] = "4.56";
- printf("%d\n",convert(str1));
- char str2[] = "-1234567";
- printf("%d\n",convert(str2));
- char str3[] = "-4.56";
- printf("%d\n",convert(str3));
- return 0;
- }