1.打印3的倍数的数
(1)最基本的方法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 3;
while (a <= 100)//通过while循环遍历出1到100之间的所有数字。
{
if (a % 3 == 0)// a模3如果等于0,那说明就是3的倍数。
{
printf("%d ", a);
}
a++;
}
return 0;
}
(2)对(1)进行优化:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;//此处是对a进行初始化。
for (a = 3; a <= 100; a += 3)//运用for循环,在3的基础上不断加3,永远是3的倍数。
{
printf("%d ",a);
}
return 0;
}
(题目的解析都在代码的注释里面哦~)
2.从大到小输出
(1)(通过创建临时变量tmp来进行两个数之间的交换)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int tmp = 0;//在这里为什么要创建一个临时变量?
printf("请输入三个整数:");
scanf("%d %d %d", &a, &b, &c);
if (a < b)
{
tmp = a;//创建一个临时变量的原因很简单,你要对两个比较之后的数据进行实质上的交换。
a = b;//如果不创建临时变量,会导致数据丢失。
b = tmp;//比如,如果a=2,b=7的话,你仅简简单单的:a=b;这样再往后做的话,就会导致a的数据丢失。
} //现在可好a等于7了,那a原来的值就不见了。所以说要创建一个临时变量,也就是比喻中的空瓶子,来进行数据的实质性的交换。
if (a < c)
{
tmp = a;
a = c;
c = tmp;
}
if (b < c)
{
tmp = b;
b = c;
c = tmp;
}
printf("%d %d %d\n", a, b, c);//从这一行代码可以看出,我直接固定了三个整数从大到小顺序就是a,b,c
return 0;
}
(2)举一反三:小乐乐获得4个最大数,请帮他编程找到最大的数。
#include <stdio.h>
//小乐乐获得4个最大数,请帮他编程找到最大的数。
int main()
{
int a, b, c, d;
int tmp = 0;
scanf("%d %d %d %d", &a, &b, &c, &d);
if (a < b)
{
tmp = a;
a = b;
b = tmp;
}
if (a < c)
{
tmp = a;
a = c;
c = tmp;
}
if (a < d)
{
tmp = a;
a = d;
d = tmp;
}
printf("%d\n", a);
return 0;
}
3.打印素数(打印100~200之间的素数)
首先要明白什么是素数·?
素数就是质数,有无限个。除了1和该数本身以外不再有其他的因数的数被称为素数
(1)试除法:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>//试除法!!!
#include <math.h>
int main()
{
int i = 0;
int n = 0;
int count = 0;//标记素数的个数
for (i = 100; i <= 200; i++)
{
int flag = 1;//这里的flag为什么要放到内循环之前?因为每次被除数被更换的时候,先假设他是一个素数。
for (n = 2; n <= i-1; n++)//当外层循环确定一个数i之后,内存循环n一直从2累加到i-1,来当做除数被i除
{
if (i % n == 0)
{
flag = 0;
break;//如果能被整除,那么就跳出内层循环。这时flag被赋值为零,直接不用打印了,他不是素数。
}
}
if (flag == 1)//这个条件判断必须在内循环之后,因为如果它不进入内循环的if条件判断,flag不被赋值为零的时候,可以进行打印素数。
{
printf("%d\n", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
(这种是打印素数,最基本的思想方法:试除法)
解析,很详细,在代码中一定要仔细看。
(2)试除法 优化:
很显然,我们知道除了2之外,所有的偶数都不是素数。这样我们就可以在外层循环中把所有的偶数去掉,这样效率就会成半的增加。
#include <stdio.h>//试除法!!!
int main()
{
int i = 0;
int n = 0;
int count = 0;//标记素数的个数
for (i = 101; i <= 200; i+=2)//此处判断条件直接初始化将a赋值101,i+=2意思是除去所有偶数:因为他肯定不是素数。
{
//int n = 0;
int flag = 1;//这里的flag为什么要放到内循环之前?因为每次被除数被更换的时候,先假设他是一个素数。
for (n = 2; n <=i-1 ; n++)//当外层循环确定一个数i之后,内存循环n一直从2累加到i-1,来当做除数被i除
{
if (i % n == 0)
{
flag = 0;
break;//如果能被整除,那么就跳出内层循环。这时flag被赋值为零,直接不用打印了,他不是素数。
}
}
if (flag == 1)//这个条件判断必须在内循环之后,因为如果它不进入内循环的if条件判断,flag不被赋值为零的时候,可以进行打印素数。
{
printf("%d\n", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
(3)终极方法:数学法(效率指数倍的提升)
区别就在于内层循环的条件判断:
int main()
{
int i = 0;
int j = 0;
int count = 0;//标记素数的个数
for (i = 101; i <= 200; i += 2)//此处判断条件直接初始化将a赋值101,i+=2意思是除去所有偶数:因为他肯定不是素数。
{
int flag = 1;//这里的flag为什么要放到内循环之前?因为每次被除数被更换的时候,先假设他是一个素数。
for (j = 2; j <= sqrt(i); j++)//这里的解析,见我下图列的图片。
{
if (i % j == 0)//当外层循环确定一个数i之后,内存循环j一直从2累加到i-1,来当做除数被i除
{
flag = 0;
break;//如果能被整除,那么就跳出内层循环。这时flag被赋值为零,直接不用打印了,他不是素数。
}
}
if (flag == 1)//这个条件判断必须在内循环之后,因为如果它不进入内循环的if条件判断,flag不被赋值为零的时候,可以进行打印素数。
{
printf("%d\n", i);
count++;
}
}printf("\ncount=%d\n", count);
return 0;
}
其实求解素数的方法有很多种,想要深入研究,请参考《求解素数的n种境界》
4.打印闰年(打印1000年到2000年之间的闰年)
首先你要明白什么是闰年。闰年,实际上不是你想象中的4年一闰都是闰年
标准答案:.闰年的计算,归结起来就是通常说的:四年一闰,百年不闰,四百再闰。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1000; i <= 2000; i++)
{
if (i % 4 == 0 && i % 100 != 0)//或者这里直接模上400
{
printf("%d ", i);
}
}
return 0;
}
5.最大公约数
在这里我介绍两种方法,第1种是暴力枚举法,第2种是辗转相除法。
(1)暴力枚举法:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()//暴力枚举法
{
int a = 0;
int b = 0;
int min = 0;//因为要求最大公约数,所以我们把要输入的那两个数的最小值当做:除数。
printf("请输入你想要求的两个数的最大公约数:");
scanf("%d %d", &a, &b);
if (a > b)
{
min = b;
}
if (a < b)
{
min = a;
}
while (1)
{
if (a % min == 0&&b%min==0)//在这里最大公约数的意思就是,这个除数要满足同时被两个数整除。
{
printf("最大公约数是:%d\n", min);
break;
}
else
{
min--;//这就是暴力枚举法:在较小的那个数上依次往下减,一直减到能够被你输入的那两个数整除为止,才会找到最大公约数。
}
}
return 0;
}
(2)对 暴力枚举法 的部分进行优化:
#include <stdio.h>
int main()//暴力枚举法
{
int a = 0;
int b = 0;
int min = (a>b?b:a);//在这里我们对上述方法进行改进,运用了三目操作符来确定两个数中的较小值。
printf("请输入你想要求的两个数的最大公约数:");//(因为要求最大公约数,所以我们把要输入的那两个数的最小值当做:除数。)
scanf("%d %d", &a, &b);
while (1)
{
if (a % min == 0 && b % min == 0)//在这里最大公约数的意思就是,这个除数要满足同时被两个数整除。
{
printf("最大公约数是:%d\n", min);
break;
}
else
{
min--;//这就是暴力枚举法:在较小的那个数上依次往下减,一直减到能够被你输入的那两个数整除为止,才会找到最大公约数。
}
}
return 0;
}
(3)求最大公约数的最棒的办法:辗转相除法!!!
#include <stdio.h>
int main()//辗转相除法!!!!辗转相除法,求最大公约数,非常快。
{
int m = 0;
int n = 0;
int k = 0;
printf("请输入你想要求的两个数的最大公约数:");//(因为要求最大公约数,所以我们把要输入的那两个数的最小值当做:除数。)
scanf("%d %d", &m, &n);
while (k = m % n)//如果m模n的值为0,那么就是为假,不进入循环.如果是非零,那么继续循环,继续寻找最大公约数。
{
m = n;
n = k;//解析见下图。
}
printf("最大公约数是:%d\n", n);
return 0;
}
这里我们做一张图片来进行分析:
自己需要多想想,多练练就会了,加油!!!
6.求10 个整数中最大值
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = { -1,-2,-3,-4,-5,6,-7,-8,-9,10 };
int i = 0;
int max = arr[0];//在这里我们假设下标为0,也就是数组中的第1个数为最大值
for (i = 0; i <= 10; i++)
{
if (arr[i] > max)//建立一个for循环,让我们假设的这个数依次与数组中剩余的数作比较
{
max = arr[i];//如果数组中有其他数大于我们假设的那个数,我们就把最大值赋给max
}
}printf("%d\n", max);
return 0;
}
解析在代码的注释中仔细看一下
7.分数求和(计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果)
简单分析一下,这个所求的表达式:分子都是1,分母:偶数为负,奇数为正。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
double sum = 0;
for (i = 1; i <= 100; i++)//建立一个for循环遍历分母中从1~100的数字。
{ //下面的这个if和else相当于数学中的 数列 分组求和 负的在一起,正在一起。
if (i%2==0)//判断分母是否为偶数。
{
sum = sum - (1.0 / i);//因为分母是偶数,所以所有负数集中if这个大框架中。
}
else
{
sum = sum + (1.0 / i);//因为分母是奇数,所以所有的正数集中在这个else的大框架中。
}
}printf("%lf\n", sum);//最终打印出sum是我们所求的值。
return 0;
}
(解析在图片代码中的注释里认真看一下,应该能看懂的)
8.编写程序数一下 1到 100 的所有整数中出现多少个数字9
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int res = 0;
for (i = 1; i <= 100; i++)
{
if (i % 10 == 9)
{
res = i;
printf("%d\n", res);
}//这是90之前所有出现9的数字。
else if (i >= 90 && i <= 99)
{
res = i;
printf("%d\n", res);
}//这是打印90~99之间的数字。
}
return 0;
}
(同样解析,在代码的注释里,可以仔细看一下哟)
9.二分查找(前提必须是:序数数组)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int k = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int flag = 0;
int left = 0;
int right = (sizeof(arr) / sizeof(arr[0])) - 1;//这里的left和right都是指的数组的下标。
int mid = (left + right) / 2;
printf("请输入你想要查找的数字:");
scanf("%d", &k);
while (left <= right)
{
if (k > arr[mid])
{
left = mid + 1;
mid = (left + right) / 2;//及时更新mid,重新确定下标,不断的缩小范围进行查找。
}
else if (k < arr[mid])
{
right = mid - 1;
mid = (left + right) / 2;//及时更新mid,重新确定下标,不断的缩小范围进行查找。
}
else if (k == arr[mid])
{
printf("找到了,在数组中的下标为:%d\n", mid);
flag = 1;
break;//及时跳出循环,
}
}
if (flag == 0)
{
printf("找不到了!\n");
}
return 0;
}
(二分查找是重中之重的思想,一定要学会。解析,在代码的注释里)
10.n的阶乘
基本思想:还是循环,for循环。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int res = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
res *= i;
}
printf("%d\n", res);
return 0;
}
11.前n个阶乘之和
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int res = 1;
int sum = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
res *= i;
sum += res;//这一步是整个程序的精华!在求前(n-1)个阶乘之后加上n。
}
printf("%d\n", sum);
return 0;
}
(解析在代码的注释里)
12.打印九九乘法口诀表
运用两次for循环,第1个控制第1个因子,第2个控制第2个因子。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
int j = 1;
int res = 0;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ",j,i,j*i);
}
printf("\n");
}
return 0;
}
13.请输入密码(用循环)
初识 strcmp=string compare.(用来比较两个字符串大小的函数)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>//假设密码是123456
#include <string.h>
int main()
{
int i = 0;
char password[20] = {0};//数组一定要初始化好,比如说你这个[]里面没有填20的话,你默认只输入一个0,那说明数字中就一个0的内存。
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", password);
//两个字符串比较相等是不能使用==的,应该使用strcmp库函数
//strcmp返回0表示2个字符串相等
//strcmp返回>0的数字,表示第一个字符串大于第二个字符串
//strcmp返回<0的数字,表示第一个字符串小于第二个字符串
if (strcmp(password,"123456") == 0)
{
printf("登陆成功!\n");
break;
}
else
{
printf("密码错误:");
}
}
if (3 == i)//判断条件表示,如果你输入次数等于三次直接退出程序。
{
printf("退出程序!\n");
}
return 0;
}
14.演示字符从两端向中间汇聚
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
int main()
{
char ch1[] = "welcome to bite!!!!!!!!!!";
char ch2[] = "#########################";
int left = 0;
int right = (sizeof(ch1) / sizeof(ch1[0])) - 1;//通过计算数组个数来确定数组最右端元素的下标。
while (left <= right)
{
ch2[left] = ch1[left];
ch2[right] = ch1[right];
Sleep(1000);//睡眠函数单位是毫秒
system("cls");//系统函数清空控制版面上的所有内容:cls
printf("%s\n", ch2);
left++;
right--;//用来控制字符,挨个的往中间汇聚。
}
return 0;
}
解析在代码中仔细看一下哟
15.小乐乐求和_牛客题霸_牛客网
#include <stdio.h>
int main()
{
long long i = 0;
long long ret = 0;//数据要用long long类型,避免输入的数字过大而导致数据溢出。
long long n = 0;//总体思想就是不断累加求和的过程。
scanf("%lld", &n);
for (i = 1; i <= n; i++)
{
ret += i;
}
printf("%lld\n", ret);
return 0;
}
16.判断是不是字母_牛客题霸_牛客网
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char a = 0;
while ((a = getchar()) != EOF)//EOF= End of file.文件结束的标志,实际上它返回值是-1。
{//通过运用while循环来实现多组输入。
if ('a' <= a && a <= 'z' || 'A' <= a && a <= 'Z')
{
printf("%c is an alphabet.\n", a);
}
else
{
printf("%c is not an alphabet.\n", a);
}
getchar();// getchar函数是从 输入缓冲区 中获取一个字符
}
return 0;
}
(题目的解析在代码的注释中)
17.网购_牛客题霸_牛客网
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
double price = 0;
int month = 0;
int day = 0;
int y = 0;
float ret = 0;
scanf("%lf", &price);
scanf("%d %d", &month, &day);
scanf("%d", &y);
if (month == 11 && day == 11 || month == 12 && day == 12)
{
if (month == 11 && day == 11)
{
if (1 == y)
{
ret = price * 0.7 - 50;
}
else
{
ret = price * 0.7;
}
}
else
{
if (1 == y)
{
ret = price * 0.8 - 50;
}
else
{
ret = price * 0.8;
}
}
}
if (ret < 0)//这个地方的条件判断就是题目中所说的,不可能让商家倒找钱。
{
ret = 0;
}
printf("%.2f\n", ret);//打印结果必须保留两位小数。
return 0;
}
(题目的解析在代码的注释中)
好了,今天的题目分享就到这里了,如果觉得对大家有帮助的话,可以给博主一个点赞和关注嘛,你们对我的支持,是我继续往下创作的最大动力哦!