博文
组合--非递归实现(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>
#def......
统计单词数小程序--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.cpp
int 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): 申请和释放由程序员控制,并指明大小。容易产生memo......
不调用库函数,实现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]
&......
删除字符串中相同的字符并排序--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票原则:优先售一个间隔内的票;
如果剩余票数不足,就提示不足, 不售票.
如果不能满足优先原则,......