练习题:

  1. 计算n的阶乘(不考虑溢出)

int main()

{

int n,i,s;

scanf("%d",&n);

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

s=s*i;

printf("%d",s);

return 0;

}

 

  1. 计算1!+2!+3!+......+10!结果

int main()

{

int i,n=1,m=0;

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

{

n=n*i;

m=m+n;

}

printf("%d",m)

return 0;

}

 

3.在一个有序数组中查找具体的某个数字n。编写int binsearch(intx,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=......<=v[n-1]的数组中查找x

例题(有些繁琐----所以引出二分法)

int main()

{

int arr[]={1,2,3,4,5,6,7,8,,10};

int i=0,k=7;sz=sizeof(arr)/sizeof(arr[0]);

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

{

if(k=arr[i])

printf("找到了,下标为%d\n",i);

break;

}

if(i==sz)

printf("找不到\n");

return 0;

}

 

折半查找算法/二分查找算法(最多log₂n次,n为元素次数)

int main()

{

int arr[]={1,2,3,4,5,6,7,8,9,10};

int k=7;                               //所要找到的目标数

int sz=sizeof(arr[i])/sizeof(arr[0]);          //计算数组中元素个数

int left=0;                             //左下标

int right=sz-1;                         //右下标

while(left<=right)                      //当二分后两者相等之后说明都扫描过了没有

{

int mid=(left+right)/2;                //二分

if(arr[mid]>k)                       //判断目标数在左边还是右边

    right=mid-1;                      //缩小范围

else if(arr[mid]<k)

left=mid+1;

else

printf("找到了,下标为%d",mid);

}

if(left>right)

printf("没找到")

return 0;

}

 

4.编写代码,演示多个字符从两端移动,向中间汇聚。

#include<stdio.h>

#include<string.h>                    //strlen的头文件

#include<windows.h>                 //Sleep的头文件

#include<stdlib.h>                    //system的头文件

int main()

{

char arr1[]="hollo!\(^v^)/~~~~";         //注意字符串用双引号,不用花括号

char arr2[]="#################";

int left=0;                           //左下标

int right=strlen(arr1)-1;                //右下标;strlen用来计算arr1字符串的元素个数,且会把\0自动不计入个数中,其

                                                       头文件为string.h

while(left<=right)

{

arr2[left]=arr1[left];

arr2[right]=arr2[right];

printf("%s\n",arr2);

Sleep(1000);                          //指休息一秒;Sleep指休息,停留,其头文件为windows.h;括号内的1000指1000毫

                                                秒=1秒;

system("cls")                         //system指执行系统命令的一个函数,头文件为stdlib.h;cls指清空屏幕

left++;

right++;

}

printf("%s\n",arr2);

return 0;

}

 

5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)

#includ<stdio.h>

#includ<string.h>

int main()

{

int i=0;

char password[20]={0};

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

{

printf("请输入密码:\n");

scanf("%s",password);

if(strcmp(password,"123456")==0)          //strcmp用来比较两个字符串是否相等,因为==不能用在这里(在这个版

                                                                    本里);头文件为string.h

{

printf("登录成功\n");

break;

}

}

if(i==3)

printf("三次密码均错误,退出程序\n");

}

 

 

 

 

计算三个数从大到小排列时使用冒泡算法时,可以不用空杯子,用a=a+b;b=a-b;a=a-b;省内存

计算两个数的最大公约数时用辗转相除法在为余数0(为假)时结束

int main()

{

int n,m,r=0;

scanf("%d%d",&m,&n)

while(m%n)

{

r=m%n;

m=n;

n=r;

}

printf("%d\n",n);

return 0;

}

闰年指能被4整除且不能被100整除的数或者可以被400整除的数

判断素数可以

1.用试除法,因为素数指只能被1和它本身整除;所以用2到其本身-1的数字依次去除,看有没有能被整除的,没有就说明是素数;

2.因为只要这个数可以用a*b表示,就说明这个数不是素数,且可以说明a和b中至少有一个数字小于等于开平方i,这样只要2到i的开平方前没有可以使i整除的数时,就说明i是素数;再说偶数一定不是素数,所以可以直接去掉偶数(优化计算时间效率

#include<stdio.h>

#include<math.h>

int main()

{

int i,count=0;

for(i=101;i<=200;i+=2)

{

int j=0;

for(j=2;j<=sqrt(i);j++)                 //sqrt指开平方

{

if(i%j==0)

{

break;

}

}

if(j>sqrt(i))

{

count++;

printf("%d",i);

}

}

printf("\ncount=%d\n",count);

return 0;

}

可以参考《素数求解的n种境界》

说明日常思考很重要