目录
下一篇:c语言运算符
if语句重写时间差程序
int hour1,minute1;
int hour2,minute2;
scanf_s("%d %d",&hour1,&minute1);
scanf_s("%d %d",&hour2,&minute2);
int ih=hour2-hour1;
int im=minute2-minute1;
if (im<0){
im+=60;
ih--;
}
printf("时间差是%d小时%d分钟",ih,im);
判断条件的优先级:所有的关系运算符优先级比算术运算的低,但是比赋值运算高
判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右的
例如:6>5>4的结果是0,从左往右6>5返回1而1<4
if语句的注意:如果if语句后面有分号则相当于
if(exp)
;
{}
相当于if语句后面有一句什么都不做的语句
{}内相当于普通的语句
注意c语言中的if判断语句可以由单=构成,例如if(a=60),就永远是true,除非填入赋值语句a=0是false,不然都是true
switch-case
type必须是整数型int
常量可以是常数,也可以是常数计算的表达式,可以使用const int
如果没有break就会穿透
单一出口原则
例如:多个if语句都有一句相似的printf语句就不符合单一出口原则,应该在最后用一个printf语句输出
while循环数位数
int x;
int n=0;
scanf_s("%d",&x);
n++;//用于排除0
x /=10;
while (x!=0){
n++;
x /=10;
}
printf("%d\n",n);
return 0;
调试还可以用printf调试法
数字逆序
int x;
scanf_s("%d",&x);
int digit;
int ret=0;
while (x>0){
digit=x%10;//取出低位
printf("%d",digit);//700输入007
ret=ret*10+digit;//将之前取出来的数*10在加上刚取出来的数
// printf("ret=%d\n",ret);
x/=10;
}
printf("\n");//换行
printf("%d\n",ret);//700输入7
return 0;
do while
在进入循环的时候不做检查,而是在执行完一轮循环体的代码后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环
do
{
<循环体语句>
}while(<循环条件>);
与while的区别在于在循环体结束的时候才来判断条件,也就是说无论如何,循环都会执行至少一遍,再来判断条件
do while重写数位数
int x;
int n=0;
scanf_s("%d",&x);
do {
x /=10;
n++;
}while (x>0);
printf("%d",n);
return 0;
for循环
阶乘程序
int n;
scanf("%d",&n);
int fact=1;
for (int i = 2; i <= n; ++i) {//在for里面初始化i,是c99标准,有的编译器需要加上c99选项
fact*=i;
}
printf("%d",fact);
优化
for (; n >1 ; n--) {
fact *=n;
}
小套路:求和程序的结果变量初始化应为0,求积程序应为1
tips for loop
如果有固定次数,用for
如果必须执行一次,用do_while
其他情况用while
素数判断
int n;
scanf("%d",&n);
int i=2;
for (i = 2; i < n; i++) {
if (n%i==0){
break;
}
}
if (n==i){//走完for循环i一定=n
printf("这是素数");
} else{
printf("这不是素数");
}
接力break,设置一个flag变量判断是否break
或者goto
数硬币程序
int x;
int one,two,five;
scanf("%d",&x);
for (one=0; one<x*10 ; one++) {
for (two = 0; two<x*10/2 ; two++) {
for (five = 0; five < x*10/5; five++) {
if (one+two*2+five*5==x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
goto out;
}
}
}
}
out:return 0;
计算收敛函数
int n;
int i;
double sum=0.0;
double sign=1.0;
scanf("%d",&n);
for ( i = 1; i <= n; ++i) {
sum+=sign/i;
sign=-sign;//翻转正负
}
printf("f(%d)=%lf",n,sum);
return 0;
循环的练习
整数分解
int x;
//scanf("%d",&x);
x=13425;
int t=0;
do{
int d=x%10;
t=t*10+d;
x/=10;
}while (x>0);
//再翻转一遍还原但是每位数已被分开
printf("t=%d\n",t);
x=t;
do{
int d=x%10;//取出最后一位
printf("%d",d);
if (x>=10){
printf(" ");//最后一个数字不输出空格
}
x/=10;//消除最后一位
}while (x>0);
printf("\n");
return 0;
优化:基本思想,使用除以相同n位数的10^n得到最高位
int x;
//scanf("%d",&x);
x=70000;
int t=x;//用来代替x进行第一轮循环,避免消耗x
int mask=1;
//判断x的位数
while(t>9){
t/=10;
mask*=10;
}
do{
int d=x/mask;//得出最高位
printf("%d",d);
if (mask>9){//与下边条件不能是x>0同理
printf(" ");
}
x%=mask;//去除最高位
mask/=10;
}while (mask>0);//这里如果是x>0的话,输入一个能整除的数循环就停止了
秋水仙数
int n;
scanf("%d",&n);
n=3;
int first=1;
int i=1;
while (i<n){
first*=10;
i++;
}
i=first;
while (i<first*10)
{
int t=i;
int sum=0;
do {
int d=t%10;
t/=10;
int p=d;
int j=1;
while (j<n){
p*=d;
j++;
}
sum+=p;
}while (t>0);
if (sum==i)
printf("%d\n",i);
i++;
}
最大公约数的几种求法
//基本思想,依次将取数从2到a和b之间较小的那个数,并用a和b除以这个数,记录下那个公约数
int a,b;
int min;
scanf("%d %d",&a,&b);
if (a<b)min=a;else min=b;
int ret=0;//接收最大公约数
for (int i=1; i <= min; ++i) {
if (a%i==0&&b%i==0)
ret=i;
}
printf("%d和%d的最大公约数是%d.\n",a,b,ret);
辗转相除法(欧几里得算法)
int a,b,t;
scanf("%d %d",&a,&b);
while (b!=0){
t=b;//暂存
b=a%b;
a=t;
printf("a=%d",a);
printf("b=%d",b);
printf("\n");
}
printf("最大公约数是%d\n",a);
return 0;