算法思考

来源:互联网 发布:大学男生鞋子推荐知乎 编辑:程序博客网 时间:2024/06/05 07:33
 1. //打印 1 - 100的质数
    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. //如下方法求三个数的中间数方法较好

    if ((k1 - k2) * (k1 - k3) <= 0) {
        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");



0 0
原创粉丝点击