刷ACM题自己总结的一些算法

1.实数求绝对值函数:

   #include <math.h>

   double fabs( double arg );

   功能: 函数返回参数arg的绝对值。

 2.可能.nlf   n为数字,想要用,后边必须是算式吧 

 3.今天在c语言里,又偶遇一位新朋友,叫puts(好好查查他)

 4.swap 交换两个数#include <algorithm>

 

 5.判断一个日期是一年的多少天。先定义一个宏,来判断是否为闰年

   在把两种年,装进一个二维数组中,哈哈,比我写的switch爽好多

 6.想要连续输入 while(cin>>number) 或者 while(scanf("%d",&number) != EOF)

  第一种适用于只有一个输入值,或者不知道有几个输入值

  第二种适用于有确定个数的输入值,直到读取到文件结束

 7. (i & 1) ? (y += i*i*i) : (x += i*i); 这个是啥意思???位操作

 8.while (scanf("%d", &n) , n)  遇到零,就结束

 9.for(s = 0.0; n--; x = sqrt(x))   素数,简洁版

 10.printf(c++ ? " %d" : "%d", a[i]);

我们重复计算的只是这4个数字而已。

因为本题的数据两仅100->999。但万一有一题数据两非常庞大。而结果有像这次一样如此少。我们又该怎么办呢?

像这样的题目,算法很简单就可以实现,但优化也许需要我们花点时间去做,我们可以采用一种快速的“作弊”的方法:直接打表提交!

在比赛的时候,也许没有太多时间让我们去研究一道题目的算法。这样我们在思考其他题目的时间也可以用电脑来自动生成结果。

然后用哈希的思想,对每个输入的数据对应输出结果就可以了。当然,这是最没技术含量,但也是绝路上最有效的一颗救命稻草!

我这里讲这么多只是想让大家了解,应付比赛的着数是很多的。切不要思维定式了。

 11.  3 * pow(2, n - 1) - 2);

 12.对于某些求和啦,求差啦,等数学计算,学或干干的推出来规律一般都能从中用数

13.我对scanf认识的还是不够哇

   Arr[i]=cin>>m;错误

Cin>>m; arr[i]=m;正确

同理

Arr[i]=scanf(“%d”,&m);错误

scanf(“%d”,&m); arr[i]=m;正确

当输入0时,结束;

while (scanf("%d", &n), n)

或者

while (cin>>m && m)

 

14.n表示测试的组数,c表示持续的向里面添加字符

    int nd;

    char c;

    scanf("%d%*c", &n);

15. 判断是否为数字,直接调用库函数isdigit(); 

语法: 

#include <ctype.h>
int isdigit( int ch ); 

功能:如果参数是0到9之间的数字字符,函数返回非零值,否则返回零值.

16.母牛问题:小牛经过四年也能生牛

知道了递推的规律,就可以写出方程了:
f(n) = f(n-1) + f(n-3);  (n > 3)
f(n) = n; (n <= 3)
因为这是重复计算的过程。你可以把结果都保存在数组里。

17.程序里的四舍五入

(m+0.5)/1

Int 型转化为double

s[i] * 1.0 / m

 

18.

多用库函数,勤用库函数。 

isalpha
语法: 

#include <ctype.h>
int isalpha( int ch ); 

功能:如果参数是字母字符,函数返回非零值,否则返回零值。 

isalnum
语法: 

#include <ctype.h>
int isalnum( int ch ); 

功能:如果参数是数字或字母字符,函数返回非零值,否则返回零值。 

19.对于字符串的操作,有某些条件的字符后面要加一些额外字符,可以逐个输出,符合条件加上额外字符就行了。

 

找到最大值后,只要用putchar()逐个输出,然后判断输出的是不是最大值,是就再输出一个(max),就是这么简单!

gets  接受输入的字符串

用法:

char t[128];

while( v)

{

for(int i=0;t[i];i++)

{

各种ml条件操作

}

for(int i=0;t[i];i++)

{

putchar( t[i] );

}

}

20.  

tolower
语法: 

#include <ctype.h> int tolower( int ch ); 

功能:函数字符ch的小写形式。 

toupper
语法: 

#include <ctype.h> int toupper( int ch ); 

功能:函数字符ch的大写形式。 

 

21.while ((c = getchar()) != '\n')

   scanf("%d%*c", &n);

22.最小公倍数 = X*Y/最大公约数。            

while (scanf("%d", &n) != EOF)                                             

    while (n--)

        {

            scanf("%lu", &u);

        }

Eg:3 4 5 6

   2 4 3

【数制换算的一般方法】 

1 把r进数转换成十进制数,只要把r进制数写成r的各次幂的和的形式。然后按十进制计算结果。(这里r是大于1的自然数)
例如: (205.21)8 = 2 × 82 + 0 × 81 + 5 × 80 + 2 × 8-1 + 1 × 8-2 

把十进制换成r进制,可以把十进制化成r的各次幂(各次幂的系数小于r而大于或等于0的整数)的和,从最高次幂起各次幂的系数就是依次的r进制从左到右各个数位上的数字。当十进制数是整数时,采用“r除取余”法。即用数r除十进整数。取它的每次余数。
例如:把(746)10化为一个八进制的数。8|746

 ----

 8|93 --- 2

  ---

 8|11 --- 5

  ---

  8|1 --- 3

   --

    0 --- 1

得到(746)10 = (1352)8 

 

当十进制是小数时,采用“r乘取整”法,即用数r乘十进制小数,每乘一次取一次整数,直至小数部分变成零为止。
例如:把(0.8125)10化为二进制。
0.|8125

×|   2

-------

1.|6250

×|   2

-------

1.|2500

×|   2

-------

0.|5000

×|   2

-------

1.|0000

得到(0.8125)10 = (0.1101)2 

1 把r1进制数转换成r2进制数,一般可以先把r1进制数转换成十进制数,再从十进制数转换成r2进制数。

 

杨辉三角

把杨辉三角压缩进数组中,就会发现它的规律:f(i, i) = f(i, 1) = 1     (i > 0)

f(i, j) = f(i-1, j) + f(i-1, j-1)   (j < i)

或者 f(i, j) = Cji

多边形求面积公式:

可以利用多边形求面积公式:
S = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )
其中点(x0, y0), (x1, y1), ... , (xn, yn)为多边形上按逆时针顺序的顶点。

 

 

 

数组巧运算

//用数组来进行,一个存储,另外两个运算

int x[3], y[3], n;

scanf("%d%d"xy);//默认把元素放到数组的第一个里面即x[0] y[0]

scanf("%d%d"x+1y+1);//加一就是把元素放到第二个里面了。

 

递归的调用

题目分析:

由题目可知,每次只能走一级或两级。
因此从第一级走上第二级只能走一步,只有1种走法。
从第一级走上第三级,可以从第一级直接走两步,也可以从第二级走一步。有2种走法
走上第n级,可以从第n-1级走一步上来,也可以从第n-2级走两步上来。 

即:
f(2) = 1
f(3) = 2
f(n) = f(n-1) + f(n-2) (n > 3)

 

int ijn;//  这类题,先找出递归的规律          

__int64 d[51] = {112,};//把已知的规律放到数组的前两道三位

for (i = 3i < 51i++)//51是要求的边界

d[i] = d[i-1] + d[i-2];//这是得到的递归的规律

scanf("%d", &n);

while (n-- && scanf("%d%d", &i, &j) != EOF)

printf("%I64d\n"i > j ? 0 : d[j-i]);//要求输出的条件

 

 

概率问题:

 这一题比起其他题稍微高级一点,它需要两路同时进行梯推。
我们每次都在原来合法的字符串的最后面再加一个字符,让它仍然是合法的字符串。
这就会出现最后一个字符是O和不是O两种情况,把末尾是O的字符串的个数保存在D[I][0]里,而不是O的保存在D[I][1]里。
在原来的字符串上再加个O,让它依然合法,则原来的字符串末尾必须不为O,即D[n][0] = D[n-1][1]
而在原来的字符串上再加非O,则它对前面字符串的末尾没有要求,而且它还有E、F两种。因此D[n][1] = 2 * (D[n-1][0] + D[n-1][1])
初始D[1][0] = 1; D[1][1] = 2; 

都是以前刷题时的感受,希望共同交流

转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值