C语言算法题目练习记录
一、交换两个int变量的值,不能使用第三个变量。
即a=3,b=5,交换后a=5,b=3;
- 第一种:加减的方式
#include <stdio.h>
int main(){
int a = 3;
int b = 5;
printf("交换前:a=%d,b=%d\n", a, b);
a = a + b;//a=两个数的和 b不变
b = a - b;//b=两个数和-原来b=原来a
a = a - b;//a=两个数和-b(原来a)=原来b
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
就算法而言,缺点是:会发生溢出。
因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.
如果a取到非常大的数,b也取了非常大的数相加的和(超出int最大值)再减去原来a得到的值一定不是原来的b。
- 第二种:按位异或
#define <stdio.h>
int main(){
int a = 3;
int b = 5;
printf("交换前:a=%d,b=%d\n", a, b);
a = a^b;//110
b = a^b;//011
a = a^b;//101
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
按位(二进制位)异或,其操作符为^,形式为
a^b。当a,b的对应位上值相同时为0,否则值为1。
3的二进制位是011
5的二进制位是101
按位异或结果: 110
优点:不会溢出。
缺点: 可读性差,执行效率低。
Tip:交换2个整型变量更多采用第三个变量的方法,代码的可读性高,执行效率高。
二、找出只出现一次的数
题面:给定一个非空整型数组,除了某个元素只出现一次外,其余每个元素均出现两次,找出只出现一次的元素。
样例:int a[]={1,2,3,4,5,1,2,3,4} 找出5
- 第一种:统计每个数出现的次数(暴力解法)
#define <stdio.h>
int main(){
int i = 0;
int arr[] = { 1, 2, 3, 4, 5, 1, 2, 3, 4 };
int len = sizeof(arr) / sizeof(arr[0]);
//数组占存总空间除以单个元素占存空间大小,等于元素个数
for (i = 0; i<len; i++){
//统计arr[i]在数组中出现了几次
int count = 0;//计数器
int j = 0;
for (j = 0; j<len; j++){
if (arr[j] == arr[i]){
count++;
}
}
if (count == 1){
printf("只出现一次的数为:%d\n",arr[i]);
break;
}
}
return 0;
}
缺点:时间复杂度高
- 第二种:按位异或
#define <stdio.h>
int main(){
int arr[] = { 1, 2, 3, 4, 5, 1, 2, 3, 4 };
int i = 0;
int ret = 0;
int len = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i<len; i++)
{
ret = ret^arr[i];
}
printf("只出现一次的数为:%d\n", ret);
return 0;
}
三、写一个关机程序
程序运行,你的电脑将在1分钟后关机,如果输入:我是猪,就取消关机。
在cmd中输入
shutdown -s -t 60 (电脑将在60s后自动关机)
shutdown -a(取消关机)
#include <stdlib.h>//system所在头文件
#include <string.h>//strcmp所在头文件
#include <stdio.h>
int main(){
char input[30] = { 0 };//存储数据
system("shutdown -s -t 60");//关机
//system()-专门用来执行系统命令
again:
printf("请注意,地球人,你的电脑将在一分钟后关机,如果输入:我是一头猪,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我是一头猪") == 0){
//strcmp-string compare用于对两个字符串进行比较
system("shutdown -a");
}
else{
goto again;
}
return 0;
}
这个程序可以用来整蛊朋友
四、求三角形面积
要求:输入三角形边长,求三角形面积(用到海伦公式)
已知三角形三边长 a,b,c则该三角形面积公式为:area=根号下s(s-a)(s-b)(s-c)
其中s=(a+b+c)/2
#include<stdio.h>
#include<math.h>
int main(){
float a, b, c, s,area;
printf("请输入三角形的三条边:\n");
scanf("%f %f %f", &a, &b, &c);
s = (a + b + c) / 2.0;
//三角形成立条件是三条边中最小的两条边的长度相加的和大于第三条边
if (a + b > c&&b + c > a&&a + c > b){
//a && b,一假必假
area = sqrt(s*(s - a)*(s - b)*(s - c));
//%g用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的0。即%g是根据结果自动选择科学记数法还是一般的小数记数法
printf("a=%g,b=%g,c=%g,s=%g\n", a, b, c, s);
printf("area=%.2f\n", area);
}
else{
printf("不能构成三角形");
}
}
return 0;