void main()
{ char c
int x[256],n,i,j,y,b
INPUTXAGAIN:
n=b=0
printf("Enter field configuration: ")
do { c=getchar()x[n]=c-'0'n++if ( c!='1' &&c!='2' ) b=1} while ( c!='\n' )n--
if ( b ) { printf("\nError! Interger can contain 1 and 2 digits only!!\n")goto INPUTXAGAIN}
INPUTYAGAIN:
printf("Enter desired number of years:")scanf("%d",&y)
if ( y<0 ) { printf("\nError! Non-negative years only!!\n")goto INPUTYAGAIN}
printf("\nOriginal Configuration: ")
for ( i=0i<ni++ ) printf("%d",x[i])printf("\n")
for ( j=0j<yj++ )
{ for ( i=0i<n-1i++ ) if ( x[i]==1 &&x[i+1]==2 ) x[i]=2
for ( i=n-1i>0i-- ) if ( x[i]==1 &&x[i-1]==2 ) x[i]=2
printf("Year:%3d Configuration: ",j+1)
for ( i=0i<ni++ ) printf("%d",x[i])printf("\n")
}
}
题目描述:有31,-41,59,26,-53,58,97,-93,-23,84十个数。SUM(N,M)表示从第N个数到到第M个数的和。例如:SUM(2,3)=-41+59=18。问:最大的和是多少?对应的N和M是多少?算法思想:数组中的数字可以看做用负数分割开的一段一段正数,先找出这几段正数中和最大的那段(这题的结果的那串数字必定包括和最大的那串正数)然后慢慢的向两边扩散。文字功底不是很好
不太会描述 大家看程序注释吧
#include <stdio.h>
#define MAXN10
int main(void)
{
int a[10] = {31, -41, 59, 26, -53, 58, 97, -93, -23, 84}
int positive[MAXN]
int i, j, k
int flag
int max, temp
int left, right
i = j = 0
while (a[i] <0)//该循环从左侧开始找第一个非负数 i记录其下标
++i
max = 0
temp = 0
//该循环找到整个数组中和最大的连续正数
//并用left和right分别记录该段连续正数最左边和最右边两个正数的下标
for (k=0i<10++i) {
if (a[i] >= 0) {
j = i
while (a[i] >= 0 &&i <10)
temp += a[i++]
if (temp >max) {
left = j
right = i-1
max = temp
}
positive[k++] = temp
temp = 0
}
}
flag = 0
temp = 0
for (i=left-1i>=0--i) {
if (a[i]<0 &&!flag) { //向左边扩散 先把连续的n个负数加起来
temp += a[i]
} else {//碰到了第一个正数
flag = 1
if (a[i]>=0 &&flag) {//把碰到的连续几个正数加起来
temp += a[i]
} else if (a[i]<0 &&flag) {//又碰到了一个负数
if (temp >= 0) {//收益为正数 可以加上
left = i+1
max += temp
temp = 0
++i
flag = 0
continue
} else {//收益为负数 结束循环
break
}
}
}
}
//printf("%d %d %d\n", left, right, max)
flag = 0
temp = 0
for (j=right+1j<10++j) {
if (a[j]<0 &&!flag) {
temp += a[j]
} else {
flag = 1
if (a[j]>=0 &&flag) {
temp += a[j]
} else if (a[j]<0 &&flag) {
if (temp >= 0) {
right = j-1
max += temp
temp = 0
--j
flag = 0
continue
} else {
break
}
}
}
}
printf("N = %d M = %d SUM = %d\n", left, right, max)
return 0
}
此题解法,我将这个菱形放在了一个二维数组中,因为用二维数组可以界定X的边界,比较方便一点。 循环输出的时候,特别注意循环跳出的条件,你画个二维数组,体会一下里面的数学关系,多上机改改代码,呵呵。要特别注意 q 的用途哦。
#include<stdio.h>
void main()
{
#define N 7 //定义二维数组的行和列
int i,j
char a[N][N]
int q=N/2 //找到数组的中间列
char t,p // 定义输出字符,t代表X,p代表Y
printf("qing shu ru X,Y:\n")
scanf("%c,%c",&t,&p) // 注意此处输入的时候,不要忘记“,”了哦
for(i=0i<Ni++) //将二维数组的值全部先赋值为“空格”
for(j=0j<Nj++)
a[i][j]=' '
for(i=0i<qi++) //将菱形一分两半,这个是上半部分的输出,以中间列
{
//为开始,向两边扩展,为了输出X ,注意i循环到q-1
a[i][q-i]=t
a[i][q+i]=t
for(j=(q-i+1)j<(q+i)j++ ) //以两边的X列为边界,输出Y
a[i][j]=p
}
for(i=qi<Ni++) //这个是下半部分的输出,i从q开始循环到最后
{
a[i][q-(N-1-i)]=t //仍然是从中间列开始向两边扩散,输出X
a[i][q+(N-1-i)]=t
for(j=(q-(N-1-i)+1)j<(q+(N-1-i))j++ ) //从X边界开始从做到右输出Y
a[i][j]=p
}
for(i=0i<Ni++)
{
{for(j=0j<Nj++)
printf("%c",a[i][j])}
printf("\n")
}
}
我这里输出的是标准的菱形,中间的Y的个数和你给的不一样,如果你想要你的那种结果,只需要在输出Y的时候,将循环的边界再减一个,就可以了,不过图形是会变形,不会是菱形了。
上机运行的时候,把这些汉字清理了吧,要不可能编译出问题,好运~