本文目錄一覽:
幫我解決一道C語言算法的問題
這是一個最大子序列和問題。通常用動態規劃法解。至於動態規劃的數學模型,懶得去查了,直接給你找了一個算法,你湊合看吧。
從整數序列頭部開始掃描,假設現掃描到的位置為i,求取從0到i所有元素的和sum[i],sum[i]取最大值的地方即為最大子序列的結束位置,設為a。從結束位置a向前掃描,找到第一個小於零的位置b,b+1就是最大子序列的開始位置。求從b+1到a位置的值即可得到最大子序列和。按此思路該算法時間複雜度為O(m+n),其中m, n分別為最大子序列的長度、給定整數序列的長度。
改進:根據對上述算法的進一步分析,可以知道,最大子序列和中必然不存在前綴子序列小於0的情況,於是設一ThisSum用於指示當前子序列和。改進算法描述如下:從整數序列頭部開始掃描,累加序列元素和ThisSum,若ThisSum0,則停止累加子序列和,將ThisSum清零,並從下一位置重新開始累加ThisSum,否則將ThisSum與當前MaxSum比較,並更新MaxSum。此改進算法時間複雜度僅為O(n),n為給定整數序列的長度。
int MaxSubsequenceSum3(const int A[], int N)
{
int ThisSum, MaxSum, i;
ThisSum = MaxSum = 0;
for(i = 0; i N; i++)
{
ThisSum += A[i];
if(ThisSum MaxSum)
MaxSum = ThisSum;
else if(ThisSum 0)
ThisSum = 0;
}
return MaxSum;
}
dda直線段掃描轉換算法用c語言怎麼表示
#includegraphics.h
void main()
{
int driver,mode;
int xa,ya,xb,yb,c;
int dx,dy,steps,k;
float fx,fy,x,y;
int wx,wy;
driver=DETECT;
mode=0;
initgraph(driver,mode,””);
printf(“please enter the start point:/n”);
printf(” xa= “);
scanf(“%d”,xa);
printf(” ya= “);
scanf(“%d”,ya);
printf(“please enter the end point:/n”);
printf(” xb= “);
scanf(“%d”,xb);
printf(” yb= “);
scanf(“%d”,yb);
如何校驗和是通過一定的算法掃描一個數據計算出的一個數值。用C語言
#includestdio.h
int Quicksum(char *str) //用指針做校驗函數的參數,來接收被校驗的字符串A;
{
int sum=0,loc=1,i,n; //sum代表校驗和,loc代表每個字符在字符串A里的位置;
char *p;
p=str; //將被校驗字符串A的地址賦值給字符指針p,用p表示位置;
n=strlen(p); // 用strlen函數求出A的有效長度;
for(i=0;in;i++) //注意循環的次數。體會in的意思,保證能計算到每個字符
{
if((*p)==’ ‘) {p++; loc++;continue;} //如果遇到空格,就將位置指針向後移動一個,跳過空格
//注意loc也要增加一,為了正確記錄每個字符的位置
sum+=((*p-‘A’)+1)*loc; //如果此處不是空格,就根據校驗計算該位置所代表的和,進行累加
loc++; //將位置指針移動到下一個字符,同時loc也跟着變化
p++;
}
return sum; //返回校驗和
}
void main()
{
int jiaoyanhe;
char *string;
printf(“Please input (A-Z) : “);
gets(string); //使用gets函數輸入字符串;
jiaoyanhe=Quicksum(string); //調用Quicksum函數進行校驗和的計算。
printf(“jiao yan he : “);
printf(“%d\n”,jiaoyanhe);
}
上機運行的時候,把注釋全刪了吧,要不然可能運行出錯,多體會一下吧,這只是其中的一種方法而已,多上機運行代碼,理解下裏面的邏輯,好運。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/241691.html