练习题目
1.计算n的阶乘。
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d", &n);
for( i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("ret = %d\n",ret);
return 0;
}
2.计算1!+2!+......+10!。
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for(n = 1; n <= 10; n++)//将n从1循环到10
{
for(i = 1; i <= n; i++)//求n的阶乘
{
ret = ret * i;
}
sum = sum + ret;
ret = 1; //对ret进行初始化,否则将一直累加
}
printf("%d\n",sum);
return 0;
}
3.在一个有序数组中查找某个具体数字n。
编写int binserch(int x ,int v[],int n);
功能:在v[0]<=v[1]<=v[2]<=...<=v[n-1]的数组中查找x。
写法一:
#include<stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int k = 7;
//写一个代码,在arr数组中找到7
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]); //python中的len()函数的数组型替代
for(i = 0; i < sz; i++)
{
if(k == arr[i])
{
printf("找到了下标是:%d\n", i);
break;
}
}
if (i == sz)
{
printf("找不到");
}
return 0;
}
#此写法为遍历写法,最坏的情况是查找n次。
写法二:
既然是有序数组,那么可以找中间数比较大小,比中间数大的在右边,比中间数小的在左边,这种算法叫折半查找算法(二分查找算法),效率是更高的。
1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9
先求中间数:下标平均值:(9+0)/ 2 = 4 ...... 1, 取4
5的下标为4 ,5 < 7, 查找右边区间,以此类推,最多算4次,此时算法复杂度为ln2/ln10
即log2(n),当n的次数逐渐增大时,第二种算法的优越性就凸显出来了
eg: n = 2^32时
写法一:2^32次
写法二:32次
#include<stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sz = sizeof(arr) / sizeof(arr[0]); //计算元素数
int left = 0;
int right = sz - 1; //右下标
int k = 7; //寻找对象
while(left <= right)
{
int mid = (left + right) / 2;//对mid的一个更新过程。
if(arr[mid] > k)
{
right = mid -1;
}
else if (arr[mid] < k)
{
left = mid +1;
}
else
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
ps:1.对while循环条件的判断:找一组数字推到最后看看找不到会发生什么样的结果。
2.逻辑是找到了就停止了,不关心有几个的问题。
4.编写代码,演示多个字符向两端汇聚。
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
int main()
{
// 有两串字符:
// 1234567890qwertyuiopasdfghjkl
// #############################
//写法:将第一行字符的两端依次替换掉两边的#
char arr1[] = "1234567890qwertyuiopasdfghjkl";
//元素个数不给定,初始化以后方字符串的大小为准
char arr2[] = "#############################";
int left = 0;
int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
//为什么是减二呢?
// 字符串的存放方式是[0 1 2 3 ...... l \0]
// \0这个东西会包含进arr1的大小中,会影响right的结果,若是减一的话,选中的就是 \0 了
//或者
// int right = strlen(arr1) - 1;
//库文件是string.h
//一种只计算字符串长度的函数//
while(left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
//休息一秒
Sleep(1000);//单位是毫秒
//库文件是windows.h
system("cls");//执行系统命令的一个函数---cls---清空屏幕
//库文件是stdlib.h
left++;
right--;
}
return 0;
}
5.编写代码实现,模拟用户登陆情景,并且只能登录三次。
(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均错误,则退出程序)
#include<stdio.h>
#include<string.h>
int main()
{
int i = 0;
char password[20] = {0};
for(i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
if (strcmp(password,"123456") == 0)
//等号==不能用来判断字符串是否相等
//应使用库函数strcmp() == 0/1
//头文件是string.h
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误");
}
}
if (i == 3)
{
printf("三次密码均错误,退出程序\n");
}
return 0;
}
6.输出1000-2000年之间的闰年和闰年的数量。
#include<stdio.h>
int main()
{
int year = 0;
int count = 0;
for( year = 1000; year <= 2000; year++)
{
//判断是否为闰年
//1.能被4整除并且不能被100整除是闰年
//2.能被400整除是闰年
if(year % 4 == 0 && year % 100!= 0)
{
printf("%d ", year);
count++;
}
else if(year % 400 == 0)
{
printf("%d ", year);
count++;
}
}
printf("\ncount = %d\n",count);
return 0;
}
7.输出100-200之间的素数以及素数的个数。
//输出从100到200之间的素数
#include <stdio.h>
int main()
{
//素数判断
//试除法
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
int j = 0;
for(j = 2; j <= i-1; j++)
{
if(i % j == 0 )
{
break;
}
}
if( j == i)
{
printf("%d\n", i);
count++;
}
}
printf("count = %d",count);
return 0;
}
//输出从100到200之间的素数
#include <stdio.h>
#include<math.h>
int main()
{
//素数判断
//试除法
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)//偶数不可能是素数
{
int j = 0;
for(j = 2; j <= sqrt(i); j++)//开平方的库函数
{
if(i % j == 0 )
{
break;
}
}
if( j >sqrt(i))//i 的每个因子都不会大于根号i
{
printf("%d\n", i);
count++;
}
}
printf("count = %d",count);
return 0;
}
8.
//统计1-100之间含9的个数
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
for(i = 1; i <= 100; i++)
{
if(i % 10 == 9)
count++;
if(i/10 == 9)
count++;
}
printf("count = %d\n",count);
return 0;
}
9.求10个整数的最大值。
//求10个整数的最大值
#include<stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int max = arr[0];//max初始化不能是零,因为0比任何负数都大。
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for(i = 0; i < sz; i++)
{
if(arr[i] > max)
max = arr[i];
}
printf("max = %d\n",max);
return 0;
}
10.输出九九乘法表。
//输出乘法口诀表
//1*1=1
//2*1=2 2*2=4
//......
#include<stdio.h>
int main()
{
int i = 0;
for(i = 1; i <= 9; i++)
{
//打印一行的信息
int j = 1;
for(j = 1; j <= i; j++)
{
printf("%d*%d=%-2d ", i, j, i*j);
}//%2d表示占两位,右对齐
//%-2表示占两位,左对齐
printf("\n");
}
return 0;
}