CodeSky 代码之空

随手记录自己的学习过程

分类:C

C 判断一个数是否是完全平方数

2014-11-01 20:11分类: C评论: 3

若一个整数a为另一个整数b的平方,则称a为完全平方数,现在输入n个正整数,判断他们中有几个是完全平方数

这道底在小数据的时候可能比较简单,但遇到大数据的时候,就显得心有余而力不足了。

首先我们需要用long long,这种时候,我第一是想到用减法,开平方,用a-(int)a的方法,结果发现数字小于一定程度的时候,会近似的等于0,这个时候系统也通过了,默认其等于0,就算改成0.0也无法改变这个事实。

相等当然也是行不通的,理论上而言,永远都不能相信浮点数,浮点数不应该作为条件判断。

于是最终我们想到了用转换后的数字乘法,如果相等就是OK哒,如果不等的话证明开平方是小数。

这里可以用(long long)转换,也可以直接声明一个long long的变量,来存平方后的数,会自动转换为long long的值。

阅读更多 →

C 今天我们来聊聊栈与括号配对

2014-10-31 23:01分类: C评论: 0

很巧的是,之前这两者我都有说过,虽然当时没有深刻的认识,只是很新鲜的看到了之后写了两篇日志罢了,没想到终有一天,我还是和他们俩见面了,而且是合体版。

栈:关于栈的进出 括号匹配:C 一个程序查找基本语法错误

当然,这两篇和数据结构完全没有关系,大致上是科普中的科普了。

我们来看看这次的题目:

表达式中可能出现花括号{}、方括号[]、园括号(),从键盘输入一个表达式,检查左右括号配对情况,并输出结果。 例子:{[(…)(…)]…(…)}配对 而{[(…)(…)]…[(]…)}不配对

阅读更多 →

C 扑克牌配对说链表

2014-10-19 12:58分类: C评论: 0

以后每个数据结构作业都会那么小小的总结一下,数据结构的作业做了之后收获还是颇多的(废话当然比电子电路、大学物理收获多咯)

题目:

采用线性链表方式编程序模拟扑克牌配对游戏。通过键盘输入点数模拟抓牌,拿到新牌时,看手上是不是有同点数的牌,有的话,两者配对并抽掉手上的牌,没有的话,将牌插入手上的牌中,手上的牌保持按点数从小到大顺序排列。

扑克牌配对github链接

阅读更多 →

C (bu)科学的复数求解(两数加减乘除)

2014-09-26 19:43分类: C评论: 2

这次真的是记录一下思考过程了,反正是个很坎坷复杂的经历。 github地址:https://github.com/csvwolf/Sky-C-Study/tree/master/数据结构 老师给了我们一个结构体的框架,不得不说C的结构体和C++的还是有差别的:http://www.cppblog.com/percyph/archive/2009/03/06/75742.html

由此,我们这样定义一个结构体之后:

1typedef struct
2{
3    float rpart;
4    float ipart;
5} complex;
6
阅读更多 →

C 清空键盘缓冲区若干方法

2014-09-19 19:29分类: C评论: 0

写这次的数据结构的作业的时候对于缓冲区问题深表蛋疼,getchar()深表拙计,于是搜了一下……

以下文字来自:http://www.ludou.org/c-clear-buffer-area.html

清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);等,但是在linux这些都不起作用,还得我今天试了半天都没成功,上网搜了一下发现setbuf(stdin, NULL);就能直接清空键盘缓冲区了。

以下几个实例:

Sample one

1#include <stdio.h>
2
3int main()
4{
5    char ch1;
6    char ch2;
7
8    ch1 = getchar();
9    ch2 = getchar();
10    printf("%d  %d", ch1, ch2);
11    return 0;
12}
13
阅读更多 →

SMU 算法题 情书的编码

2014-06-10 14:29分类: C评论: 0

题目: 截获了Bobwu的检讨以后,Linkinpaoger突然想到可以用自己的加密方式来加密情书。Linkinpaoger写了一封给Anonymous的情书并加密,然后发现密文中出现了很多类似ABBCCC的字符串。经过思索,Linkinpaoger决定按以下规则压缩密文:

1.任何包含k个相同字符的子串被替换为kX,X表示该子串中的唯一字符。

2.若某个这样的子串长度为1,那么省略‘1’。

按以上规则,ABBCCC将被压缩为A2B3C。现在请你帮Linkinpaoger压缩密文。

输入:

输入的第一行为一个正整数N,表示共有N组测试数据,接下来的每一行表示一组密文,密文仅由‘A'-’Z'组成。

1≤N≤100,每组密文的长度不超过10000个字符长度。

输出:

对于每组输入数据,输出一行压缩后的密文。

阅读更多 →

SMU算法题 Weijie环

2014-05-31 22:17分类: C评论: 3

在欢送会上,大家决定玩一个游戏,这个游戏叫做Weijie 环,所有的N 个人站成一圈,由一个人随意说一个数字A,从他顺时针下一个人开始顺时针数,第A个人出圈(下次就不数出圈的人),然后从第A 个人顺时针后面1 个人开始顺时针数A+1,第A+1 个人出圈,依次数A+2,A+3……,最后留在圈内的人获胜。 现在轮到BobWu 说数字,他报出了一个数字A,现在BobWu 想知道自己是第几个出列的。

详情:http://mstc.shmtu.edu.cn/oj/problem.php?cid=1003&pid=2

好像以前看过类似的题,不过没做出来,当时也没准备做……结果发现就其本身而言不用数组也可以。

阅读更多 →

SMU 算法题:BobWu的胜率统计

2014-05-31 22:10分类: C评论: 0

大家玩了很久,由于之前就有过大家玩游戏的记录,大家开始查看各自的胜率,游戏的结果对于每个人就两种,要么就赢,要么就输,今天大家玩了D 局,大家总共玩了G 局,但是当BobWu 查看胜率记录的时候,发现自己的今天的胜率恰好是一个整数PD,自己的总胜率也恰巧是一个整数PG!他开始怀疑是不是因为大家玩游戏输掉会被惩罚喝酒于是计算错了。可是由于大家都喝酒了,谁都记不得今天玩了几局(D),也记不得总共玩了几局(G),但是可以确定今天一定不可能玩超过了N 局(D≤N)现在BobWu 想知道这样的胜率究竟是有可能,还是一定计算错了。

题目详情:http://mstc.shmtu.edu.cn/oj/problem.php?cid=1003&pid=3

1#include <stdio.h>
2
3int divide(int big, int small)
4{
5    int r;
6
7    r = big % small;
8
9    while (r != 0)
10    {
11        big = small;
12        small = r;
13        r = big % small;
14    }
15
16     return small;
17}
18
19int main(void)
20{
21    unsigned int n[100], pd[100], pg[100], t, possible[100], big = 100, temp;
22    int i;
23
24    scanf("%u", &t);
25    for (i = 0; i < t; i++)
26    {
27        scanf("%u", &n[i]);
28        scanf("%u", &pd[i]);
29        scanf("%u", &pg[i]);
30
31        if (100 / divide(100, pd[i]) > n[i])
32            possible[i] = 0;
33
34        if( pg[i] > 100 || pg[i] == 100 && pd[i] != 100 || pg[i] == 0&& pd[i] != 0)
35            possible[i] = 0;
36        else
37            possible[i] = 1;
38    }
39
40    for (i = 0; i < t; i++)
41    {
42        switch (possible[i])
43        {
44            case 1:
45                printf("Case #%d: Possible\n", i + 1);
46                break;
47            case 0:
48                printf("Case #%d: Broken\n", i + 1);
49                break;
50        }
51    }
52
53    return 0;
54}
55

在我按了半天计算器之后,终于发现,要计算的是分母,而且要最简形式,问题就转换了,可是关键是怎么求……于是我尝试了各种方法,按了好多遍计算器最终发现求公约数就可以了OTZ100 / divide(100, pd[i])这样求出的就是分母了,没想到辗转相除法能这么用,不由得给那一次的上机题点赞了,数学不好的人科普福音啊。

估计效率也不咋的,凑合着用……

PS:科普链接:http://androidguy.blog.51cto.com/974126/1219145

阅读更多 →

SMU 算法题:Weijie 的客人名单

2014-05-31 21:40分类: C评论: 0

题目: 去年的主人公Weijie 要离开海事大学了,于是大家决定帮他举行欢送宴会。 BobWu 很想知道究竟有多少人参加了Weijie 的欢送宴会,于是他弄来了客人名单。名单有N 行,但是其中有很多重复的名字,比方BOBWU > 和BobWu 其实指的都是同一个人,但是名单上的名字却区分大小写重复出现了。 BobWu 想知道去除重复的名字以后究竟有哪些客人。

具体可见:http://mstc.shmtu.edu.cn/oj/problem.php?cid=1003&pid=1

写了半天……结果还是问了师匠:

阅读更多 →
共 69 篇文章,7 页
...