1.break 循环终止语句,当遇到 break 时立即跳出循环。
2.变量的初始化只能有一次,而赋值可以有多次。
素数(质数),除了1和它本身外,不能被其它自然数整除的数, 但要记住1既不是素数也不是合数。
***打印100之内的素数:
分析:可以使用for循环在最外层,来对自然数2到99进行遍历。在来一个for嵌入,在内层for中把外层取出来的数,进行2到自身范围内的取余看能否被整除,
以此来判断该数是否为素数。如果是则使用 break 语句从内层里面跳出来。跳到外层循环对此进行打印。
int main(void)
{
int i;
for(i = 2; i < 100; ++i)
{
int j;
for(j = 2; j < i; ++j) //在循环语句中,跳出的条件是,循环执行的条件初次不为真。
{
if(!(i % j)) //if(0 == i % j)
{
break;
}
}
if(j < i) //如果是break出来的,则此处(j < i)的条件逻辑就为真,会进入语句中打印。此处用的比较巧妙。
{
printf("%d: not primenumber!\n", i);
}
else
{
printf("%d: is primenumber!\n", i);
}
}
return 0;
}
裴波拉切数列 前两项都是1, 后面的每项都是前面两项之和。
1 1 2 3 5 8 13 21 。。。
***打印20项之内的裴波拉切数列:
int main(void)
{
int i;
int t, m, n;
m = 1; //先定义两个1作为前两项。
n = 1;
printf("%d %d “, 1, 1); //打印出前两项
for(i = 3; i <= 20; ++i) //要从3开始了因为前面两项已经被打印出来了。
{
t = m + n;
printf(”%d ", t);
m = n; //这里的赋值是为了下一次打印一个两数之和
n = t;
}
printf("\n");
}
3.数组:数组是一种数据类型。
数组具有:单一性, :数组每个成员的数据类型都是一样的。
整体连续性, :数组的储存在内存中整体是连续的。
有序性。 :数组中每个成员是一个挨着一个从第一个向后一个依次储存。
int a[10]; //定义数组时的方括号不是下标运算符,是类型说明符,表明a是一个数组。
a[0]; //数组访问的话下标是从0开始的,a[0] ~ a[9]
a = 10; 数组是不可以这样赋值的。
int [] 整体相当于一个数据类型,a为数组名。
***要重点注意的是数组的越界访问问题,如果越界访问了数组或者初始化数组时多写入了,在编译的时候程序是不会出错的,连警告都不会有。
但当程序运行的时候会出现未知的错误,此情况很严重的。
***找出数组中能被3整除的数:
int main(void)
{
int a[] = {0,1,2,3,4,5,6,7,8,9}; //定义数组时可以不写数组元素的个数。
int i, j = 0;
for(i = 0; i < sizeof(a) / sizeof(a[0]); ++i) //sizeof(a) / sizeof(a[0])此操作可以求出数组的长度
{
if(0 == a[i] % 3)
{
printf("%d\n", a[i]);
++j; //定义j是为了计算能被3整除数的个数。
}
}
printf(“number = %d\n”, j);
return 0;
}
***找出数组中最大的值和次大的值:
分析: 找数组中最大的值只需要将数组中每一个元素遍历一下然后比较大小,不断地将较大的值赋给一个变量,最后将此变量打印出来即可。
找次大值,第一个 for循环是为了找最大值,第二个 for循环是比较遍历一遍后来找次大值,这里要把第一次找到的最大值过滤掉才可以。
int main()
{
int a[] = {0,-1,2,-3,4,-5,6,7,-8,9,0};
int max = 0;
int i;
max = a[0];
for(i = 1; i < sizeof(a) / sizeof(a[0]); ++i )
{
if(a[i] > max)
{
max = a[i];
}
}
printf(“the max number = %d\n”, max);
int max1;
//max1 = INT_MINI;
max1 = a[0];
for(i = 1; i < sizeof(a) / sizeof(a[0]); ++i)
{
if(a[i] > max1 && a[i] != max) //找数组中的最大值,并且要和第一次的最大值不等。
{
max1 = a[i];
}
}
printf("the second max number = %d\n", max1);
}
***将一个数组中的数值调换一下:
分析:需要两两对调以此循环,因此循环的次数为数组长度除以2 , 因为是 int数据类型所以数组的长度无论是奇数还是偶数,要循环的次数都正确。
int main(void)
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
int len;
int i;
int t;
len = sizeof(a) / sizeof(a[0]);
for(i = 0; i < len / 2; ++i) //数组长度为 len 前面的为 a[i] 则后面的就为 a[len - i - 1]
{
t = a[i];1
a[i] = a[len - i - 1];
a[len - i - 1] = t;
}
for(i = 0; i < len; ++i)
{
printf("%d ", a[i]);
}
return 0;
}
4.排序算法:默认为升序
(1)选择排序
(2)冒泡排序
(3)插入排序
前三种时间复杂度(2^n),空间复杂度都一样。
(4)快速排序(指针时学习)
***选择排序法:
分析:使用 for 循环
拿出一个数与后面的数以此进行比较,将第一个与后面的其他元素依次比较,从而将数值大的放到后面。
第一次 a[0] …a[i] < len - 1; 与后面的 a[j] (j = i+1;) 循环比较到长度减一次为止。
第一次 a[1] 与后面的 a[j] (j = i+2;) 循环比较到长度减一次为止。
…
int main(void)
{
int a[] = {1,5,6,4,2,3};
int len = sizeof(a) / sizeof(a[0]);
int i, j;
for(i = 0; i < len -1; ++i)
{
for(j = i + 1; j < len; ++j )
{
if(a[i] > a[j]) //定义一个变量来作为中转。将大的数值放到后面去。
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for(i = 0; i < len; ++i)
{
printf("%d ", a[i]);
}
return 0;
}
***冒泡排序法:
分析:使用 for 循环
int main(void)
{
int a[] = {3,2,1,5,6,4};
int len;
len = sizeof(a[]) / sizeof(a[0]);
int i,j;
for(j = len - 1; j > 0; --j)
{
for(i = 0; i < j; i++)
{
if(a[i] > a[i + 1])
{
int t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
for(i = 0; i < len; i++ )
{
printf("%d ", a[i]);
}
}
***插入排序:
分析:依次顺序取出一个值,然后比较此值与前一个值的大小,如果前大则将前一个值后移,在把取出的值放入 --j 中也就是前一个值的位置
int main(void)
{
int a[] = {2,1,3,6,7,9,8,5,4};
int len;
len = sizeof(a) / sizeof(a[0]);
int b[len];
b[0] = a[0];
int i,j;
for(i = 1; i < len; ++i)
{
int j = i;
int t = a[i];
while(j > 0 && b[j - 1] > t )
{
b[j] = b[j - 1];
--j;
}
b[j] = t;
}
for(i = 0; i < len; ++i)
{
a[i] = b[i];
}
for(i = 0; i < len; ++i)
{
printf("%d ", a[i]);
}
return 0;
}