c
素数
只有1和他本身两个因数的数
判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整
除,则表明此数不是素数,反之是素数。
兔子问题斐波那契数列 : fn = f(n-1) + f(n-2) (递归解决问题)
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
#include <stdio.h>
int main ()
{
int male,fmale,child;
for (male=0;male<=20;male++).
for (fmale=0;fmale<=33;fmale++)
for (child=0;child<=99;child++)
if (male+fmale+child==100 )
if (male*5+fmale*3+child/3==100)
if (child%3==0)
printf ("male :%d,fmale :%d,child :%d\n",male,fmale,child);
return 0;
}
注意:male<=20,fmale <=33,child <=99
闰年的判断方式:a%4==0&&a%100!=0||a%400==0。(366)
三天打鱼两天晒网
if((n%5)<4&&(n%5)>0) /*余数是1或2或3时说明在打渔,否则在晒网*/
n代表过了多少年
希尔排序算法:
//用希尔排序法对一组数据由小到大进行排序,数据分别为 69、56、12、136、3、55、46、 99、88、25。 (n从排序数个数的一半开始)
#include <stdio.h>
int main ()
{
int n,i,t;
int a[10] = {69,56,12,136,3,55,46,99,88,25};
for (n=5;n>0;n--)
for (i=0;i<(10-n);i++) //i < (10-n)
if (a[i]>a[i+n])
{
t=a[i];
a[i] = a[i+n];
a[i+n] = t;
}
for (i=0;i<10;i++)
printf ("%d ",a[i]);
return 0;
冒泡排序:
冒泡排序算法的原理如下:
1:比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2:对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3:针对所有的元素重复以上的步骤,除了最后一个。
4:持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
重点:
for (j=0;j<9;j++) // 控制排序的趟数,一次排序最大值在上
for (i=0;i<10-j;i++) // 两两比较
三角形面积公式: 1 s=(a+b+c)/2;
2 area=(float)sqrt(s*(s-a)*(s-b)*(s-c));
a==b || a == c || b==c (等腰)
a*a+b*b==c*c || b*b+c*c==a*a || c*c+a*a==b*b (直角三角形)
a==b==c (等边)
阿姆斯特朗数也就是俗称的水仙花数,是指一个三位数,其各位数字的立方和等于该数本身。例如:153=13+53+33,所以 153 就是一个水仙花数。求出所有的水仙花数
辗转相除法来求最大公约数。在求最小公倍数时要清楚最大公约数和最小公倍数的关系,(即两数相乘的积除以这两个数的最大公约数就是最小公倍数。)
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
#include <stdio.h>
int zhanchu (int x,int y);
int main ()
{
int a,b,max;
scanf ("%d%d",&a,&b);
max = (a>b)?zhanchu (a,b):zhanchu(b,a);
printf ("最大公约数是:%d",max);
printf ("最小公倍数是:%d",a*b/max);
return 0;
}
int zhanchu (int x,int y) // 假设x>y
{
int n;
if (x%y==0)
return y;
else
{
while (x%y != 0)
{
n = x;
x = y;
y = n%y;
}
return y;
}
}
自然底数 e=2.718281828…,e 的计算公式如下:
e=1+1/1!+1/2!+1/3!+…
要求当最后一项的值小于 10-10 时结束。
任意的整数,当从左向右读与从右向左读是相同的,且为素数时,称为回文素数。
判断位数的方法:
while (n>0)
{
n=n/10;
k+=1;
}
判断是否为素数:
int sushu (int n)
{
int i;
for (i=2;i<n;i++)
{
if (n%i==0)
break;
}
if (i==n)
return 1; // n是素数
return 0;
}
矩阵转制:
设有一矩阵为 m×n 阶(即 m 行 n 列),第 i 行 j 列的元素是 a(i,j),需要将该矩阵转置为 n×m 阶的矩阵,使其中元素满足 b(j,i)=a(i,j)。
由数学知识可知,将第一个矩阵的所有元素绕着一条从第一行第一列出发的右下角 45度 的射线做镜面反转,即可得到该矩阵的转置。
for (i=0;i<n;i++)
for (j=0;j<m;j++)
{
printf ("%d ",a[i][j]);
if (j==m-1)
printf ("\n");
}
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
b[i][j] = a[j][i];
printf ("%d ",b[i][j]);
if (j==n-1)
printf ("\n");
}
狼找兔子问题:
可以推导出狼去的洞的代码是: pos(i+1)=pos(i)+i+1。
随机数:
#include <stdlib.h>
#include <time.h>
srand (unsigned int )time (NULL)
输入一串字符:while((ch=getchar())!='\n')