第十周编程总结

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", 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;
}

posted @ 2018-11-23 23:48  xirfly  阅读(229)  评论(0编辑  收藏  举报