博文
组合--非递归实现(2008-04-01 23:31:00)
摘要:组合算法 (来源与互联网) 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。 例如求5中选3的组合: 1 1 1 0 0 //1,2,3 1 1 0 1 0 //1,2,4 1 0 1 1 0 //1,3,4 0 1 1 1 0 //2,3,4 1 1 0 0 1 //1,2,5 1 0 1 0 1 //1,3,5 0 1 1 0 1 //2,3,5 1 0 0 1 1 //1,4,5 0 1 0 1 1 //2,4,5 0 0 1 1 1 //3,4,5
以下是实现:
#include<stdio.h>
#define MAXNUM 50
void init(int* pac, int n, int m);void conver......
统计单词数小程序--C(2008-04-01 21:54:00)
摘要:#include<stdio.h>int main(){ char ch; int word = 0; int count = 0;
while((ch=getchar())!='\n'){ if(ch == ' ') word = 0; else if(0 == word){ count++; word = 1; } } printf("the numbers of words is: %d", count); return 0;}......
c/c++内存划分(2008-04-01 21:20:00)
摘要:一、一个经过编译的C/C++的程序占用的内存分成以下几个部分:1、栈区(stack):由编译器自动分配和释放 ,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈。2、堆区(heap) :一般由程序员手动申请以及释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放空间。 4、文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放空间。5、程序代码区:存放函数体的二进制代码。
下面的例子可以完全展示不同的变量所占的内存区域:
//main.cppint a = 0; 全局初始化区char *p1; 全局未初始化区main(){ int b; //栈中char s[] = "abc"; //栈中char *p2; //栈中char *p3 = "123456"; //123456\0在常量区,p3在栈上static int c =0; //全局(静态)初始化区//以下分配得到的10和20字节的区域就在堆区p1 = (char *)malloc(10); p2 = new char[20];//(char *)malloc(20);strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。}
二、栈(stack)和堆(heap)具体的区别。1、在申请方式上栈(stack): 现在很多人都称之为堆栈,这个时候实际上还是指的栈。它由编译器自动管理,无需我们手工控制。 例如,声明函数中的一个局部变量 int b 系统自动在栈中为b开辟空间;在调用一个函数时,系统自动的给函数的形参变量在栈中开辟空间。堆(heap): 申请和释放由程序员控制,并指明大小。容易产生memory leak。在C中使用malloc函数。如:p1 = (char *)malloc(10);在C++中用new运算符。如:p2 = new char[20];//(char *)m......
不调用库函数,实现strcpy函数(2008-01-23 13:44:00)
摘要:题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 解说: 1.strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strsrc="/=NULL")) //[1]
throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDes......
删除字符串中相同的字符并排序--c(2007-12-06 21:15:00)
摘要:#include "stdio.h"#include "string.h"
int main(){ char str[30] = "acegfddcbag"; char *p, *q, *r, c; for(p=str; *p; p++){ for(q=r=p; *q; q++) if(*r > *q) r = q; if(r != q){ c = *r; *r = *p; *p = c; } } for (p=str; *p; p++){ for(q=p; *p==*q; q++) ; strcpy(p+1, q); } printf("%s", str);
return 0;}......
数字翻转成字符--c递归(2007-12-06 21:02:00)
摘要:#include "stdio.h"void convert(char*, int);
int main(){ int number; char str[10] = ""; scanf("%d", &number); convert(str, number); puts(str);
return 0;}
void convert(char*s, int n){ int i; if((i=n/10) !=0 ) convert(s+1, i); *s = n%10 + '0';}......
数字转换成字符--c递归(2007-12-06 20:55:00)
摘要:#include "stdio.h"void convert(int);
int main(){ int number;
scanf("%d", &number); if(number < 0){ putchar('-'); number = -number; } convert(number);
return 0;}
void convert(int n){ int i; if((i=n/10) !=0 ) convert(i); putchar(n%10 + '0'); }
......
字符串翻转--c递归(2007-12-06 20:51:00)
摘要:#include "stdio.h"void intverp(char*);
int main(){ char s[10] = "hello!"; intverp(s); return 0;}
void intverp(char* s){ if(!*s) return; intverp(s+1); printf("%c", *s);}......
字符串中包含子串的个数--c(2007-12-06 20:47:00)
摘要:#include "stdio.h"int count(char*, char*);
int main(){ char str[80], subStr[80];
gets(str); gets(subStr); printf("%d\n", count(str, subStr));
return 0;}int count(char* str, char* subStr){ int i, j, k, num = 0; for(i=0; str[i]!='\0'; i++) for(j=i, k=0; subStr[k]==str[j]; k++, j++) if(subStr[k+1] == '\0'){ num++; break; } return num;}......
火车售票 -- C(2007-11-25 18:44:00)
摘要:1.编写程序实现火车站售票程序(以一节车厢为例)。
下图(图1)是火车车厢内座位的布局,座位号从1到80;
其中1,2, 5,6位于一个间隔内,3、4、7、8也是一个间隔内的座位…
1
5
9
13
………
………
65
69
73
77
2
6
10
14
66
70
74
78
过道
3
7
11
15
………
………
67
71
75
79
4
8
12
16
68
72
76
80
售票规则总则 假设每次最多售4张;
售1张票原则:随便售出一张没有售出的票;
售2张票原则:优先售2张相邻的票、如果没有2张相邻的票就随便售出两张票;
所谓2张相邻包括:1和2; 3和4; 5和6; 7和8等等
以下情况不算相邻: 1和5; 2和3等等
售3张或4票原则:优先售一个间隔内的票;
如果剩余票数不足,就提示不足, 不售票.
如果不能满足优先原则,......
