第十周编程总结
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;
}