算法思考
来源:互联网 发布:大学男生鞋子推荐知乎 编辑:程序博客网 时间:2024/06/05 07:33
int i = 0;
for (int n = 2; n < 100 ; n++) {
for (i = 2; i < n; i++) {
if (n % i == 0) {
break;
}
}
if (i >= n) {
printf("%d ", i);
}
}
计算质数的时候蓝线的部分没有考虑到,不知道如何输出该是质数的数字
2. // 最小公约数 最大公倍数 最优解
printf("请输入两个数:");
int m = 0, n = 0 , k = 0, k1 = 0;
scanf("%d %d", &m, &n);
k1 = m * n;
while (1) {
k = m % n;
if (k == 0) {
k = n;
break;
}
m = n;
n = k;
}
printf("最小公约数:%d 最大公倍数 :%d\n", k, k1 / k);
//辗转相除法求最小公约数和最大公倍数
3. //如下方法求三个数的中间数方法较好
printf("中间值为%d\n", k1);
} else if((k2 - k1) * (k2 - k3) <= 0) {
printf("中间值为%d\n", k2);
} else {
printf("中间值为%d\n", k3);
}
4.//第二种方法计算星座 注意他们直接的关系 达到可以思考转化
//把月和日换成整数 4.20-5.20 换成420-520
int year = 0, month = 0, day = 0;
printf("请输入您的生日,年月日按空格隔开\n");
scanf("%d %d %d", &year, &month, &day);
int temp = month * 100 + day;
if (temp >= 321 && temp <= 419) {
printf("您的星座是白羊座\n");
} else if (temp >= 420 && temp <= 520){
printf("您的星座是金牛座\n");
} else if (temp >= 521 && temp <= 621) {
printf("您的星座是双子座\n");
} else if (temp >= 622 && temp <= 722) {
printf("您的星座是巨蟹座\n");
} else if (temp >= 723 && temp <= 822) {
printf("您的星座是狮子座\n");
} else if (temp >= 823 && temp <= 922) {
printf("您的星座是处女座\n");
} else if (temp >= 923 && temp <= 1023) {
printf("您的星座是天秤座\n");
} else if (temp >= 1024 && temp <= 1122) {
printf("您的星座是天蝎座\n");
} else if (temp >= 1123 && temp <= 1221) {
printf("您的星座是射手座\n");
} else if (temp >= 120 && temp <= 218) {
printf("您的星座是水瓶座\n");
} else if (temp >= 219 && temp <= 320) {
printf("您的星座是双鱼座\n");
} else {
printf("您的星座是魔蝎座\n");
}
5. int a[] = {3, -9, 32, 77, 64, -24, 14, 0, 21, 45};
int size = sizeof(a) / sizeof(a[0]);
// 冒泡排序法
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < size; i++) {
printf(" %d ", a[i]);
}
冒泡排序如果数组原来就有顺序这样在进行排序的话就仍会执行那些趟数比较那些次数这样的话就会浪费程序的执行效率
可以做如下改进的话,这样的话效率会大大的提高(算法的思想基于如果不进行交换的话 ,说明已经是有序的了,所以需要有个标记来记录是否进行了排序)
BOOL flag = YES;//发生过交换
for (int i = 0; i < 5 - 1 && flag; i++) {
flag = NO;// 假定没有发生过交换
for (int j = 0; j < 5 -1 -i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = YES;//发生了交换
}
}
printf("aaaa\n");
}
// 选择排序法
int k = 0;for (int i = 0; i < size; i++) {
k = i;
for (int j = i + 1; j< size; j++) {
if (a[k] > a[j]) {
k = j;
}
}
if (k != i) {
int temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
printf("\n选择排序法如下:\n");
for (int i = 0; i < size; i++) {
printf(" %d ", a[i]);
}
printf("\n");
6. //判断天数
int year = 0, month = 0, day = 0;
int days = 0;
printf("请输入日期\n");
scanf("%d%d%d", &year, &month, &day);
switch (month - 1) {
case 12:
days += 31;
case 11:
days += 30;
case 10:
days += 31;
case 9:
days += 30;
case 8:
days += 31;
case 7:
days += 31;
case 6:
days += 30;
case 5:
days += 31;
case 4:
days += 30;
case 3:
days += 31;
case 2:
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
days += 29;
} else {
days += 28;
}
case 1:
days += 31;
case 0:
days += day;
printf("您输入的是该年的第%d天\n", days);
break;
default:
printf("您的输入有误\n");
break;
}
这个可以直接用一个数组更简单一些如下做法
int Days(int year, int month, int day){
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, count = 0;
if (year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0)) {
days[1] = 29;
}
for (int i = 0; i < month - 1; i++) {
count += days[i];
}
return count + day;
}
7.
#if !defined(MAX)
#define __NSMAX_IMPL__(A,B,L) ({ __typeof__(A) __NSX_PASTE__(__a,L) = (A); __typeof__(B) __NSX_PASTE__(__b,L) = (B); (__NSX_PASTE__(__a,L) < __NSX_PASTE__(__b,L)) ? __NSX_PASTE__(__b,L) : __NSX_PASTE__(__a,L); })
#define MAX(A,B) __NSMAX_IMPL__(A,B,__COUNTER__)
#endif
#define __NSX_PASTE__(A,B) A##B
__COUNTER__是一个计数器,开始的时候是1,以后的时候每次执行一次加1,这样就不会重名了({ __typeof__(A) __NSX_PASTE__(__a,L) = (A);就是把A给了__a##(__COUNTER__)这个累加器是随着调用的时候而改变,所以这个时候所有的用户名是不同的这种使用累加器然后使变量名都不同的方法值得借鉴还有这种使AB结合的方式也值得借鉴
8.一直觉得这种函数回调特别的好,分工好,而且用户方便
BOOL isScore(Student *p1, Student *p2);
BOOL isScore(Student *p1, Student *p2){
return p1->score < p2->score;//关系运算符返回的是BOOL类型
}
BOOL isAge(Student *p1, Student *p2);
BOOL isAge(Student *p1, Student *p2){
return p1->age < p2->age;
}
BOOL isName(Student *p1, Student *p2);
BOOL isName(Student *p1, Student *p2){
return strcmp(p1->name, p2->name) > 0;
}
typedef BOOL(*SortType) (Student *, Student *);
SortType istype(char *string);//返回型为函数指针的函数,判断该返回哪个函数的指针
SortType istype(char *string){
if (strcmp(string, "name") == 0) {
return isName;
} else if(strcmp(string, "score") == 0 ){
return isScore;
} else if(strcmp(string, "age") == 0){
return isAge;
} else {
return isName;
}
}
void sort(Student * p, int n, char *string);
void sort(Student * p, int n, char *string){
SortType funp = istype(string);//根据传递过来的string判断该使用哪个函数,接收到的是一个函数指针,指向该调用的函数
BOOL flag = YES;
for (int i = 0; i < n - 1 && flag; i++) {
flag = NO;
for (int j = 0; j < n - 1 - i; j++) {
if (funp(p +j, p + j + 1)) {
Student temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
flag = YES;
}
}
}
}
struct student {
char name[20];
float score;
int age;
};
typedef struct student Student;
Student stu[5] = {
{"liyang", 89, 18},
{"limei", 56, 23},
{"yiyi", 45, 67},
{"aiming", 98, 17},
{"liuyi", 94, 19}
};
sort(stu, 5, "name");
- 算法思考
- 算法思考
- 关于算法,怎样思考
- 关于算法的思考
- 算法的哲学思考
- 核心算法思考
- 算法思考---------三色旗
- 算法思考---------八皇后
- 算法思考--------生命游戏
- 贪心算法的思考
- 思考-贪心算法
- KMP算法的思考
- kruskal算法个人思考
- java算法思考--二分法
- KMP算法思考
- 算法世界的哲学思考
- 关于项目算法的思考
- 分类算法的一点思考
- Android客户端添加代理访问网络
- 【深入浅出IOS开发】重写按钮控件2
- HDU 1540 Tunnel Warfare(线段树单点更新+区间合并)
- 用txt写HelloWorld
- Linux判断文件描述符是否有效
- 算法思考
- android设置默认程序&清除默认设置
- 個人電腦(基礎知識)
- Day18-下拉列表控件
- ubuntu开启sshd服务
- 配置虚拟目录 与配置虚拟主机
- 第37题 Longest Common Prefix
- 成员函数指针的应用 之 仿写OC里面UIButton的回调机制(一)
- 学习笔记-JS公开课二