【编程学习C篇3】素数&&乘法口诀表_2023_04_25

        原本是想要对所有学习的内容进行全面的整理,但发现这样不仅时间不够,而且很难做到面面俱到,一昧追求完美只会适得其反,所以我打算把能想到的比较重要且容易忘记的知识进行随机的整理,之后会着重记录一些必会的C语言编程典例,其中包含我自己的理解和思维过程,适合和我同样刚刚入门的新手参考,毕竟写博客也不完全是写给自己看的。

一.循环语句:

1.for循环:

for(表达式1;表达式2;表达式3){}

三个表达式从前往后作用分别为:初始化判断调整

for循环的优势在于循环变量的调整全部都在for之后的括号里,不用担心写程序在这方面出问题,

说人话就是不容易出现程序因Bug而死循环的情况,并且容易找到循环变量。

给个例子吧:

#include <stdio.h>

int main()
{
	//打印0—100之间3的倍数的数字
	int i = 0;
	for (i = 0; i < 100; i++)
	{
		if (i % 3 == 0)
		{
			printf("%d ", i);
		}
	}
    
    return 0;
}

2.while循环:

while(表达式){}

这个循环最为简单,程序执行到这里会先判断括号里的条件是否满足,之后进入循环,直到括号条件不满足时跳出循环。

随个例子:

#include <stdio.h>

int main()
{
//下面是写一段找出1到100中的奇数的代码
	int i = 1;
	while (i <= 100)
	{
		//判断i是奇数的话,就打印i
		if(i % 2 == 1)
			printf("%d ", i);
		++i;  
	}

    return 0;
}

3.do...while循环:

do{循环语句;}while(表达式);

需要注意该循环最后需要加;

此循环的特点是,程序执行到这里会不管三七二十一先进入循环,再进行条件判断。

这个循环不是很常用,只有一个猜数字游戏的例子,但是代码有些繁杂暂时不放在这里了。

二.分支语句:

1.if语句:

if(判断条件){};

写if语句也有许多需要注意的点:

只写if语句:

#include <stdio.h>

int main()
{
    int a = 0;
	int b = 0;
	if (a && b)  //这里若条件成立(结果为真),进入if,反之不进入
		printf("hehe");
	if (a || b)
		printf("haha");

    return 0;
}

这里的判断条件是什么意思呢?第二篇博客里已经介绍过0为假非0为真,所以这里是指a和b的真假情况,a&&b指a和b必须全部为真才会进入循环,a||b指a和b只要有一个为真即可进入循环。

if,else语句:

#include <stdio.h>

int main()
{
    int age = 0;
	scanf("%d", &age);
	
    if (age < 18)
		printf("青少年\n");
	
    else if (age >= 18 && age <= 30)
		printf("青年\n");
	
    else if (age >= 31 && age <= 50)
		printf("中年\n");
	
    else if (age >= 51 && age <= 80)
		printf("中老年\n");
	
    else if (age >= 81 && age <= 100)
		prnitf("老年\n");
	
    else
		printf("老寿星\n");

    return 0;
}

如果有多组判断条件,可以用else if无限加,最后一条必须是else语句,并且else语句后面不可以写判断条件。

2.switch语句:

一个简单的switch语句:

#include <stdio.h>

int main()
{
    switch(0)
    {
    case 0:
        break;
    case 1:
    case 2:
    default:
    }

    return 0;
}

该语句简单来说就是,switch后面括号里对应case后面的序号,序号可以放整型(包括字符类型),进入对应的case语句后,若该case语句里面有break,则会直接跳出switch语句,否则会按照顺序往下一条条的执行case语句,直到执行到最后的default语句,而且default语句的位置不一定在最后面,放哪里都行。

三.写一个找素数的程序:

求一组数字,找出其中的素数。

听起来很简单,但里面有很多学问,想单单写出一个求素数的程序不难,难就难在程序的优化,算法的优化。

这是我写的第一个求素数的程序:

#include <stdio.h>

int main()
{
    //打印100—200之间的素数
	int i = 100;
	int flag = 0;
	for (i = 100; i <= 200; i++)
	{
		int bc = i;
		int b = 1;
		for(b = 1; b <= bc; b++)
		{
			if (bc % b == 0)
			{
				flag++;
			}
		}
		if (flag == 2)
		{
			printf("%d ", i);
		}
		flag = 0;
	}
   
    return 0;
}

可以看出,我选择用暴力求解的方法,比如要求5是不是素数,我会用5,4,3,2,1作为除数对其进行除法运算,能整除flag的值就+1,若flag为2则证明只有1和5本身能与5整除,则证明5为素数。

这种求法问题很明显,运算次数过多,当需要判断的数字较多时,判断效率很低。

当然,针对我这种算法也有很大的优化空间,比如可以改为只用4,3,2作为除数对5进行除法运算,这样每次判断可以少算两次。

除此之外,我们还可以想一下,大于0的偶数,除了2以外,都不是素数,所以要计算100到200的素数,我们可以令i = 101,并且i += 2,这样可以省去许多不必要的计算。

该算法还能不能再优化呢?

可以,举个例子,16可以写成1*16,2*8,4*4,8*2,16*1,我们可以观察到,欲求一个数能否被除1和自己以外的数整除,以16为例,只需要让16除以2,3,4就行了,如果2,3,4全部都不能对16进行整除,那么8和16也不能对16进行整除,其他比4大比16小的数更不能对16进行整除,进而验证红字部分的正确性。简化一下就是,先把要判断的数(k)开方,若开得出来,则证明其一定不是素数,若开不出来,则用k除以大于1小于根号k的整数,若有一个及以上的数能整除k,则证明k不是素数,否则证明k是素数。

#include <stdio.h>
#include <math.h>

int main()
{
    int i = 0;
    int count = 0;
    for(i = 101; i <= 200; i += 2;)
    {
        int j = 0;
        int flag = 1;
        for(j = 2; j <= sqrt(i); j++)
        {
            if(i % j == 0;)
            {   
                flag = 0;
                break;
            }
        }
        
        if(flag == 1)
        {
            printf("%d", i);
            count++;
        }
    }
    printf("\ncount = %d\n", count);
  
    return 0;
}

 上面是优化后的代码,效率大大提高,count可以帮忙数出素数的个数,并且上面仅仅是利用试除法判断素数,还有许多更加复杂,高级的判断方法。

四.输出乘法口诀表:

乘法口诀表网上有图片可以让我们得知它的真实面目:

 我们可以看到,乘号两边的两个数可以用 i 和 j 表示,针对每一行,当 i 为1时,j 也到1为止,当 i 为2时,j 也到2为止。所以每行的 j 一定小于等于 i,第一行 i = 1, j <= 1,第二行 i = 2, j <=2以此类推,得出第一层for循环的条件应为 i = 1; i <= 9; i++; 第二层for循环的条件为 j = 1; j <= i; j++;最后还要注意表格的错位问题,下面我有给出解决方案。

#include <stdio.h>
#include <math.h>

//函数实现打印乘法口诀表
void word(int num)
{
	int i = 0;
	int j = 0;
	for (i = 1; i <= num; i++)
	{
		for (j = 1; j <= i; j++)
		{
			if (j * i > 9)
			{
				if (1 * i > 9)
				{
					printf("%d X %d = %d ", j, i, i * j);
				}
				else 
				{
					printf("%d X %d = %d  ", j, i, i * j);
				}
			}
			else
			{
				printf("%d X %d = %d   ", j, i, i * j);
			}
		}
		printf("\n");
	}
}


int main()
{
	int num = 0;
	scanf("%d", &num);
	word(num);

	return 0;
}

这里我是写了一个打印乘法口诀表的函数,其中的num相当于红字的9,这个函数可以实现打印1X1到12X12的乘法口诀表,再大屏幕都要放不下了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值