说明:n! = 1234…*(n-1)*n
/*例程1.1*/
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int k = 1;
printf("请输入所求n的阶乘:");
scanf("%d",&n);
for (i = 1; i <= n; i++)
{
k = k*i;//根据阶乘的性质,用k存储自身与i的变量,实现阶乘
}
printf("%d\n",k);
return 0;
}
/*例程1.2*/
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int k = 1;
int sum = 0;
//方法一:
for (n = 1; n <= 10; n++)
{
k = k*n;
sum = sum + k;
}
//方法二:
for (n = 1; n <= 10; n++)
{
k = 1;//注意:计算n阶乘之前需要将K置1
//阶乘运算
for (i = 1; i <= n; i++)
{
k = k*i;
}
//阶乘的和
sum = sum + k;
}
printf("%d\n", sum);
return 0;
}
a、二分查找法
b、如:1 2 3 4 5 6 7 8 9 10
c、通过下标和来**/2**进行计较筛选
/*例程1.3*/
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int num = 7;//要查找的数字
//在arr有序数组中查找k(7)的具体值
//计算数组元素的个数
int sz = sizeof(arr) / sizeof(arr[0]);
//定义左右下标
int left = 0;
int right = sz - 1;
while (left<=right)
{
//取中间的下标
int mid = (left + right) / 2;
if (arr[mid]<num)
{
left = mid + 1;//右下标没变,左下标加1,构成新范围查找
}
else if (arr[mid]>num)
{
right = mid - 1;//左下标没变,右下标减1,构成新范围查找
}
else
{
printf("找到了,具体数的下标:%d\n", mid);
break;
}
}
if (left > right)//左下标与右下标交错
{
printf("超出范围,找不到\n");
}
return 0;
}
如:
welcome to beijing!!!!!!
########################
w######################!
we####################!!
........
welcome to beijing!!!!!!
/*例程1.4*/
#include <stdio.h>
#include <string.h>//调用strlen()需要的头文件
#include <windows.h>//调用sleep()与system()需调用的头文件
int main()
{
char arr1[] = "welcome to beijing!!!!!!";
char arr2[] = "########################";
//定义下标
int left = 0;
int right = strlen(arr1)-1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//延迟1000ms//注意:首字母大写
system("cls");//清空屏幕
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
说明:如果密码输入正确,则提示登录完成,如果三次均输入错误,则强制退出程序。假设正确密码是字符串:“123456”
/*例程1.5*/
#include <stdio.h>
#include <string.h>//运用strcmp()函数需要调用的头文件
int main()
{
int i = 0;
char password[20] = {0};
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s",password);
//注意:%s才是字符串的格式符
//scanf("%d",&password);//注意:数组名本身就是地址,所以不加取地址符&
//if ("123456" == password)//注意:字符串之间的比较,不可以之间==判断
//需要strcmp(stm1,stm2)字符串比较函数
//比较stm1y与stm2的ASCII的值相等则,返回值为0
//stm1>stm2则返回1
//stm1
if (strcmp(password, "123456") == 0)
{
printf("密码正确\n");
break;
}
else
{
printf("密码错误\n");
}
}
//三次密码均错误
if(i > 3)
{
printf("密码错误强制退出\n");
}
return 0;
}
方法一:
/*例程1.6*/
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int t = 0;
int m = 0;
printf("请输入第一个数:");
printf("\n");
scanf("%d",&i);
printf("请输入第二个数:");
printf("\n");
scanf("%d", &j);
printf("请输入第三个数:");
printf("\n");
scanf("%d", &t);
if (i < j)
{
m = i;
i = j;
j = m;
if (i < t)
{
printf("Max = %d\n",t);
printf("Mid = %d\n", i);
printf("Min = %d\n", j);
}
else if (j < t)
{
printf("Max = %d\n", i);
printf("Mid = %d\n", t);
printf("Min = %d\n", j);
}
else//t
{
printf("Max = %d\n", i);
printf("Mid = %d\n", j);
printf("Min = %d\n", t);
}
}
else//i>j
{
m = j;
j = i;
i = m;
if (j < t)
{
printf("Max = %d\n", t);
printf("Mid = %d\n", j);
printf("Min = %d\n", i);
}
else if (i < t)
{
printf("Max = %d\n", j);
printf("Mid = %d\n", t);
printf("Min = %d\n", i);
}
else//t
{
printf("Max = %d\n", j);
printf("Mid = %d\n", i);
printf("Min = %d\n", t);
}
}
return 0;
}
方法二:
/*例程1.6*/
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d",&a,&b,&c);//注意:空格原样输入
if (a < b)//将较大值赋值给a--a>b
{
int temp = a;//交换变量//可思考进阶,封装函数实现,然后调用
a = b;
b = temp;
}
if (a < c)//将较大值赋值给a---a>c
{
int temp = a;
a = c;
c = temp;
}
if (b < c)//将较大值赋值给b---b>c
{
int temp = b;
b = c;
c = temp;
}
printf("%d %d %d\n",a,b,c);
return 0;
}
说明:最大公约数:辗转相除法,比较两个数,用大的数对小的数取余,直到余数为零时,得到的(小的数)被除数就是最大公约数
方法一:
/*例程1.7*/
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
printf("请输入第一个整数:");
scanf("%d",&m);//24
printf("请输入第二个整数:");
scanf("%d",&n);//12
int temp = 0;
while (temp = m%n)//判断余数真假,真执行
{
m = n;
n = temp;
}
printf("最大公约数为:%d\n",n);//取出余数为零时,被余数n,即最大公约数
//扩展:最小公倍数---m*n/最大公约数
return 0;
}
方法二:
/*例程1.7*/
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
printf("请输入两个整数:");
scanf("%d %d",&m,&n);
int max = 0;
//假设最大公约数max就是m与n的较小值
if (m < n)
{
max = m;
}
else
{
max = n;
}
while (1)
{
if (m%max == 0 && n%max == 0)//说明max满足同时整除m与n
{
printf("最大公约数为:%d\n",max);
break;
}
max--;//从较小值减1,直到出现公因数
}
return 0;
}
说明:闰年:能被4整除,不能被100整除的是闰年;或者能被100和400同时整除的也是闰年
/*例程1.8*/
#include <stdio.h>
int main()
{
int year = 0;
int year1 = 0;
int year2 = 0;
int count = 0;
for (year = 1000; year <= 2000; year++)
{
//能被4整除,不能被100整除的
year1 = year % 4;//条件一:能被4整除
year2 = year % 100;//条件二:不被100整除
//方法一:
//if ((year1 == 0) && (year2 != 0))
//{
// printf("闰年:");
// printf("%d\n",year);
// count++;
//}
能被100和400同时整除的
//if (year % 400 == 0)
//{
// printf("闰年:");
// printf("%d\n", year);
// count++;
//}
//方法二:
if ((year1 == 0) && (year2 != 0) || (year % 400 == 0))
{
printf("闰年:");
printf("%d\n", year);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}
说明:素数—质数:指的是“大于1的整数中,只能被1和这个数本身整除的数”,被称为素数
/*例程1.9*/
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//判断素数:2->i-1之间的数去试除i,看能否整除
int j = 0;
for (j = 2; j < i; j++)
{
if(i%j == 0)//如果被,除了1和i本身以外的数j整除了,那么此时i不是素数
{
break;
}
}
if (j == i)//当j = i时,说明,在2~(i-1)之间没有可以整除的数,所以是素数
{
printf("素数:");
printf("%d\n",i);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}
引用标志flag的思想优化代码:
/*例程1.9*/
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//判断素数:2->i-1之间的数去试除i,看能否整除
int j = 0;
int flag = 1;//假设标志i为素数
for (j = 2; j < i; j++)
{
if (i%j == 0)//如果被,除了1和i本身以外的数j整除了,那么此时i不是素数
{
flag = 0;//不是素数
break;
}
}
if (flag == 1)//是素数
{
printf("素数:");
printf("%d\n", i);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}
引用sqrt()开平方函数和偶数的性质(i+=2)优化代码:
如:m = ab—>a和b中至少有一个数是 <= 开平方后的m
m=16–16=44=2*8
相当于直接减少一半的取模运算 ,从而提高效率
/*例程1.9*/
#include <stdio.h>
#include <math.h>//调用sqrt()需要调用的头文件
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)//i+=2,筛选掉了偶数,因为偶数能被2整除,可直接不计算,提高了运算效率
{
//判断素数:2->i-1之间的数去试除i,看能否整除
int j = 0;
int flag = 1;//假设标志i为素数
for (j = 2; j <= sqrt(i); j++)//sqrt(i)筛选掉不符合的数,提高运算速率
{
if (i % j == 0)//如果被,除了1和i本身以外的数j整除了,那么此时i不是素数
{
flag = 0;//不是素数
break;
}
}
if (flag == 1)//是素数
{
printf("素数:");
printf("%d\n", i);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}
说明:写一个猜数字小游戏
规则:
(1)自动产生一个(1~100)的随机数
(2)如果猜错,屏幕提示猜的数偏大或者偏小,然后继续猜,直到猜对数字
(3)游戏可一直进行,不用每次都点运行,除非自行退出
/*综合题例程1*/
#include <stdio.h>
#include <stdlib.h>//调用srand(),rand(),system()
#include <time.h>//调用time()需要声明的头文件
void menu()//游戏菜单
{
printf("***************************************\n");
printf("***************************************\n");
printf("**************1.play game**************\n");
printf("**************0.game over**************\n");
printf("***************************************\n");
printf("***************************************\n");
}
//实现随机数字和猜数字的功能
void game()
{
//生成随机数
//srand()函数,随机值起点
//根据输出结果得到,一个随机的固定值,不满足随机值
//所以提出时间戳概念,一个变化的值,作为srand参数,那么可实现功能
//时间戳:可将实时时间转换为数值,单位秒s,即格式化时间戳
//time(NULL);
//srand((unsigned int)time(NULL));
//位置放在main()里,因为每次玩游戏只需要生成一次随机值起点,不用开始游戏每次都生成
int ret = rand()%100+1;//%100的余数是0~99,+1,范围为1~100
//生成随机的函数rand(),查MSDN可知,返回整型,其取值范围0~32767
//注意:使用rand()前,需要提前调用srand(参数),参数为unsigned int型,srand()是随机起始点
//printf("%d\n",ret);
//猜数字
int guess = 0;
while (1)
{
printf("请猜数字:");
scanf("%d",&guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜中啦!!\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//这里不需要time的返回值参数,所以给NULL
//需要的是time的定义,即获取系统时间这个作为变量,使得srand()变化随机值的起点
//(unsigned int)将time(NULL)强制类型转换为unsigned int型
do
{
menu();
printf("请选择(0/1):");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("game over 退出游戏\n");
break;
default:
printf("输入无效,请重新选择!\n");
break;
}
} while (input);//判断input是否为真,真1执行,假0不执行
return 0;
}
说明:写一个关机整蛊程序(温馨提示:请适度酌情使用)
规则:
(1)只要运行,电脑将在规定时间内关机,当输入:我是猪,才解除关机
(2)基于windows–命令窗口
(3)shutdown(关机命令):shutdown -s -t 60
(4)-s关机设置,-t关机时间设置 60时间单位秒s
(5)shutdown(接触关机命令):shutdown -a
(6)结合操作系统,自启动服务器,无限套娃,请适度酌情使用。
/*综合题例程2*/
#include <stdio.h>
#include <stdlib.h>//调用system()函数需申明的头文件
//system()函数---执行系统命令的函数
#include <string.h>//调用strcmp()需要声明的头文件
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
scanf("%s",input);
if (strcmp(input,"我是猪") == 0)//注意:字符串的比较不能直接==比较,需用strcmp()函数
{
system("shutdown -a");
}
else
{
goto again;//应用goto语句,实现循环功能
}
return 0;
}