C语言练习题 闰年、素数、二分查法
目录
1. 闰年问题判断(1000到2000年之间的闰年)
说明:
1. 能被4整除却不能被100整除 或者第2.点
2. 能被400整除的(整数年份,比如1900、2000)
注 : 在2019当中 scanf 函数提示有风险警告,添加下面预处理命令后方可使用 scanf 函数
#define _CRT_SECURE_NO_WARNINGS 1 //scanf 函数的未识别错误处理,否则使用 scanf_s 函数名
#include <stdio.h>
int main()
{
int i;
int count = 0;
for (int i = 1000; i <= 2000; i++)
{
/* first
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
{
printf("%d ", i);
count++;
}
*/
//second
if (i % 4 == 0 && i % 100 != 0)
{
printf("%d ",i);
count++;
}
else if(i % 400 == 0)
{
printf("%d ", i);
count++;
}
}
printf("\ncount = %d", count);
return 0;
}
2. 100到200之间的素数
说明:
1.质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
2.1和其自身;用2到“自身-1”之间的数去试除,只要有一个数能够被整除就不是素数
注 : 在2019当中 scanf 函数提示有风险警告,添加下面预处理命令后方可使用 scanf 函数
#define _CRT_SECURE_NO_WARNINGS 1//scanf 函数的未识别错误处理,否则使用 scanf_s 函数名
#include <stdio.h>
//**方法一**
int main()
{
int i;
int j;
for (i = 100; i <= 200; i++)
{
for (j = 2; j < i; j++)
{
if (i % j == 0) //余数为0,能被整除;不是素数!
{
break;
}
}
if (i == j) //2到j之间的数一一试除;若没有一个,则退出j的循环
{
printf("%d ", i);
}
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1 //scanf 函数的未识别错误处理,否则使用 scanf_s 函数名
#include <stdio.h>
//**方法二**
//1.判断Flag标志
int main()
{
int i;
int j;
for (i = 100; i <= 200; i++)
{
int Flag = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0) //余数为0,能被整除;不是素数!
{
Flag = 1;
break;
}
}
if (Flag == 0)
{
printf("%d ", i);
}
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1 //scanf 函数的未识别错误处理,否则使用 scanf_s 函数名
#include <stdio.h>
#include "math.h"
//**方法三**
//1. 判断这个整数(i)的开平方
//2. 若 i = a * b ,则a和b中一定至少有一个数字是 <= 开平方的 i 的
int main()
{
int i;
int j;
int count = 0;
for (i = 100; i <= 200; i++)
{
int Flag = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0) //余数为0,能被整除;不是素数!
{
Flag = 1;
break;
}
}
if (Flag == 0)
{
count++;
printf("%d ", i);
}
}
printf("\n%d ", count);
return 0;
}
3. 二分查找(binary search)
说明:
1. 写一个函数,实现一个整形的 有序数组 的二分查找。
想法 :
1.先求“顺序数组”的中间位置
2.然后将中间位置上的数据与所求数据进行对比;
3.若中间数据大于所求数据,则‘判断空间’位于中间位置的左侧,反之,右侧!多次循环,找到为止!
注 : 在2019当中 scanf 函数提示有风险警告,添加下面预处理命令后方可使用 scanf 函数
#define _CRT_SECURE_NO_WARNINGS 1 //scanf 函数的未识别错误处理,否则使用 scanf_s 函数名
#include <stdio.h>
int Binary_search(int a[], int i, int n)
{
int left = 0;
int right = n - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] < i) //说明中间数小于要找的数,则左下标变为mid+1;右下标不变
{
left = mid + 1;
}
else if (a[mid] > i)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
printf("输入要查询的数字,范围为:1~10\n");
scanf("%d",&i); //输入要查询的数字
int num = sizeof(arr) / sizeof(arr[0]);
//能查询到,则将查询到的下标返回;没查询到,则返回-1;(因为0也有可能是要查询数字的下标,所 以返回-1)
int ret = Binary_search(arr,i,num);
if (-1 == ret)
{
printf("查不到,请检查输入!");
}
else
{
printf("%d",ret);
}
return 0;
}
4. 计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 …+ 1/99 - 1/100的值
说明:
1. 计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 …+ 1/99 - 1/100的值
想法 :
1.可以先计算全加,确定计算模式
2.观察,判断分母为偶数时符号为 - ;分母为奇数时为 + ;
3.3.或设置Flag,用Flag乘以计算结果,Flag = -Flag交叉符号
注 : 在2019当中 scanf 函数提示有风险警告,添加下面预处理命令后方可使用 scanf 函数
//**方法一**
//#define _CRT_SECURE_NO_WARNINGS 1 //scanf 函数的未识别错误处理,否则使用 scanf_s 函数名
//#include <stdio.h>
//
//int main()
//{
// int i = 0;
// double sum = 0.0;
// for (i = 1; i <= 100; i++)
// {
// if (i % 2 != 0)
// {
// sum += 1.0 / i;
// }
// else
// {
// sum -= 1.0 / i;
// }
// }
// printf("%lf",sum);
// return 0;
//}
//**方法二**
#define _CRT_SECURE_NO_WARNINGS 1 //scanf 函数的未识别错误处理,否则使用 scanf_s 函数名
#include <stdio.h>
int main()
{
int i = 0;
double sum = 0;
int Flag = 1;
for (i = 1; i <= 100; i++)
{
sum += Flag*(1.0 / i);
Flag = -Flag;
}
printf("%lf", sum);
return 0;
}
注:文章内容限于作者才疏学浅,有问题,请指正!