您的位置:首页 > 其它

for循环,为什么我总爱把问题想复杂了

2010-11-20 12:49 176 查看
求1-100之间的素数

用这个数去除2-sqrt(i),如果有一个数能被除断,则为合数

我总把思维停在能除断上,

所以 if(i%j==0) break;

可是又加 if(i%j!=0) printf("%d",i);

孰不知必需将i去除以2-sqrt(i)之间所有的数后,才可以printf.

也就是说在内层循环被除数时,可以有一个leap标记,主要是判断

i是否为素数。

#include"math.h"

void main()

{int i,j,leap=1;

for(i=1;i<=100;i++)

{for(j=2;j<=sqrt(i);j++)

if(i%j==0)

{leap=0;

break;

}

if(leap)

printf("%4d",i);

leap=1;

}

getch();

}

首先leap=1,如果能除断,leap=0;break;注意这里break的作用范围,

它只跳出

for(j=2;j<=sqrt(i);j++)

if(i%j==0)

{leap=0;

break;

}



if(leap)

printf("%4d",i);

leap=1;

是没有包含在里面的,所以它还是会被执行,如果i为素数,则到这里,

leap还是1,就会执行printf。否则leap=0,不会打印合数,再把leap值

置为1,这是必须的。

你可以这样理解这里的leap=1;

它就是一个i的"假素数"标记,用j值检验i,到最后,若它货真价实,就

是好东西。

大括号里面结束,再就i<=100;i++

直到打印出所有素数。

冒泡排序

简单点说,有多少个数,就要进行多少趟冒泡排序(其实最后一趟不必)

一趟排序,只选出最大的或最小的

想一想,从第一个位置开始排,把最后一个数和它前面的数比较,把最大(小)

的放在第一个位置,再排第二个位置。如此。

#include"stdio.h"

void main()

{int A[5],i,j,temp;

for(i=0;i<=4;i++) //循环输入

scanf("%d",&A[i]);

for(i=0;i<=4;i++)

{for(j=4;j>=i;j--)

if(A[j]>A[j-1])

{temp=A[j]; //将大数前移,放到指定位置

A[j]=A[j-1];

A[j-1]=temp;

}

}

for(i=0;i<=4;i++) //循环输出

printf("%4d",A[i]);

getch();

}

for(j=4;j>=i;j--)

这里,j>=i算是把已经排好的位置不管,再从其它的数里选出最大的。

放在下一个位置。

求1!+2!+3!+4!+...+N!

我开始的思路是两层for循环

main()

{int N,i,j,k=1,s=0;

printf("please input the integer:");

scanf("%d",&N);

for(i=1;i<=N;i++)

{for(j=1;j<=i;j++)

{k*=j;}

s+=k;

}

printf("1!+2!+3!+...+N!=%d/n",s);

getch();

}

这里

for(j=1;j<=i;j++)

{k*=j;}

就是算N!

而s+=k;就是求和了。

想得美

看看输出结果

please input the integer:3

1!+2!+3!+...+N!=15

而1!+2!+3!=1*1+2*1+3*2*1=9

哪儿有问题?

令N=3

有 for(i=1;i<=3;i++)

{for(j=1;j<=i;j++)

{k*=j;}

s+=k;

}

当i=1时,k=1,s=1

i=2,k=2,s=1+2=3

i=3,k=k*j=2*1*2*3=12,s=s+k=3+12=15

就是这里

你会发现,k值是把原来的k值带进去l

所求的根本不是N!,而是N!*k

然后,我就得出了我很爱自作聪明的结论。

正确算法

main()

{int N,i;

long k=1,s=0;

printf("please input the integer:");

scanf("%d",&N);

for(i=1;i<=N;i++)

{k*=i;

s+=k;

}

printf("1!+2!+3!+...+N!=%ld/n",s);

getch();

}

please input the integer:3

1!+2!+3!+...+N!=9

想一想,3!=2!*3, 4!=3!*4 ,...

for(i=1;i<=N;i++)

{k*=i;

s+=k;

}

i值每自加一次,k值就是(原先的数)!*新数=(新数)!

s就把(新数)!加进去

以后多多思考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐