谭浩强-C语言-第二章

#include<stdio.h>
#include<math.h>


int main()
{
// 第2章 算法


    // 2.1. 书p17: 求1*2*3*4*5
    //int bc, c;
    //int ji;
    //for (bc = 1; bc < 5; bc++)
    //    c = bc + 1;
    //    ji = c * bc;
    //printf("%d", ji);

    // 上面的错了,按照书上的提示改成如下:
    //int bc = 1;
    //int c = 2;
    //for (c=2; c < 6; c++)
    //{
    //    bc = bc * c;
    //}
    //printf("1*2*3*4*5=%d", bc);
    
    // 2.2. 衍生题: 1*3*5*7*9*11
    //int bc = 1;
    //int c = 3;
    ////for (c = 3; c < 13; c+=2) //c+=2 等于 c=c+2
    //for (c = 3; c <=11; c += 2) //或者
    //{
    //    bc = bc * c;
    //}
    //printf("%d", bc);
    //    //!! 成功啦,开森

    // 2.3. 判定2000-2500年中的每一年是否为闰年,并输出结果
    // //我的原版:
    //int r;
    ////int syear;
    ////int eyear;
    //int syear = 2000;
    //int eyear = 2500;
    //printf("请输入始末年份:");
    ////scanf_s("%d %d", &syear, &eyear);
    //printf("在%d年到%d年之间的闰年有:\n", syear, eyear);
    //for (r = syear; r <= eyear; )
    //{
    //    r++;
    //    if (r % 4 == 0)
    //    {
    //        printf("%12d", r);
    //    }
    //}

    // 书上的版本:输出某段时间内的闰年
    //int year = 1500;
    //int i = 1;
    //for (year; year <= 2000; year++)
    //{                             // 👇指能不等于
    //    if (year % 4 == 0 && year % 100 != 0) // 这一行,写了十次
    //                                          // 意思是,倘使year的值同时满足这两个条件:①与4整除;②与100不整除
    //        printf("%d 是闰年,", year);      
    //    if (year % 400 == 0)                  // 此时剩下来的,是不与4整除的数,或者是与4整除但是与100整除的数,如2100。对于其中第二种情况,倘使是与400整除的数,也是闰年
    //        printf("%d 是闰年,", year);      // 这两个if是平行的,那么第二个if是承接上一个if剩下来的值,还是说不是这样?
    //    else
    //        printf("%d 不是闰年,", year);    // else对象是经过两个if过滤后的?
    //}

    // 魔改版1(暂时未能实现):制定列数
    //int r;
    ////int syear;
    ////int eyear;
    //int syear=2000;
    //int eyear=2100;
    //int row = 4;
    //int i;
    //printf("请输入始末年份:");
    ////scanf_s("%d %d", &syear, &eyear);
    //printf("在%d年到%d年之间的闰年有:\n", syear, eyear);
    //for (r = syear; r <= eyear; )
    //{
    //    r++;
    //    if (r % 4 == 0)
    //    {
    //        
    //        for (i = 1; i <= 1; i++)
    //        {
    //            if (i % row == 0)
    //                printf("\n");
    //        }
    //        printf("%12d", r);
    //    }
    //}

    // 魔改版2(暂时未能实现):加计算总个数
    //int r;
    //int syear;
    //int eyear;
    //printf("请输入始末年份:");
    //scanf_s("%d %d",&syear,&eyear);
    //for (r = syear; r <= eyear; )
    //{
    //    r++;
    //    if (r % 4 == 0)
    //        printf("%12d", r);
    //}
    ////为什么sizeof(r)的结果一直是4????为什么不会变??
    //int n1;
    //n1 = sizeof(r);
    //printf("在%d年到%d年之间的闰年有%d个:\n", syear, eyear,n1);

    //2.4.累加和 
        // 这题我完全没有思路
    //int sign = 1;
    //int sum = 1;
    //int deno = 2;
    //int sign = (-1) * sign;
    //int term = sign * (1 / deno);
    //for (deno; deno <= 100;)
    //{
    //    
    //    deno = deno + 1;
    //    sum = sum + 1;
    //}
    //printf("%d", sum);


    // 2.5 给出一个>=3的正整数,判断它是不是一个素数
        // 素数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,如2,3,5,7,11,13,17,19,23,29
        //int a = 0;  // 素数的个数       // 这是啥? 什么叫素数的个数,是当前值所包含的素数?确定不是因数
        //int num ;  // 输入的整数     // 按照素数的定义,num的值限定在自然数集
        //printf("输入一个整数:");
        //scanf_s("%d", &num);
        //for (int i = 2; i < num; i++) { //
        //    if (num % i == 0) {
        //        a++;  // 素数个数加1    // ??这是什么意思
        //    }
        //}
        //if (a == 0) {
        //    printf("%d是素数。\n", num);
        //}
        //else {
        //    printf("%d不是素数,他有%d个因数。\n", num, a);
        //}
        /*
        让我想想这一段,从后往前看,
        是不是素数取决于a的值,a的值取决于if是否为是;
        if是否为是,取决于输入的num和起始值为2,逐次递增1的i
            ①可以肯定的是,num如果是偶数,那么num这个数就不可能是 素数了,因为if一旦成立,a会自加1;
            ②如果num是奇数,那么肯定的是,for的第一次循环,对if来说,必然是 否 ,但是if否了以后不代
            表整个循环结束了,显然,这次a不会自加1,但是i会,i是for循环里的,只要条件i<num满足,就会
            i就会一直加,一直循环验证 判断if,直到不再满足条件;
            ③那么其实这个for循环是为了让i替代num以内的所有数,if判断i是否是num的因数;
            ④至于i为什么从2开始,因为素数的定义是“除了1和她本身以外,不再有其他因数的自然数”,这
            两个条件体现在 int i=2(除了1) 和 i<num (不包含它本身,所以这里没有等于),这就限定了i
            的范围在[2,num-1]这个区间内;
        */
        // 30:2,15,5,6,10,3
        // 80:2,40;4,20;5,16;8,10;

        // 2.5-自习-判断素数
        //int a = 0;
        //int num;
        //printf("please input a number: ");
        //scanf_s("%d", &num);
        //for (int i = 2; i < num; i++) // 这一个循环和判断用来验证num是否
        //    if (num % i == 0)
        //        a++;
        //if (a == 0)
        //    printf("%d是素数", num);
        //else 
        //    printf("%d不是素数", num);

        // 2.5-p30版本
        //int n;
        //int w = 0;
        //int i = 2;
        //scanf_s("%d", &n);
        //for (; i < n; i++) //倘使n是素数,那么其中必有一个因数是小于或等于根号n的,
        //      // 根号n以内,n的因数(根号n~n之间的数都没有)
        //{
        //    if (n % i == 0)
        //    {
        //        printf("因数有%d\n", i);
        //        w = 1;
        //    }
        //}
        //if (w == 0)
        //    printf("是素数");
        //else
        //    printf("不是素数");
        
        // 练习册
    //    1.输出最大数
    //int a[10];
    //int max;
    ////int i;
    //printf("请输入10个数字: ");
    //for (int i = 0; i < 10; i++)
    //{
    //    scanf_s("%d", &a[i]);
    //}
    //for (int j = 0; j < 10-1; j++)
    //{
    //    max = a[j];
    //    if (a[j] < a[j + 1])
    //    {
    //        int t=0;
    //        a[j] = t; a[j] = a[j + 1]; a[j + 1] = t;
    //    }
    //    printf("%d,", a[j]);
    //}    

    //    1-1.起泡排序
    //int a[10];
    //int max, i,j,t;
    ////int i;
    //printf("请输入10个数字: ");
    //for (i = 0; i < 10; i++)
    //{
    //    scanf_s("%d", &a[i]);
    //}
    //for (j = 0; j < 10 - 1; j++)
    //{
    //    for (i = 0; i < 9; i++)
    //        if (a[i] > a[i + 1])
    //        {
    //            t=a[i]; a[i] = a[i + 1]; a[i + 1] = t;
    //            printf("a[%d],%d; ",i,a[i-1]);
    //        }
    //}
    //printf("\n");
    //printf("排序后的数列: ");
    //for (i = 0; i < 10; i++)
    //    printf("%d,", a[i]);
    //printf("\n");
    
    //    1-2.最大数
    //int a[10];
    //int max, i, j, t;
    ////int i;
    //printf("请输入10个数字: ");
    //for (i = 0; i < 10; i++)
    //{
    //    scanf_s("%d", &a[i]);
    //}
    //for (j = 0; j < 10 - 1; j++)
    //{
    //    for (i = 0; i < 9; i++)
    //        if (a[i] > a[i + 1])
    //        {
    //            t = a[i]; a[i] = a[i + 1]; a[i + 1] = t;
    //            //printf("a[%d],%d; ", i, a[i - 1]);
    //        }
    //}
    //printf("\n");
    //printf("最大值: ");
    ////for (i = 0; i < 10; i++)
    //    printf("%d ", a[9]);
    //printf("\n");

    // 2.求3个数的升序排序
//    int a, b, c,t;
//    scanf_s("%d %d %d", &a, &b, &c);
//
//    if (a > b)
//    {
//        t = a; a = b; b = t;
//    }
//    if (a > c)
//    {
//        t = a; a = c; c = t;
//    }
//    if ( b > c)
        //t = b; b = c; c = t;
//    printf("%d %d %d", a, b, c);

    // 3.求100(包括)以内和
    // 
    //int n = 1;
    //int sum = 0;
    //for (n; n <= 100; n++)
    //{
    //    sum = sum + n;
    //}
    //printf("%d", sum);
 
    // 4.判断一个数n能否同时被3和5整除
    //int n;
    //scanf_s("%d",&n);
    //if (n % 3 == 0 && n % 5 == 0) {
    //    printf("%d可以被3和5整除", n);
    //}
    //else {
    //    printf("不可以哦。");
    //}

    // 5. 将100-200的素数输出
    //int num, j,i, a=0;
    //for (j = 2; j <= 200; j++)
    //    for (num = 100; num <= 200; num++)
    //
    //        if (num % j == 0)
    //            a++;
    //    if (a == 0)
    //        printf("不是素数");
    //    else
    //        printf("是素数");


    //int n = 100, i = 2;
    //for (i; i < 14; i++) 
    //
    //{
    //    for (n; n < 200; n++)
    //    {
    //        if (n % i == 0)
    //        {
    //        
    //            printf("%d,", n);
    //        }
    //    }
    //}
    //if (i < n)
    //    printf("%d", n);

    // 6. 求两个数n和m的最大公约数
    //int n, m;
    ////scanf_s("%d %d", &n, &m);
    //n = 2000;
    //m = 5000;
    //int sm = n;
    //if (n > m)
    //    sm = m;
    //printf("%d和%d的公约数:", n, m);
    //for (int i=1; i < sm; i++)
    //    if (n % i == 0 && m % i == 0)
    //        printf("%d,",i);
    
    // 7.求方程式ax^2+bx+c=0的根,分别考虑①有两个不相等的实根;②有两个相等的实根
     // ①有两个不相等的实根; 即x1≠x2
     // ②有两个相等的实根; 
    //int a, b, c;
    //a = 3;
    //b = -6;
    //c = 3;
    //int delta = b * b - 4 * a * c;
    //int p = -b / 2 * a;
    //int q = sqrt(delta) / 2 * a;
    //if (delta > 0)
    //{
    //    printf("x1=%d\n", p + q);
    //    printf("x2=%d\n", p - q);
    //}
    //else
    ////if (delta = 0)
    //    printf("x1=x2=%d\n", p - q / p + q);
      
    // 8.没法运行的版本-依次输入10个数,输出其中最大的值
    //int a[5];
    //int i;
    //int max;
    //printf("请输入3个数: ");
    //
    //for (i = 0; i <5; i++) {
    //    scanf_s("%d", &a[i]);
    //    printf("%d,", a[i]);
    //}
    //printf("\n");
    //int j;
    //for (j = 0; j < 5-1; j++) {
    //    max = a[j];
    //    
    //    if (a[j] < a[j + 1])
    //        max = a[j + 1];
    //}
    //printf("max=%d", max);

    // 8-1.正确版本:依次输入10个数,输出其中最大的值
        //练习册的答案
    //int n = 1;
    //int max;
    //int a;
    //scanf_s("%d", &max);
    ////while (n < 10) {   // while 和 for 的替换
    //for (n;n<10;){
    //    scanf_s("%d", &a);
    //    if (a > max) {  // 啊哦,似乎根本用不上数组下标
    //        max = a;
    //    }
    //    n++;
    //}
    //printf("%d\n", max);

    // 9.有3个数a\b\c,按大到小顺序输出
    //int a, b, c;
    //printf("请输入三个数字:");
    //scanf_s("%d %d %d", &a, &b, &c);
    //if (a < b) { // 若a<b,那么b和a互换,把大的数值转移到a
    //    int t = a;
    //    a = b;
    //    b = t;
    //}
    //if (a > c) { // 由于此时的a是前两个数中的最大值,接下来的事情就是比较a和c,如果a>c,那么输出abc即可
    //    if (c > b) { // 但是如果c>b,那么c是最大值,
    //        printf("%d %d %d", a, c, b);
    //    }
    //    printf("排序后: %d %d %d", a,b,c);
    //}    
    //else
    //    printf("排序后:%d,%d,%d",c, a, b);

    // 9-1.初始残缺版-衍生题:有5个数,按大到小顺序输出
    //int a[5];
    //printf("请输入五个数字:");
    //for (int i = 0; i < 5; i++) {
    //    scanf_s("%d", &a[i]);
    //}
    //for (int j = 0; j < 4; j++) {
    //    printf("1、a[j]=%d;a[j+1]=%d;\n", a[j], a[j + 1]);
    //    if (a[j] < a[j + 1]) {
    //        int t = a[j];
    //        a[j] = a[j + 1];
    //        a[j + 1] = t;
    //    }
    //    printf("2、a[j]=%d;a[j+1]=%d;\n", a[j], a[j + 1]);    
    //}
    //for (int i = 0; i < 5; i++)
    //    printf("%d," ,a[i]);

    // 9-2.修改版:
    //int a[5];
    //printf("请输入五个数字:");
    //for (int i = 0; i < 5; i++) {
    //    scanf_s("%d", &a[i]);
    //}
    //for (int i = 0; i < 5; i++) {
    //    for (int j = 0; j < 4; j++) {
    //        if (a[j] < a[j + 1]) {
    //            int t = a[j];
    //            a[j] = a[j + 1];
    //            a[j + 1] = t;
    //            printf("a[j]=%d;a[j+1]=%d;\n", a[j], a[j + 1]);
    //        }
    //    }
    //}
    //for (int i = 0; i < 5; i++)
    //    printf("%d,", a[i]);

    // 10.

   //书p32的两题
    // 求多项式 1-1/2+1/3-1/4+1/5-...+1/99-1/100 的值 
    //int sign = 1;
    //double deno = 2.0, sum = 1.0, term;
    //while (deno <= 100)
    //{
    //    sign = -sign;    // 从这里开始没看懂
    //    term = sign / deno;
    //    sum = sum + term;
    //    deno = deno + 1;
    //}
    //printf("%f\n", sum);

    // 求16以内的阶乘(包括16)
    //int i;
    //int sum=1;        // sum为什么从1开始?
    //int num;
    //scanf_s("%d", &num);
    //for (i = 1; i <= num; i++) // i为什么从1开始?
    //{
    //    printf("%d*%d=%d\n",i,sum, i * sum);
    //    sum = sum * i; // 相当于(i-1的阶乘*i)
    //    printf("i=%d,sum=%d\n", i, sum);
    //    
    //}
    //printf("sum=%d", sum);

    //

    return 0;
}

 

posted @ 2021-08-19 17:00  tbbb1  阅读(60)  评论(0)    收藏  举报