大家好,很高兴又和大家见面了,在上一篇中我们通过6道题练习咱们的编码能力,今天咱们继续来做几道题,话不多说,咱们开始今天的练习题。
1.数9的个数(1~100)
这道题的要求还是相对简单的,我们只需要找出1~100之间的含9的整数就行了,这里我们可以很快地想到,1~100的数要想含9,那除了十位就是个位了,那我们的编码思路就明确了,我们把这个数分别与10进行相除取商和相模取余,只要商或者余数为9,那就记录下来,顺着这个思路,编写代码:
//数9的个数——方法1
int main()
{
int a = 0, b = 0;//变量a为我们要找的数,变量b记录9的个数;
for ( a = 9; a <= 100; a++)//1~8肯定不含9,所以直接从9开始找;
{
if (a % 10 == 9)//找个位含9的整数;
{
b++;
printf("个位含9的整数%d\n", a);
}
if (a / 10 == 9)//找十位含9的整数;
{
b++;
printf("十位含9的整数%d\n", a);
}
}
printf("9的个数:%d\n", b);
return 0;
}
这一题有没有另一种写法呢?答案肯定是有的,既然我们含1~100中含9的数在90之前都是个位含9,在90之后个位十位都可能含9,那就可以将这两种情况分开进行记录,顺着这个思路,编写代码:
//数9的个数——方法2
int main()
{
int a = 0, b = 0;//变量a为我们要找的数,变量b记录9的个数;
for (a = 9; a < 80; a += 10)//1~8肯定不含9,所以直接从9开始找;
{
printf("个位含9的整数:%d\n", a);
b++;
}
for (; a <= 100; a++)//这里省略对象语句,因为我们在上一个循环出来后的值需要继续使用,所以不需要初始化
{
if (a % 10 == 9)//找个位含9的整数;
{
b++;
printf("个位含9的整数:%d\n", a);
}
if (a / 10 == 9)//找十位含9的整数;
{
b++;
printf("十位含9的整数:%d\n", a);
}
}
printf("9的个数:%d\n", b);
return 0;
}
这里可能就会有朋友奇怪了,为什么第一个循环是到80不是到90呢,这里涉及到for语句的逻辑顺序了,for语句在下一次判定前进行的递进语句,也就是说,如果判断语句是90,那在出循环的时候,a的值就变成了99,直接把90~99之间的9给略过了,所以,这里需要到89就跳出循环,进入下一个循环,因为跳出循环后的值是我们需要用的,所以第二个循环的对象语句可以省略。接下来我们来看下一题:
2.分数求和(1/1-1/2+1/3-1/4+1/5……+1/99-1/100)
这一题我们可以看到,分母为奇数的需要相加,分母为偶数的需要相减那我们可以将它们分成奇数分母的和减去偶数分母的和,顺着这个思路,我们来编写代码:
//分数求和(1/1-1/2+1/3-1/4+1/5……+1/99-1/100)——方法1
int main()
{
double sum1 = 0;//定义奇数分母求和的变量sum1;
double sum2 = 0;//定义偶数分母求和的变量sum2;
double i, j;//定义奇数分母变量i与偶数分母变量j;
for (i = 1; i <= 100; i += 2)
{
sum1 = sum1 + 1/i;//计算(1/1+1/3+1/5+……+1/99)
}
for (j = 2; j <= 100; j += 2)
{
sum2 = sum2 + 1/j;//计算(1/2+1/4+1/6+……+1/100)
}
double sum = sum1 - sum2;//计算(1/1-1/2+1/3-1/4+1/5……+1/99-1/100)
printf("sum=%lf\n", sum);
return 0;
}
有朋友就会说,你这个也太麻烦了,还需要两个循环,看我一次循环就搞定了,我们观察式子可以得到这些分数的符号是一正一负的,如果我们能在每一次循环都能改变它的符号的话是不是就解决这个问题呢?接下来我们顺着这个思路来编写代码:
//分数求和(1/1-1/2+1/3-1/4+1/5……+1/99-1/100)——方法2
int main()
{
double sum = 0;//定义求和变量;
double i = 0;//定义分母变量;
int j = 1;//定义符号变量;
for (i = 1; i <= 100; i++)
{
sum += j * 1 / i;
j = -j;
}
printf("sum=%lf\n", sum);
return 0;
}
这里我们可以看到,确实方便了很多,那这一题我们就解答完毕了,下面接着看下一题:
3.求最大值(求10个整数中的最大值)
看到这一题,不知道大家有没有一种很熟悉的感觉,这一题是不是跟我们之前做的比较三个数的大小是一样的呀,只不过现在他需要我们比较10个数的大小,量变多了,但是核心还是没变的,在上一篇中我们采用了换位的方法,这里我们是不是就可以继续沿用这个方法呀!!!下面来编辑代码:
//求最大值(求10个整数中的最大值)
int main()
{
int a[11] = { 1,2,3,4,5,6,7,8,9,10 };//我们用1~10来举列子,这里定义整型数组,并将这十个数放在数组里;
int i = 0;//定义下标变量i,后面通过下标来提取对应的数值;
int max = a[0];//定义换位变量,并将数组中的第一个元素赋值给变量,确保是数组中的数进行比较;
for (i = 0; i < 10; i++)
{
if (max < a[i])//换位变量与每个数进行比较
{
max = a[i];//如果换位变量的值小于与其比较的数值,则将这个数组赋值给换位变量
}
}
printf("最大值max=%d\n", max);
return 0;
}
这里我们通过max这个换位变量完成了最大值的交换,并成功将最大值赋值给了max,当然也有其他的方法,如果朋友们你们有什么更好的方法的话,可以分享在评论区供大家参考一下。我们继续下一题;
4.乘法口诀表(在屏幕上输出九九乘法表)
不知道大家还记不记得我们在初识C语言13中已经编写过乘法口诀表的代码了,感兴趣的朋友可以回顾一下,里面有具体的编写思路,这里我们借用一下之前编码的结果,如下图:
现在我们尝试用for语句来改写一下:
//九九乘法表——数组
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9 };//定义第一个乘数组成的数组;
int b[] = { 1,2,3,4,5,6,7,8,9 };//定义第二个乘数组成的数组;
int c = 0;//定义变量来接收乘积;
int i, j;//定义下标变量;
int sz = sizeof(a) / sizeof(a[0]);//计算数组的长度
for (i = 0; i < sz; i++)
{
for (j = 0; j < sz; j++)
{
if (a[i] <= b[j])
{
c = a[i] * b[j];
printf("%d*%d=%d ", a[i], b[j], c);
}
if ( b[j] == b[sz-1])
{
printf("\n");
}
}
}
return 0;
}
这一次我们按照原先的思路通过数组来进行编写代码,接下来我们来编写不需要数组的代码:
//九九乘法表——通过行列来打印
int main()
{
int i, j;
for (i = 1; i <= 9; i++)//打印列;
{
for (j = 1; j <= i; j++)//打印行;
{
printf("%d*%d=%-2d ", i, j, i * j);//2d——打印两位数,不足两位就用空格在左边补齐;
//-2d——打印两位数,不足两位就用空格在右边补齐;
if (j == i)//判断行和列是否相等;
{
printf("\n");//相等则换行继续打印;
}
}
}
return 0;
}
这个方法很巧妙,通过控制行和列来进行打印,第一行打印一次,第二行打印两次……第九行打印九次,通过判断i和j是否相等来控制换行。前面不管是第一次编写也好,还是第二次改写也好,我都是用的数组的思维在进行编写,将九九乘法表的两个乘数作为变量,通过控制其中一个变量来进行打印,这一次的编写思路则是跳出了乘数的约束,通过控制行和列来达到打印的目的,虽然这次改写的两个形式上都差不多,但是在编写上却简洁了很多,朋友们,如果你们有更好的方法,也可以分享在评论区供大家参考。
那今天的练习咱们到这里就结束了,不知道大家在做阅读的过程中,对解答这些题有没有新的编写思路呢?我还是很期待和大家在评论区互动起来的。接下来随着学习的深入,我也会继续给大家分享我在学习过程中的感受,感谢各位的翻阅,咱们下一篇再见。