① C語言割圓術!
這結果還不盡人意嗎?這么精確啊!如圖:
如果你的第二個數亂掉的話,請改成printf("%d,%lf",n,s);,即s類型是double,對應%lf。
② c語言演算法。分治法,金塊問題。
int &fmin表示形參的【引用】聲明,&是【引用操作符】,不是指針的地址操作符,都可以表示指向, int &fmin「參數類型 &形參」實際上相當於「int &fmin=min」,「參數類型 &形參=實參」
被引用的形參fmin與其對應的實參min代表同一變數,可以互換,代替實參進行同樣的操作,可理解為實參的別名
」同樣是int類型的虛參,為啥跟i,j不是一個待遇「
這句話的理解不對
在maxmin(int i,int j,int &fmax,int &fmin){......}中,i、j是maxmin()函數的形參(虛參)
在int main (){ int n,i,j,max,min;.......}中,i、j是主函數main()的參數,當它們用在maxmin()函數的函數頭,作為maxmin()函數的參數,理解為maxmin()函數的實參(是maxmin()函數的實參),是函數形參的具體賦值,
所以通常只有在主函數main()中才可以看到有實參的函數頭(實參值調用形式)或無實參的空函數頭
只有在主函數中看到其它所有函數的實參
③ c語言木棒加工問題,利用貪心演算法哦
該問題是背包問題中的很典型的一種。因為物品可分為任意大小,所以可以很顯然地得到你的第三種思路是正確的。對於第一種策略,很容易找到反例:背包容量:100物品:A B C重量:100 50 50價值:70 50 50按照你的第一種貪心策略,選擇A,但顯然選B+C是更加劃算的 對於第二種策略,反例為:背包容量:100物品:A B重量:50 10價值:100 1對於你的第二種策略,會選擇B,但選擇A是更好的 對於第三種情況的證明,我們採取反證法假設存在一個策略使背包中物品價值達到最大值Vmax,但沒有取到當前單位重量價值最大的物品。則我們可以用單位重量價值最大的物品中分割一部分代替原背包中的任意一部分容量,可以使價值>Vmax所以,原方法必然不是最大值,第三種策略的最優性得證。就是這樣了
④ c語言演算法分析
ticks=stop - start -(stop1-start1);
ration = ((double)(stop - start - stop1 + start1))/CLK_TCK;
這里就沒啥不同的。
計算的都是同一個值,應該是:
ration = ((double)(stop1 - start1));
ticks=stop - start - ration ;
這樣是說計算了1000次方的是ticks時間
沒計算的是 ration 時間
⑤ 用動態規劃解決鋼條切割問題時,它的最優子結構是什麼
1、兩種重要演算法思想: 動態規劃,貪心演算法
2、動態規劃:
基本原理:動態規劃英文名dynamic programming。其中pogramming指的是表格法,而非編寫計算機程序。因此,可以初步得出動態規劃的基本思想:將一個具有最優子結構性質的問題分成若干個子問題,在求解過程中,記錄下子問題的結果,存儲在一個表格中,使得公共的子問題只需要計算一次。書中給出的基本原理:動態規劃將問題分成若干個相互重疊的子問題,遞歸的求解子問題,保存子問題的解,再將它們的解組合起來,求出原問題的解。
從基本原理中可以看出動態規劃需要滿足兩個條件,最優子結構和子問題重疊。
最優子結構:書中定義:問題的最優解由相關子問題的最優解組合而成,一個問題的最優解包含其子問題的最優解。典型的有背包問題和鋼條切割我問題。所謂子問題就是一中組合,將一個問題分成許多子問題的集合。某個子問題轉化為問題時,所需要的代價是固定的。
一般這類問題的解題過程:(自己總結)
畫出子問題圖(類似於逆拓撲排序的圖,子問題必須在問題前面完成)
用數學表達式構建出問題的最優解和子問題最優解之間的代數表達式
通常採用自底向上的方法進行遞歸地求解問題的解,自底下上的含義是從最小的子問題求起。
保存每一步求出的子問題的最優解
利用計算出的信息構造一個最優解
⑥ 木頭折斷問題,如何編寫C語言演算法
這方面不懂,不能幫到你。
⑦ 矩形分割(C語言) 已知一個大矩形,以另一個小矩形去切割,問最多能得到幾個小矩形 求演算法
大矩形的行除以小矩形的行,大矩形的列除以小矩形的列,所得的兩個值相乘
⑧ 大神們,求解一道演算法編程,最好只用C語言編寫,拜託啦= =
#include<stdio.h>
#include<stdlib.h>
intmain()
{intn,i,j,m,t,x,a[1000];
scanf("%d",&n);
a[0]=rand()%25;
printf("%d",a[0]);
for(i=1;i<n;i++)
{a[i]=a[i-1]+rand()%10+1;
printf("%d",a[i]);
}
printf("
x=");
scanf("%d",&x);
for(i=0,j=n-1;i<j;)
{m=(i+j)/2;
if(a[m]==x){j=m;break;}
elseif(a[m]<x)i=m+1;
elsej=m;
}
if(a[j]==x)
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
else
{if(a[j]<x)j++;
for(i=n;i>j;i--)a[i]=a[i-1];
a[j]=x;
n++;
}
for(i=0;i<n;)
printf("%d",a[i++]);
printf("
");
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;
}