① C语言 递归算法视频
#include <stdio.h>
#include<malloc.h>
#include <stdlib.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define INFEASIBLE -1
#define Link 0
#define Thread 1
#define MAX_TREE_SIZE 100
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char Status;
typedef char TElemType;
typedef TElemType SqBiTree[MAX_TREE_SIZE];
SqBiTree bt;
typedef struct BiTNode{
TElemType data;
struct BiTNode * lchild, * rchild;
}BiTNode, * BiTree;
typedef BiTree SElemType;
int CreateBiTree(BiTree *T)/*根据先序序列建立二叉树的二叉链表*/
{ char ch;
scanf("%c",&ch);
if(ch==' ')
{
*T=NULL;
}
else{
if(!(*T=(BiTree)malloc(sizeof(BiTNode)))) return 0;
(*T)->data=ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
return 1;
}
Status PrintElement(TElemType e){
printf("%c",e);
return OK;
}
Status PreOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){
if(T){
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit)) return OK;
return ERROR;
}else return OK;
}
void main()
{
BiTree T;printf("请先序输入二叉树:\n");
CreateBiTree(&T);
printf("\n先序递归遍历二叉树:\n");
PreOrderTraverse(T,PrintElement);
}
② 算法编程:用c语言实现
解决这类问题可以使用 回溯 算法,代码如下:
#include<stdio.h>
#include<stdlib.h>
#defineM6//候选数字个数
#defineN5//组合后数字位数
intcheck(intresult[],inti)
{
for(intj=0;j<N;j++)
if(result[j]==i)
return0;
return1;
}
intlist(intnumbers[],intl,intresult[],intcount)
{
if(l>=N){
//将各位数组合成一个数
intnum=0;
for(inti=0;i<N;i++){
num=num*10+numbers[result[i]];
}
//判断这个数是否能被75整除
if(num%75==0){
printf("%d ",num);
count++;
}
returncount;
}
for(inti=0;i<M;i++){
if(!check(result,i)){
continue;
}
result[l]=i;
count=list(numbers,l+1,result,count);
result[l]=-1;
}
returncount;
}
intmain()
{
intnumbers[M]={1,2,5,7,8,9};
intresult[N]={-1,-1,-1,-1,-1};
intcount=list(numbers,0,result,0);
printf("共有%d个 ",count);
system("pause");
return0;
}
运行结果:
③ 算法上机实验如图所示,用c语言实现
#include<stdio.h>
#include<stdlib.h>
struct node {
int data;//数据域
struct node *R;//左孩子
struct node *L;//右孩子
};
int a[] = {1, 2, 3, -1, -1, -1, 4, 5,7,-1,-1,-1,6,-1,-1};//二叉树序列
int k = 0;
node* buildTree(node *tree) {//创建二叉树
int data=a[k++];//
if (data== - 1) {//-1代表空结点
tree = NULL;
}
else {//非空结点
tree = (node*)malloc(sizeof(node));//分配内存
tree->data = data;//数据域赋值
tree->L = tree->R = NULL;//左右孩子赋空
tree->L=buildTree(tree->L);//前往左孩子
tree->R=buildTree(tree->R);//前往右孩子
}
return tree;//返回根结点地址
}
void dfs1(node *tree) {//前序遍历
if (tree) {
printf("%d ", tree->data);
dfs1(tree->L);
dfs1(tree->R);
}
}
void dfs2(node *tree) {//中序
if (tree) {
dfs2(tree->L);
printf("%d ", tree->data);
dfs2(tree->R);
}
}
void dfs3(node *tree) {//后序
if (tree) {
dfs3(tree->L);
dfs3(tree->R);
printf("%d ", tree->data);
}
}
void level(node *tree){
//层次遍历,类似与bfs(广度优先搜索)
//需要一个队列作为辅助数据结构
node* q[100];//队列
int f=0,r=0;//头,尾指针
q[r++]=tree;//根结点入队
while(f!=r){
node *t=q[f++];//出队
printf("%d ",t->data);//输出
if(t->L!=NULL){//非空左孩子入队
q[r++]=t->L;
}
if(t->R!=NULL){//非空右孩子入队
q[r++]=t->R;
}
}
}
int count(node *tree){
if(tree==NULL){
return 0;
}
else{
int n,m;
n=count(tree->L);//左子树结点个数
m=count(tree->R);//右子树结点个数
return n+m+1;//返回左右子树结点个数之和
}
}
int main() {
node *tree = NULL;
tree=buildTree(tree);
printf(" 前序遍历: ");
dfs1(tree);
printf(" 中序遍历: ");
dfs2(tree);
printf(" 后序遍历: ");
dfs3(tree);
printf(" 层次遍历: ");
level(tree);
printf(" 二叉树结点个数:%d",count(tree));
return 0;
}
④ 设计算法,并用c语言实现。
#include<stdio.h>
intchange(intamount,intindex,intconstcoins[]){
if(amount==0)return1;
if(index<=0)return0;
for(inti=amount/coins[index-1];i>=0;--i){
if(change(amount-i*coins[index-1],index-1,coins)){
if(i)
printf("%d*%d",i,coins[index-1]);
return1;
}
}
return0;
}
intmain()
{
intcoins[]={20,50};
intconstsize=sizeof(coins)/sizeof(int);
intamount;
for(inti=0;i<size;++i){
for(intj=i+1;j<size;++j){
if(coins[i]>coins[j]){
inttemporary=coins[i];
coins[i]=coins[j];
coins[j]=temporary;
}
}
}
if(coins[0]<=0){
printf("数据有误,零钱必须大于0 ");
return-1;
}
printf("请输入要兑换的货币金额:");
scanf("%d",&amount);
if(change(amount,size,coins))
printf(" 兑换成功 ");
elseprintf(" 兑换失败 ");
return0;
}
⑤ 用C语言实现以下问题并讲解大概思路和所用算法,非常感谢!
唔,你这个问题的话,因为你这个不指定起点,所以应该是多源最长路径问题,我参考了一下多源最短路径的Floyd算法如下,不知道可不可以啊:
首先是输入
g[i][j]表示从i城市到j城市所需要的路费,
int g[M][M]={{null,2,1,null},{null,null,5,4},{null,null,null,null},{null,null,null,null}}
null表示两个城市之间不存在路径,看上去这个数组很浪费,因为Floyd算法是可以针对更复杂的图进行计算的算法,具体有没有更优算法我也不知道=。=
然后让M=你输入的城市数量-1,这里M=4
输入设置好以后,就可以进行循环比较了,通过三重循环的比较,最终得到D[4][4]这样一个数组,这个数组中的D[i][j]表示从i城市到j城市所需要的最高的路费,然后再通过比较数组D中最大值,应该就可以得出结果了。
这里复制一下原理:
Floyd-Warshall算法的原理是动态规划。
设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度。
若最短路径经过点k,则Di,j,k = Di,k,k − 1 + Dk,j,k − 1;
若最短路径不经过点k,则Di,j,k = Di,j,k − 1。
因此,Di,j,k = min(Di,k,k − 1 + Dk,j,k − 1,Di,j,k − 1)。(而我们是求最长,所以应该换成max就可以了)
void floyd(int g[M][M],int D[M][M])
{
for(int k = 0;k<M;k++)
for(int i = 0;i<M;i++)
{
for(int j = 0;j<M;j++)
{
if(k == 0)//k=0,第一轮循环时,先将基础值赋值给D数组
{
if(g[i][j]!=null)
D[i][j] =g[i][j];
else
{
g[i][j]=-30000;//在k=0的第一轮循环中,让没有路径的地方等于一个大的负数,这样之后的比较就不需要重复的判断非空了
D[i][j]=-30000;
}}
else//当k不等于0时,也就是第二轮循环之后,进行最长路径的比较和计算,大的值赋值给D数组
{
D[i][j] = MAX(D[i][j],D[i][k]+D[k][j]);
}
}
}
}
最后再写个循环,取出数组D中的最大值就可以得到最大路程了然后再算最大路费,如果前面的算法没错的话。
我的感觉的话,Floyd-Warshall算法比较容易实现,不需要特殊的数据结构,就是可能算法的时间和空间复杂度比较高,不知道你怎么看
⑥ 如何用C语言编写一个视频播放器
视频播放器是一种解码器。
解码器是对已编码的数字视频进行还原解码操作的程序(视频播放器)或设备。比如系统安装了real编码器那就能将其他格式文件转换成rm或rmvb格式,如果安装了real解码器那就能播放rm或rmvb格式文件。
这已经不是简单C语言能够编写出来的,它的核心是解码编码的算法。
1,如果你只是想用某些功能,不要自己编了。找一个吧。
2,非要自己编的话,要站在巨人的肩膀上。很多种编码都有开源的解码器了。可以利用他们。或者利用开源的软件,在人家基础上开发。
3,如果你认为你有希望改进压缩解压算法,得到更好的效果,更省地方,更有效的解压算法。那首先要做的是了解各种编码的压缩解压算法。创造一种更好的算法。
⑦ 如何用C语言实现视频文件的加解密
所有文件均可以用二进制形式表示,你按8位8位的循环处理,直接处理到文件末尾,每8位加一个1,取反等等,就改变了原来视屏文件的结构,你要是用过Ultra就知道按16进制显示的文件内容,修改这个改变文件,从而达到加密的目的。
⑧ 关于算法编程题(C语言实现)
char *a; //字符串 改为 char a[20];//存放字符串的字符数组
int jie; //方程的解 改为 double jie;
dy = 0; 删去 dy=0;
两处的 for(i=1;i<=z;i++) 都改为 for(i = 0; i < z; i++)
if (a[i] == '==' ) 改为 if (a[i] == '=' )
{z=i; 改为 {dy = i;
a=0;b=0; 删去 a=0;b=0;
fun(a,1,dy,&b,&c); 改为 fun(a, 0, dy - 1, &b, &c);
fun(a,dy,z,&b,&c); 改为 fun(a, dy + 1, z - 1, &b, &c);
jie=(d-b)/(e-c); 改为 jie=((double)(d-b))/(e-c);
printf("%c = %d",zm,jie); 改为 printf("%c = %f",zm,jie);
⑨ 用C语言或C++实现一个简单算法
#include<stdio.h>
int main()
{
float a;
while(scanf("%d",&a)==0)
printf("please input right content:");
}
代码很短,希望能帮助到你 .
⑩ 用C语言编程实现下列算法!谢谢!
NOIP(全国信息学奥林匹克联赛)1997
普及组
二、把1,2,…
9共9个数排成下列形状的三角形:(30%)
a
b
c
d
e
f
g
h
i
其中:a~i分别表示1,2,...9中的一个数字,并要求同时满足下列条件:
(1)
a<f<i
(2)b<d,
g<h,
c<e;
(3)a+b+d+f=
f+g+h+i=
i+e+c+a=
P
程序要求:根据输入的边长之和P,输出所有满足上述条件的三角形的个数及其中的一
种方案。
在算法描述中,如果队循环变量的初值和终值精心设置,是可以体现出变量间规定的一些大小关系的,这样做可以减少IF语句,减少运行时间。
参考代码:
#include<iostream>
using
namespace
std;
int
main()
{
bool
z[10]={};
int
a,b,c,d,e,f,g,h,i,p,s=0,x,y;
cin>>p;
for(a=1;a<8;z[a++]=false)
{
z[a]=true;
y=p-5-a<8?p-a-5:8;
for(f=a+1;f<=y;f++)
{
z[f]=true;
x=p-f-3<9?p-f-3:9;
for(i=f+1;i<=x;i++)
{
z[i]=true;
for(b=1;b<=(p-a-f-1)/2;b++)
{
d=p-a-f-b;
if(z[b]||d>9||z[d])continue;
z[b]=z[d]=true;
for(c=1;c<=(p-i-a-1)/2;c++)
{
e=p-a-c-i;
if(z[c]||e>9||z[e])continue;
z[c]=z[e]=true;
for(g=1;g<=(p-f-i-1)/2;g++)
{
h=p-f-g-i;
if(z[g]||h>9||z[h])continue;
if(s++==0)cout<<a<<endl<<b<<c<<endl<<p-a-f-b<<p-a-c-i<<endl<<f<<g<<p-f-i-g<<i<<endl;
}
z[c]=z[e]=false;
}
z[b]=z[d]=false;
}
z[i]=0;
}
z[f]=0;
}
z[a]=0;
}
cout<<s<<endl;
return
0;
}