zoukankan      html  css  js  c++  java
  • 第十周编程总结

    7-1 求奇数和 (15 分)

    本题要求计算给定的一系列正整数中奇数的和。

    1)实验代码

    #include<stdio.h>
    int main()
    {
      int n,sum=0;
      scanf("%d",&n);
      while(n>0)
      {
        if(n%2!=0) {
        sum+=n;
        }
        if(n%2==0) {
          sum=sum;
        }
     scanf("%d",&n);
      }
      printf("%d",sum);
      return 0;
    }

    2)设计思路

    1.定义变量,sum赋初始值0

    2.使用while循环,条件n>0,先输入一位数字,判断是否大于0,如果是就继续执行,再判断n是否为奇数,为奇数累加,为偶数不变,再输入下一位数字继续循环;否则就跳出循环

    3.输出

    3)本题调试过程碰到问题及解决办法

    无问题

    4)运行结果截图

    7-2 求整数的位数及各位数字之和 (15 分)

    对于给定的正整数N,求它的位数及其各位数字之和。

    1)实验代码

    #include<stdio.h>
    int main()
    {
      int n,b,s=0,count=0;
      scanf("%d",&n);
      while(n>0)
      {
        b=n%10;
        s+=b;
        n=n/10;
        count++;
      }
      printf("%d %d",count,s);
      return 0;
    }

    2)设计思路

    1.定义变量,输入n,b代表余数,s代表余数累加,count记录位数

    2.当n>0,首先(1)求n除以10求余数,累加,然后(2)n除以10,位数累加,不断循环,直到n<0就跳出循环(注意:必须先(1)后(2),二者顺序不能颠倒)

    3.输出位数和各位数字之和

    3)本题调试过程碰到问题及解决办法

    把(1)和(2)的顺序颠倒了,最后通过调试找到错误并解决

    4)运行结果截图

    7-3 韩信点兵 (10 分)

    在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

    • 按从1至5报数,记下最末一个士兵报的数为1;
    • 再按从1至6报数,记下最末一个士兵报的数为5;
    • 再按从1至7报数,记下最末一个士兵报的数为4;
    • 最后按从1至11报数,最末一个士兵报的数为10;

    请编写程序计算韩信至少有多少兵。

    1)实验代码

    #include <stdio.h> 
    int main()
    {
        int i=0;
        while(1)
        {
            if(i%5==1&&i%6==5&&i%7==4&&i%11==10)
            {
                break;
            }
            i++;
        }
        printf("%d",i);
        return 0;
    }

    2)设计思路

    1.定义变量i赋初值为0

    2.用while无限循环,如果i满足四个条件就输出(i%5==1&&i%6==5&&i%7==4&&i%11==10),否则i++,继续循环

    3.输出

    3)本题调试过程碰到问题及解决办法

    刚开始做的时候题目都没读懂,无从下手,后来才知道这是一个数学题,数学很重要啊

    4)运行结果截图

     

    7-4 整除光棍 (20 分)

    这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

    提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

    1)实验代码

    思路1:

    #include <stdio.h>
    int main()
    {
     int x = 0, s = 0, n = 0;
     scanf("%d", &x);
     while (s < x)

     {
      s = s * 10 + 1;
      n++;
     }
     while (1)
     {
      printf("%d", s / x);
      s %= x;
      if (s == 0) break;

      s = s * 10 + 1;

      n++;
     }
     printf(" %d ", n);
     return 0;
    }

    2)设计思路

    1.定义输入的数x(除数),被除数s,位数n

    2.当s<x时,s = s * 10 + 1,位数+1,循环

    3.当s>=x时,跳出第一个循环;在第二个循环中,输出s/x(输出商, 从最高位一直输出到个位,最后一定能被整除),s更新为余数(s%x),当余数为0时,表示x被除尽,跳出循环,输出n;否则s = s * 10 + 1;位数+1;

    4.返回主函数

    3)本题调试过程碰到问题及解决办法

    1.刚开始题目都没读懂,后来百度+问大佬,弄清楚了思路

    2.要注意输出过程中中间的s中可能为0,不要把这个漏掉了

    4)运行结果截图

    思路2:

    #include<stdio.h>
    int main()
    {
      int x,s=0,n=0,flag=0;       /*定义 输入的正奇数,表示x乘以s是一个光棍,光棍的位数,变量标记*/
      scanf("%d",&x);
      while(1)                 /*无限循环*/
      {
        s=s*10+1;            
        n++;                   /*光棍位数累加*/
        if(s>=x)               /*s从1开始,循环递增*/
         {
           flag=1;
           printf("%d",s/x);    /*输出每一次的s/x(取整)*/
         }
        else if(flag==1)          
          printf("0");         /*当s<x时,补0*/
          s=s%x;
        if(s==0) break;        /*余数为0时,跳出循环*/
      }
      printf(" %d",n);
      return 0;
    }

  • 相关阅读:
    【tarjan】【树的直径】【CF】K. Königsberg Bridges
    【组合数学】【恒等式】简单和、交错和
    【组合数学】【恒等式】$sum_{k=0}^{r}C_m^k imes C_{n}^{r-k}=C_{m+n}^r$
    【组合数学】【恒等式】$C_{n}^{r} imes C_{n-r}^{k-r}=C_{n}^{k} imes C_k^{r}$
    【树形DP】D. Serval and Rooted Tree
    【图论】图的欧拉定理
    【图论】网络流解决二分图最大匹配量问题
    【计算几何】atan2函数
    【单峰计数DP】Problem F – Fabricating Sculptures
    Java基础之:自定义泛型
  • 原文地址:https://www.cnblogs.com/xirfly/p/9970881.html
Copyright © 2011-2022 走看看