Bootstrap

循环结构#for语句以及穷举法#感悟

##for循环语句:
for(表达式1;表达式2;表达式3)
循环体语句;

表达式1是初始值(先执行)
表达式2是循环条件(决定是否继续执行)(再执行)
循环体语句(接着执行)
表达式3是改变循环条件(最后执行)

说人话就是3改变1的初始值,使其不符合循坏条件,结束循环。(其实循环结构都是由真到假的过程)

for语句的穷举法
for语句我一般解读为:为了表达式2而不断执行
但是for后面接for似乎不能这样解读了(个人感觉)
多接触一下这样的例子,我觉得应该理解为:在…情况下

a b c d分别表示甲乙丙丁
甲说:乙没偷丁偷的,或乙偷了丁没偷
乙说:乙没偷丙偷的,或乙偷了丙没偷
丙说:甲没偷乙偷的,或甲偷了乙没偷
丁说:丁没偷,或丁偷了
请判断谁是小偷

可以令偷的人为1,没偷的为0,满足以上所有条件
其四人要么偷了,要么没偷,可以用穷举法(for for型)

  #include <stdio.h>
  #include <stdlib.h>
 
  int main()
 {
    int a,b,c,d;
    for(a=0;a<=1;a++)
    for(b=0;b<=1;b++)
    for(c=0;c<=1;c++)
    for(d=0;d<=1;d++)
       if((a+b+c+d==1)&&((b==0&&d==1)||(b==1&&d==0))&&((b==0&&c==1)||(b==1&&c==0))&&((a==0&&b==1)||(a==1&&b==0))&&(d==1||d==0))
       if(a==1) printf("甲");
         else if(b==1) printf("乙");
         else if(c==1) printf("丙");
         else if(d==1) printf("丁");
    return 0;
 }

小结:
=与==总搞混,前者是赋值,后者是等于,老是把=当做C语言中的等于
写代码时(codeblocks)遇到中文字出现了乱码的现象,自己找了下别人的解决方法,也记录一下:
Setting——Editor——Encoding Settings——As default encoding 就OK了

求质数

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m,i;
    scanf("%d",&m);
    int flag=1;
    for(i=2;i<=m-1;i++)
        if(m%i==0)
    {
        flag=0;
        break;
    }
    if(flag) printf("%d是质数",m);
    else printf("%d不是质数",m);
    return 0;
}

小结:
还是那句话,分清==和=,上面的程序用0和1代表了是不是质数,如果能被2——m-1的数整除,那么判断该数是0,并且退出循环!
如果问题为:是不是…,那么可以用0和1去代替
千万别像我下面写的错误示例

 int m,i;                                 
    scanf("%d",&m);
    int flag=1;
    for(i=2;i<=m-1;i++)
        if(m%i==0)
        printf("%d不是质数\n",m);
        else
        printf("%d是质数\n",m);

这个就是理解成了在2到m-1的情况下,会…,却忽略了for语句的循环性,最后结果就是

6
6不是质数
6不是质数
6是质数
6是质数

真是头大了

九九乘法表
因为要控制行数以及每行的个数,所以要用两个变量控制内循环(每行个数)和外循环(行数)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j;
    for(i=1;i<=9;i++)
    {
        for (j=1;j<=i;j++)
        printf("%d*%d=%d\t",j,i,j*i);
        printf("\n");
    }
    return 0;
}

小结:
先让每行的值(内循环)执行完,再进行下一行(外循环)
每次内循环结束,进行下一次循环时,内循环继续使用初始值

最后再来个鸡兔同笼(穷举法)
35个头,94只脚

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int c,r;
    for(c=0;c<=35;c++)
    for(r=0;r<=35;r++)
      if (c+r==35&&c*2+r*4==94)
            printf("鸡%d,兔%d",c,r);

    return 0;
}

明显的for for型,现在就容易理解多了

OK,以上为个人自学摸索的经验,不喜勿喷,就这样,把个人认为棘手的内容记录了,下次再见!

;