void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2011年5月2日

摘要: 斯特林[striling]公式(求阶乘(n!)的位数) 2007-10-05 13:49/*例如1000阶乘位数: log10(1)+log10(2)+···+log10(1000)取整后加1 */#include<stdio.h>#include<math.h>int main(){int n,i,t;double d;scanf("%d",&t);while(t--){while(scanf("%d",&n)){ d=0; for(i=1;i<=n;i++) d+=log10 阅读全文
posted @ 2011-05-02 01:16 void-man 阅读(2582) 评论(3) 推荐(0) 编辑

2011年4月21日

摘要: 以前就知道约瑟夫问题是模拟,今天我才发现一些约瑟夫问题可以使用数学解法得出!真是强悍啊!约瑟夫问题真是博大精深!当然报数长度不定的应该只有模拟了吧,能用数学做的都是简化过的约瑟夫问题。下面整理如下:1.问题描述:n个人(编号1~n),从1开始报数,报到m的退出,剩下的人继续从1开始报数。按顺序输出列者编号。数学解法复杂度:O(n)。下面的代码摘自雨中飞燕博客,这个公式推的太牛了,我还没看懂。。。#include <stdio.h>#include <conio.h>int main( void ){ int n, i = 0, m, p; scanf("%d% 阅读全文
posted @ 2011-04-21 23:20 void-man 阅读(17234) 评论(3) 推荐(4) 编辑

2011年4月20日

摘要: OJ很多时候要求浮点数保留有效位数,因此在此我总结几条浮点数转换的规则1.使用printf(".mf")输出的话,系统会自动自舍五入,进位2.使用(int)进行强制转换的话,会自动舍弃后面所有位数,直接取整3.floor()函数,返回值是不大于此数的最大整数 ceil() 返回大于或者等于指定表达式的最小整数4.判断四舍五入可以用:(int)m+(m-(int)m>=0.5) 阅读全文
posted @ 2011-04-20 00:07 void-man 阅读(2177) 评论(0) 推荐(0) 编辑

2011年4月18日

摘要: 扩展欧几里德算法是用来在已知a, b求解一组p,q使得p * a+q * b = Gcd(p, q) (解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。下面是一个使用C++的实现: int exGcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1; y = 0; return a; } int r = exGcd(b, a % b, x, y); int t = x; x = y; y = t - a / b * y; return r; } 把这个实现和Gcd的递归实现相比,发现多了下面的 阅读全文
posted @ 2011-04-18 23:23 void-man 阅读(6053) 评论(0) 推荐(3) 编辑

2011年4月17日

摘要: 原型:extern char *strrev(char *s); 用法:#include <string.h> 功能:把字符串s的所有字符的顺序颠倒过来(不包括空字符NULL)。 说明:返回指向颠倒顺序后的字符串指针。 函数名: strstr 功 能: 在字符串中查找指定字符串的第一次出现 用 法: char *strstr(char *str1, char *str2); strstr原型:extern char *strstr(char *haystack, char *needle); 用法:#include <string.h> 功能:从字符串haystack中 阅读全文
posted @ 2011-04-17 23:37 void-man 阅读(271) 评论(0) 推荐(0) 编辑

摘要: getchar(),可以读取空格回车在内的一个字符,常常用来处理上文输入时候缓冲区内的回车等,以确保下文可以正常接收scanf(),接收一个字符串,以空格回车作为结束标识,如果输入字符串那么回车会变成'\0'被放在字符串结尾,如果是其他类型,回车会继续停留在缓冲区等待下个变量接受gets(),接受一个长串,期中可以接受空格等,以回车符作为结束标志,但其也可以接受一个回车,产生一个空串.如果上句是scanf并且输入的是字符串,那么不会接收回车因为回车已经被上个字符串接受编程'\0',如果上句是scanf输入其他类型,那么输入结束的回车符会被接受,产生一个空串. 阅读全文
posted @ 2011-04-17 23:35 void-man 阅读(2957) 评论(0) 推荐(0) 编辑

摘要: kmp算法核心是对于next数组的理解,next数组个人理解就是next[i]代表前i之前的子串中,开头的串和结尾的串能匹配的最大个数,比如给出abacaa设next[0]=-1;由题next[1]=0,求next[2]时候,就在str[2]之前的串ab里面找,看开头和结尾是否有可以匹配的,没有则=0同理next[3]在aba里找,因为ab!=ba,但是str[0]=str[2]所以next[3]=1同理下面的都可求,所以总结:next就是当前匹配失败后,模式串需要跳回的最大位置,也就是移动的最短距离...下面给出官方的解释以及代码next[] 数组的定义为(相对c++): 模式串P开头的任意 阅读全文
posted @ 2011-04-17 12:04 void-man 阅读(379) 评论(0) 推荐(0) 编辑

摘要: 语法:int result=factorial(int n); 参数: n: n 的阶乘 返回值: 阶乘结果的位数 注意: 本程序直接输出n!的结果,需要返回结果请保留long a[] 需要 math.h 源程序: int factorial(int n){long a[10000];int i,j,l,c,m=0,w; a[0]=1; for(i=1;i<=n;i++) { c=0; for(j=0;j<=m;j++) { a[j]=a[j]*i+c; c=a[j]/10000; a[j]=a[j]%10000; } if(c>0) {m++;a[m]=c;} } w=m* 阅读全文
posted @ 2011-04-17 10:59 void-man 阅读(3670) 评论(0) 推荐(2) 编辑

摘要: 1 --* 2 解一元多次方程 形如 x^5 + x^4 + x = 10 3 4 主要做法: 5 1.高次方程典型的解法就是迭代。给定初始值x0, 6 给定精度e,通过公式x[n]=x[n-1]+f(x[n-1])/f'(x[n-1])不停迭代,直到近似解符合精度要求,输出结果。 7 8 2.另外还有一种二分法,对这种方法不是太熟悉,就是首先给定一个区间[a,b],在区间上如果有极值,则有解,把这个区间一分为2, [a,c]、[c,b],如果f(a)和f(c)艺号,则解在[a,c]区间,反之在[c,b]区间。在把[a,c]一分为2,这样一直分下去,直到近似解符合精度要求。迭代法写程序 阅读全文
posted @ 2011-04-17 10:56 void-man 阅读(12896) 评论(0) 推荐(0) 编辑

摘要: 多边形面积在计算机中有一个很好的处理办法就是相量叉乘,我们知道三角形ABC的面积可以等于1/2*|AB|*|AC|*sinABC,也就是等于ABXAC的模若A(x1,y1),B(x2,y2),那么S=x1*y2-x2*y1,由此就可以求的其中点O的坐标可以任意 ,一般都取原点例a : S = Soab + Sobc + Socd + Soda ,4个三角形都是顺时针,面积为他们和的绝对值。 例b : S =Soab+Sobc+Socd+Soda ,4个三角形中后3个是顺时针,后3个的绝对值的面积Sobcda,但是Soab为逆时针,符号与后三个相反,4个相加刚好把多余的抵消。c,d同理由于叉乘得 阅读全文
posted @ 2011-04-17 10:51 void-man 阅读(6975) 评论(0) 推荐(2) 编辑