C语言,输入一串数字,只允许包含1和2,输入一个数字进行循环,每循环一次,2就往两边扩散一次。图片

Python046

C语言,输入一串数字,只允许包含1和2,输入一个数字进行循环,每循环一次,2就往两边扩散一次。图片,第1张

#include<stdio.h>

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的时候,将循环的边界再减一个,就可以了,不过图形是会变形,不会是菱形了。

上机运行的时候,把这些汉字清理了吧,要不可能编译出问题,好运~