经典的比较大小问题,数字个数为4,有限个输入,可采取的方法很多
#include
void main(){
int a,b,c,d;
printf("请输入四个整数");
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>b)
if(a>c)
if(a>d)
printf("最大的数为%d",a);
else
printf("最大的数为%d",d);
else
if(c>d)
printf("最大的数为%d",c);
else
printf("最大的数为%d",d);
else
if(b>c)
if(b>d)
printf("最大的数为%d",b);
else
printf("最大的数为%d",d);
else
if(c>d)
printf("最大的数为%d",c);
else
printf("最大的数为%d",d);
}
在此案例中我们使用了每两个数之间比较,将大数与后边的数继续比较,最后输出最大数的过程,此问题解决的选择结构中判断条件有多种写法,不再多述。
又是典型的选择结构,特殊三角形包含如下:
以及上述三角形的特殊情况及它们的组合
此例中我们简单介绍一下C语言的选择结构
if(表达式1){
语句1
}
else if(表达式2){
语句2
}
else{
语句3
}
以上结构,当表达式1结果为真时,会执行语句1,当表达式1为假且表达式2为真时,会执行语句2,表达式1与表达式2都为假时,会执行语句3,可以用if来实现简单的条件判断,else if 与 else 不是必须,且我们可以认为最后的else是并列于表达式1的if,也可认为是并列于表达式2的if。
#include
void main()
{
double a, b, c;
scanf("%lf%lf%lf", &a, &b, &c);
if (a < (b + c) && b < (a + c) && c < (a + b))
{
printf("三边可以构成三角形\n");
if (a == b || b == c || a == c)
{
if (a == b && b == c)
printf("输入的三边组成等边三角形");
else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
printf("输入的三边组成等腰直角三角形");
else
printf("输入的三边组成等腰三角形");
}
else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
printf("输入的三边组成直角三角形");
else
printf("组成的三角形为普通三角形");
}
else
printf("输入的三边构不成三角形,请重新输入");
}
判断整数位数,我们可以用整除10的次数来判断,比如
915 / / 10 = 91 915//10 = 91 915//10=91 91 / / 10 = 9 91 //10 =9 91//10=9 9 / / 10 = 0 9//10 = 0 9//10=0
整除3次后商为0,所以915是三位数,此结构可以用while循环来实现,while循环的结构之前的文章中讲述过了,这里不多叙述
#include
void main(){
int n,cnt=0;
printf("请输入不超过5位的整数");
scanf("%d",&n);
while(n){
n /= 10;
cnt += 1;
}
printf("该数为%d位数",cnt);
}
我们来看一下运行的效果
请输入不超过5位的整数915
该数为3位数
请输入不超过5位的整数1051
该数为4位数
本案例可以测试整个int存储范围之内的自然数,更改变量类型为长整型时可测试的数据更多
首先我们来介绍一下switch的用法
switch (表达式)
{
case 表达式情况1:
语句1;
break;
case 表达式情况2:
语句2;
break;
default:/* 否则 */
语句3;
break;
}
所谓switch就是选择表达式情况,执行对应情况的对应语句
网上找到的一个销售提成的题目
企业发放的奖金根据利润原则。利润Ⅰ低于或者等于100 000元的,奖金可提10%;利润高于100 000元,低于200 000元
( 100 000 1000 000元时,超过1000 000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。
我们来看一下这个案例的代码
#include
void main(){
double res,I;
int method;
printf("请输入获得的利润I");
scanf('%lf',I);
method = (int)(I/10000);
switch (method)
{
case 0:res = I * 1.1;
break;
case 1:res = 11000+(I-10000)*1.075;
break;
case 2:
case 3:res = 21750 + (I-20000)*1.05;
break;
case 4:
case 5:res = 42750 + (I-40000)*1.03;
break;
case 6:
case 7:
case 8:
case 9:res = 63350 + (I-60000)*1.015;
break;
default:res =103950 +(I-100000)*1.01;
break;
}
printf("利润提成过后%d",res);
}
此案例中通过 I / / 10000 I//10000 I//10000来确定收入利润的数量级,并且在case后通过break;来确定计算方式。
非常典型的迭代题目,迭代公式由下放给出
y e a r n + 1 = r a t e ⋅ y e a r n year_{n+1} = rate\cdot year_n yearn+1=rate⋅yearn
其中 y e a r n year_n yearn表示第n年的工业产值且 y e a r 0 = 1 ( 亿 ) year_0 = 1(亿) year0=1(亿)
迭代的终止条件
y e a r n ≥ 2 ( 亿 ) year_n\geq 2(亿) yearn≥2(亿)
因为次数不定,所以循环的条件并不能确定次数,我们可以通过改变传统for循环的终止条件或是使用while循环来实现
首先来看while循环的一种写法
#include
void main(){
double value = 1,rate = 0.06;
int year = 1;
while(1){
value *= (1+rate);
year += 1;
if (value > 2)
break;
}
printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}
此例中我们使用while True 的方式构建了死循环,当达到迭代的终止条件时跳出循环来找到对应的年份
#include
void main(){
double value = 1,rate = 0.08;
int year = 1;
while(value<2){
year += 1;
value *= (1+rate);
}
printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}
对照while的案例我们给出for循环的参考代码
#include
void main(){
double value = 1,rate = 0.1;
int year;
for (year = 2;;year++){
value *= (1+rate);
if(value>2)
break;
}
printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}
#include
void main(){
double value = 1,rate = 0.1;
int year;
for (year = 1;value<2;year++)
value *= (1+rate);
printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}
经典的排序问题,排序算法中最经典的就是冒泡法,常用于数组中,下面我们给出冒泡排序的算法
#include
void main(){
int a,b,c,temp;
scanf("%d%d%d",&a,&b,&c);
if (a>b)
{
temp = b;
b = a;
a = temp;
}
if (b>c)
{
temp = c;
c = b;
b = temp;
}
if (a>b)
{
temp = b;
b = a;
a = temp;
}
printf("%d,%d,%d",a,b,c);
}
很显然这也是一个迭代的题目,迭代公式如下
a n + 1 = 2 a n a_{n+1}=2a_n an+1=2an
其中 a 1 = 1 a_1=1 a1=1
同样,很显然这是一个公比为2的等比数列,首项为1,我们接下来给出代码实例
#include
void main(){
long int a=1;
int i;
for(i=1;i<30;i++)
a *= 2;
printf("第三十天的收入为%ld",a);
}
这个问题便是著名的荷花定律
什么是“荷花定律”?
在一个荷花池中,第一天开放的荷花只是很少的一部分,第二天开放的数量是第一天的两倍,之后的每一天,荷花都会以前一天两倍的数量开放…
假设到第30天荷花就开满了整个池塘,那么请问:在第几天池塘中的荷花开了一半?
是第15天吗?错!!
是第29天。
这就是著名的荷花定律,也叫30天定律。
思想决定行动,行动决定人生。
中国有句古话叫“行百里者半九十”,和上面说的“荷花定律”意思很相似:走一百里路程,到九十里的时候才算是走到一半。厚积薄发,共勉。
既然是九九乘法表,使用双重循环,循环变量的范围必是 [ 1 , 9 ] [1,9] [1,9],通过图片可以看到第i行只有i个等式,如果行数用变量i控制,列用变量j控制,则j循环的条件就可以看出j<=i
#include
void main(){
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
printf("%dX%d=%d\t",j,i,j*i);
}
printf("\n");
}
}
到这里,我们就学习到了函数的概念,函数是指封装一定的代码通过调用实现一定功能的代码块,而我们在编译前导入的头文件中实则就是封装了很多函数的头文件,产生随机数的rand()
函数在stdlib.h
中,内置函数可以理解为通过导入头文件就可以使用的函数
#include
#include
void main(){
int temp,randnum;
randnum = rand() % 10 + 1;
printf("生成的随机数在1-10之间,请输入此范围内的一个数,猜猜这个数是多少\n");
while(1){
scanf("%d",&temp);
if(temp == randnum){
printf("猜对了,这个数就是%d,你真是我肚子里的蛔虫呢",randnum);
break;
}
else if (temp<randnum)
printf("你猜的数小了哦\n");
else if(temp>randnum)
printf("你猜的数大了哦\n");
}
}
rand()
函数生成的是至少是一个32767范围的随机数,我们通过取余10来限定随机数生成的范围0-9.然后通过加1来使得区间的左端点变为1,从而使范围变为1-10
这道题目的核心算法就是取数位,前面已经介绍过整除10的方法可以将个位抹掉形成一个新数,我们还可以通过取余10的方式将个位数取出,我们直观的看一代码
#include
void main(){
int i,d1,d2,d3;
for(i=100;i<1000;i++){
d1 = i % 10;
d2 = i / 10 % 10;
d3 = i / 100 % 10;
if (d1+d2+d3 == 9)
printf("%d\t",i);
}
}
遍历所有情况来找出满足条件的结果
3 i + 2 j + 1 k = 50 ( 元 ) 3i+2j+1k=50(元) 3i+2j+1k=50(元)
暴力破解即可
#include
void main(){
int i,j,k;
for(i=0;i<=30;i++){
for(j=0;j<=30;j++){
k = 30-i-j;
if(i*3+j*2+k==50)
printf("男人%d人,女人%d人,小孩%d人\n",i,j,k);
}
}
}
会过头来我们再分析一下这个问题,确定一下各个人数的范围
因为
i + j + k = 30 ( 人 ) i+j+k=30(人) i+j+k=30(人)
因为
3 ( 元 ) ∗ 30 ( 人 ) > 50 ( 元 ) 3(元)*30(人)>50(元) 3(元)∗30(人)>50(元) 2 ( 元 ) ∗ 30 ( 人 ) > 50 ( 元 ) 2(元)*30(人)>50(元) 2(元)∗30(人)>50(元) 1 ( 元 ) ∗ 30 ( 人 ) < 50 ( 元 ) 1(元)*30(人)<50(元) 1(元)∗30(人)<50(元)
男人最多的时候一定是男人+小孩的组合
由此可见男人最多为
10 ⋅ 3 ( 元 ) + 20 ⋅ 1 ( 1 元 ) = 50 ( 元 ) 10\cdot3(元)+20\cdot1(1元) = 50(元) 10⋅3(元)+20⋅1(1元)=50(元)
同理,分析女人和小孩的组合可以得到女人最多的情况,
女人最多为20人
经过分析后的算法可以简化代码的时间复杂度
#include
void main(){
int i,j,k;
for(i=0;i<=10;i++){
for(j=0;j<=20;j++){
k = 30-i-j;
if(i*3+j*2+k==50)
printf("男人%d人,女人%d人,小孩%d人\n",i,j,k);
}
}
}
对照ASCII码表我们可以看到的ASCII码值为1;我们可以使用printf("\1”);
来输出笑脸,接下来就是控制行与列输出的位置,这里我们以5行为例
#include
void main(){
int i,j;
for(i=1;i<=5;i++){
for(j=1;j<=5-i;j++)
printf(" ");
for(j=1;j<=2*i-1;j++)
printf("\1 "); \*printf("");*\
printf("\n");
}
}
codeblocks和vscode好像输出不了转义之后的笑脸;
音符的ASCII代码十六进制是0D可以将\1
替换为\x0D