目录
前言
一、模拟用户登录情景
1、要求
2、代码
二、求两数的最大公约数
1、方法简介
2、代码
三、打印闰年
1、要求与概念
2、代码
四、打印100-200之间的素数
1、方法与概念
2、代码
3、优化1
4、优化2
五、编写程序求1-100之间的整数中出现了多少次9
1、方法
2、代码
六、分数求和
1、要求
2、代码
七、求十个整数中的最大值
1、方法
2、代码
总结
本篇文章为“#正式学C语言--笔记_day-1”中练习题的答案详解。
模拟用户登录场景,并且只能登录三次,只允许输入三次密码,若输入正确,则提示登录成功,若三次均输入错误则退出程序。
注:其中的strcmp()为比较字符串的函数,若两个字符串相同,则输出0,需要引入头文件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)
{
printf("登陆成功");
break;
}
else
printf("密码错误\n");
}
if (i == 3)
printf("已退出程序");
return 0;
}
本处采用辗转相除法。
辗转相除法:
欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。
扩展欧几里得算法可用于RSA加密等领域。
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
//给定两个数,求两个数的最大公约数
int main()
{
int a = 0;
int b = 0;
int ret = 0;
printf("请输入两个数,用空格隔开>:");
scanf("%d %d", &a, &b);
//先把两个数从大到小放入a和b
if (a < b)
{
int tmp = a;
a = b;
b = tmp;
}
//辗转相除法
while (ret = a % b)
{
a = b;
b = ret;
}
printf("最大公约数为:%d\n", b);
return 0;
}
要求:打印1000-2000年之间的闰年
闰年:闰年是指年数能被400整除或者能被4整除但不能被100整除的年份
//打印1000-2000年之间的闰年-闰年是指年数能被400整除或者能被4整除但不能不100整除的年份
int main()
{
int i = 0;
int count = 0;//用来计数
for (i = 1000; i <= 2000; i++)
{
if ((i % 400 == 0) || (i % 4 == 0 && i % 100 != 0))//能被400整除或者能被4整除但不能不100整除
{
printf("%d是闰年\n", i);
count++;
}
}
printf("共有%d个", count);
return 0;
}
方法:试除法-即挨个取1和该数中间的数对该数进行试除,如果存在能整除的数,则它不是素数,如果不存在能整除的数,则它是素数。
素数概念:素数是指只能被1和其本身整除的数。
//打印100-200之间的素数
//试除法
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
}
if (j == i)
{
printf("%d是素数\n", i);
count++;
}
}
printf("素数一共有%d个", count);
return 0;
}
由于如果一个数不是素数,则在1和该数本身之间一定存在两个数的乘积等于该数,比如16不是素数,16=2*8=4*4、18=2*9=3*6。并且这两个数最大不超过根号该数。所以我们只需要判断2-根号该数之间的数。如16就判断2-4;
注:sqrt()函数为求根号函数,需引头文件math.h
//打印100-200之间的素数
//试除法优化1
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j <= sqrt(i); j++)//优化处1
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
printf("%d是素数\n",i);
count++;
}
}
printf("一共有%d个素数", count);
return 0;
}
由于偶数肯定不是素数,所以我们只需要判断奇数
//打印100-200之间的素数
//试除法优化2
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 101; i <= 200; i += 2)//优化处2
{
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
printf("%d是素数\n", i);
count++;
}
}
printf("一共有%d个素数", count);
return 0;
}
例:假设存在1-100之间的数a,a/10存储到整型中的便是它的十位,a%10存储到整型中的便是它的个位。
//编写程序数一下1-100的所有整数中出现多少个数字9
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("%d", count);
return 0;
}
计算1/1-1/2+1/3-1/4+1/5......+1/99-1/100的值,打印出结果。
//分数求和,计算1/1-1/2+1/3-1/4+1/5......+1/99-1/100的值,打印出结果。
int main()
{
int i = 0;
float add = 0;
int flag = 1;//用来控制正负号
for (i = 1; i <= 100; i++)
{
add += flag * (1.0 / i);
flag = -flag;
}
printf("和为%f", add);
return 0;
}
先对存储整数的数组按从小到大排序,再输出最大的数。
//求十个整数中的最大值
int main()
{
int arr[] = { -11,-50,-6,-4,-5,-12,-7,-8,-9,-10 };
int i = 0;
int max = 0;
int tmp = 0;
//对数组中元素按由小到大排序
for (i = 0; i < 9; i++)
{
if (arr[i] > arr[i + 1])
{
tmp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = tmp;
}
}
printf("%d", arr[9]);
return 0;
}
像我这样的初学者建议多动手实践,一定要自己先根据题目写出代码完成题目的实现,再参考答案。