第十周编程总结

7-1 求奇数和 (15 分)

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

1).实验代码

#include<stdio.h>

int main()

{

  int N,sum,i;

  i=1;

  sum=0;

  scanf("%d",&N);

  while(N>0){

    if(N%2!=0){

      

      sum+=N;

      scanf("%d",&N);

    }

    

    else {

      scanf("%d",&N);

      

    }

  }

  

  printf("%d",sum);

  return 0;

  

 

}

2). 设计思路

第一步:定义变量

第二步:输入变量

第三步:调用while语句,判断奇数,累加奇数

第四步:输出答案

 

3).本题调试过程碰到的问题及解决方法

            

 

-

 

 

 

        问题:在调用while语句前,没有给N赋值

       解决方法:赋值给N

 

       4).运行结果截图

  

      

 

7-3 韩信点兵 (10 分)

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

· 按从1至5报数,记下最末一个士兵报的数为1;

· 再按从1至6报数,记下最末一个士兵报的数为5;

· 再按从1至7报数,记下最末一个士兵报的数为4;

· 最后按从1至11报数,最末一个士兵报的数为10;

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

1)实验代码

 

#include<stdio.h>

int main()

{

  int N=0;

  while((N%5!=1)||(N%6!=5)||(N%7!=4)||(N%11!=10)){

    N++;

  }

  

  printf("%d\n",N);

  return 0;

}

2).设计思路

第一步:定义变量

第二步:调用while语句进行兵数判断

第三步:输出答案

3) .本题调试过程碰到的问题及解决方法

           

               

 

 

          问题:while语句的条件使用错误

          解决方法:更改条件

       4).运行结果截图

 

 

 

 

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

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

1).实验代码

#include<stdio.h>

int main()

{

  int number=0,N,sum=0,amount=0;

  scanf("%d",&N);

  while(N!=0){

    number=N%10;

    N=N/10;

    sum+=number;

    amount++;

  }

  

  printf("%d %d",amount,sum);

  return 0;

  

}

2).设计思路

第一步:定义变量

第二步:输入变量

第三步:调用while语句,进行循环

第四步:取余得到个位数,取整赋值,得到除个位数的其他位数,继续取余得到其他位数,累加各位数字,计算位数

第五步:输出答案

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。

2).实验代码

#include<stdio.h>

int main()/*模拟竖式计算*/

{

int m,n,dividend=1,i=0,t,count=0;

scanf("%d",&m);

while(1){

t=dividend/m;      //t是商

dividend%=m;       //取余

count++;           //每次循环计算位数

    if(i||t){          //等价于if(i!=0||t!=0),排除一开始商是0的情况,判断条件千万不能用商,商有0状态

     printf("%d",t);

     i=1;

}

if(dividend==0){

printf(" %d\n",count);   //余数为0,结束循环,输出结果

break;

}

dividend=dividend*10+1;      //模拟被除数为 “光棍 ”

}

 

return 0;

}

2). 设计思路

第一步:模拟竖式计算,定义变量

第二步:输入变量

第三步:调用while语句进行无限循环,取商,取余,每次循环计算位数

第四步:排除一开始商是0的情况,

第五步:输出商的值

第六步:当余数为零时结束循环,打印光棍位数

 

 

3).本题调试过程碰到的问题及解决方法

 

        问题:没有考虑到商有0的状态

       解决方法:再定义一个变量,排除商有0的情况而导致无法打印

       4).运行结果截图

  

posted @ 2018-11-17 03:26  孙笑川6324  阅读(363)  评论(0编辑  收藏  举报
1 2 3