void-man

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

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 阅读(279) 评论(0) 推荐(0)

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

摘要: 求解fib(n)中,n的所有因子的个数,题目n<700,本来以为用大数做,但是看了某个大牛的算法,就是牛,利用和求余的算法fib[i][j]表示fib(i)%j的值直接上代码吧#include <stdio.h>#include <math.h>int fab[800][800];int main(){ int n,m,num,N; for(int i=2;i<=700;i++) { fab[0][i]=1; fab[1][i]=1; for(int j=2;j<=700;j++) fab[j][i]=(fab[j-1][i]+fab[j-2][i]) 阅读全文
posted @ 2011-04-17 15:09 void-man 阅读(242) 评论(0) 推荐(0)

摘要: 给出多个字符串浮点数,,并且小数部分有且只有两位。。求和整数部分每隔三位有一个逗号分隔符,有个比较好的处理办法就是,先不考虑逗号跟小数点,直接相加进位求和,最后把后两位的前面加上小数点#include <iostream>#include <cstring>#include <string>using namespace std;#include <cstdio>int main(){ char s[50]; int n, i, j, k; char a[50], b[50]; while(scanf("%d", &n 阅读全文
posted @ 2011-04-17 14:56 void-man 阅读(227) 评论(0) 推荐(0)

摘要: 问一个串是否是另一个的子串(不必连续也行),比较水,直接一个一个枚举出来即可起初定义串长度太小,总到时SGV错误#include <stdio.h>#include <string.h>int main(){char a[99999],b[99999];while(scanf("%s%s",a,b)!=EOF){int len1=strlen(a),len2=strlen(b),i,j; if(len2<len1)printf("No\n"); else {for(i=0,j=0;i<len1&&j&l 阅读全文
posted @ 2011-04-17 14:23 void-man 阅读(160) 评论(0) 推荐(0)

摘要: 给出一个加法表达式,但是相加时候是向右进位,即低位进位,问你得到的结果是否正确,输出true||false直接读入串后把三个数存放到三个数组中,然后依次加每一位,然后低位进位即可#include<iostream>using namespace std;int a[8],b[8],c[8];char str[1000];int main(){ int i,j,k,p; while(cin>>str) { for(i=0;i<8;i++)a[i]=b[i]=c[i]=0;//初始化每一位都是10,为了后来相加时候不够的位补0 for(i=0,p=0;str[i]!= 阅读全文
posted @ 2011-04-17 14:16 void-man 阅读(342) 评论(0) 推荐(0)

摘要: 给出几个串,然后统计相邻两个字母在总串中出现的次数,然后统计处个数最多的5个,并写出他们的频率猛一看感觉没头绪,是否要枚举每一种,感觉挺繁琐,但是先把两个字符串给hash出来,即前一个字母*256+后一个字母,得出的和即可表示所有两个ascii组合的hash值然后再按照每个hash值上的出现次数排序,由于题目要求树木相同的按照ascii字典排序,所以数目同的再按照他们的hash即可,因为hash值就是两个字母ascii的从小到大的组合其实有点统计字符串字母个数的问题,num[str[i]-'a']++的意思,这个是一个字母,统计两个的时候再hash下就ok#include< 阅读全文
posted @ 2011-04-17 13:54 void-man 阅读(333) 评论(0) 推荐(0)

摘要: 给出几个人的成绩,以及路程,求出速度min/km字符串时间相加问题,关键就是处理进位,四舍五入比较麻烦,注意点#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ char s[1000][10]; int len,i,j,n,num,a[10],flag; double sum,l,t,t1,v,v1; while(scanf("%d%lf",&n,&l)!=EOF) { while(scanf("%d",&num)! 阅读全文
posted @ 2011-04-17 13:22 void-man 阅读(225) 评论(0) 推荐(0)

摘要: 给出两个数,求出这两个数之间有多少个fib数, 但是题目给出的数是10^100所以要用大数来处理用大数相加算法,求出fib[1024]之内的所有数,然后再找出两数之前多少个开始统计#include <iostream>#include <string>using namespace std;string operator +(const string &a, const string &b){ int i; int sum[2001] = {0}; int len1 = strlen(a.c_str()); int len2 = strlen(b.c_s 阅读全文
posted @ 2011-04-17 13:03 void-man 阅读(672) 评论(0) 推荐(0)

摘要: 题目就是给你n个人姓名,以及他们谁欠谁的钱,然你最后用最多n-1条规则(谁欠谁钱)罗列出欠钱的规则,要求钱还是平衡的由于是special judge那么用最简单的想,把其他除第一个人以外的人的钱全部都算到第一个人头上,那么钱最后还是balance的#include<stdio.h>#include <string.h>int check(char *str){ int num=1; for(int i=0;i<strlen(str);i++) num=num*(str[i]-'0'); return num%10000;}int main(){ i 阅读全文
posted @ 2011-04-17 12:55 void-man 阅读(228) 评论(0) 推荐(0)

摘要: 读入一串字符串,期中包含电压,电流,功率期中的两个值,然你求出另外一个值,比较简单,就是读入时候首先要根据单位识别读入的是哪个值,然后要把数值字符串转换成相应的浮点数,最后还要进行单位换算,给出结果是挺麻烦复杂的,一定要小心其次就是一些字符串读入的函数的一些区别比如gets()可以读入整个串,包括空格,它以回车符结束标志,详见随笔,scanf,gets()区别直接上代码,慢慢看吧#include <stdio.h>#include <string.h>main(){ int n; char a[100]; float zheng,xiao,flag; while(sca 阅读全文
posted @ 2011-04-17 12:47 void-man 阅读(230) 评论(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 阅读(392) 评论(0) 推荐(0)

摘要: 求出一个字符串中,它是一个子串的多少次方,要求最大用kmp算法求出next数组,当len%(len-next[len])==0时候,说明len-next[len]即为所能匹配的子串kmp算法详见随笔里面有#include <stdio.h>#include <string.h>char s[1000010];int next[1000010];int len;int main(){ int i,j; while(1) { scanf("%s",s); if(s[0]=='.')break; len=strlen(s); i=0;nex 阅读全文
posted @ 2011-04-17 11:42 void-man 阅读(514) 评论(0) 推荐(0)

摘要: 输入一些字符串以及其代表的数值,然后再输入一大段字符串构成的文章,看其中包含所给字符串的数值和是多少为了节省时间,可以在输入一个比较一次来处理,知道输入为"."时候结束#include <cstdlib>#include <iostream>#include <string>using namespace std;int main(){ char words[1000][17]; long points[1000]; long point=0; int m,n; cin >>m>>n; for (int i1=0; 阅读全文
posted @ 2011-04-17 11:05 void-man 阅读(293) 评论(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 阅读(3681) 评论(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 阅读(13098) 评论(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 阅读(7134) 评论(0) 推荐(2)