本文目录一览:
帮我解决一道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);
}
上机运行的时候,把注释全删了吧,要不然可能运行出错,多体会一下吧,这只是其中的一种方法而已,多上机运行代码,理解下里面的逻辑,好运。