对前期代码的升级打造

待到秋来九月八,我花开后百花杀

先给自己一个激励话:
企者不立,跨者不行;
自见者不明;自是者不立;
自伐者无功;自矜者不长;
其在道也,曰余食赘形,物或恶之。
故有道者不处。

1. 打印100~200之间的素数

回顾一下原来的代码思想
思路:判断一个整数m是否是素数,只需把 i 被 2 ~ i 之间的每一个整数去除,如果都不能被整除,那么 i 就是一个素数。

//An highlighted blockvar foo = 'bar';
#include <stdio.h>
int main()
{
 int i, j;
 for (i = 100; i <= 200; i++)
 {
  for (j = 2; j < i; j++)
  {
   if (i % j == 0)
    break; 
  }
  if (j >= i)//当被除数从j的循环中自然流出,而不是被break跳出,说明该数不能被2到该数前的所有数整除
   printf("%d\t", i);
 }
 system("pause");
 return 0;
}

弊端:算法过于刚硬,遍历太多,编译速度太慢。

思路升级:i 不必被 2 ~ i-1 之间的每一个整数去除,只需被 2 ~ √i 之间的每一个整数去除就可以了。如果 i 不能被 2 ~ √i 间任一整数整除,i 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
原因:因为如果 i 能被 2 ~ i -1 之间任一整数整除,其二个因子必定有一个小于或等于 √i ,另一个大于或等于√i 。例如 16 能被 2、4、8 整除,16=28,2 小于 4,8 大于 4,16=44,4=√16,因此只需判定在 2~4 之间有无因子即可。

//An highlighted blockvar foo = 'bar';
#include <stdio.h>
#include <math.h>
int main()
{
 int i, j;//i为被除数,j为除数
 int k;//暂存的平方根结果
 for (i = 100; i <= 200; i++)
 {
  k=(int)sqrt( (double)i );// 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换i的类型
  for (j = 2; j < k; j++)
  {
   if (i%j == 0)
    break; 
  }
  if (j >= k)
   printf("%d\t", i);//当被除数从j的循环中自然流出,而不是被break跳出,说明该数不能被2到该数前的所有数整除
 }
 system("pause");
 return 0;
}

2. 输出乘法口诀表

思路代码回顾。
思路:设置一个循环嵌套,遍历每一个1到9的乘数和被乘数,使其相乘,打印输出。

//An highlighted blockvar foo = 'bar';
#include <stdio.h> 
int main()
{
 int i, j;
 for (i = 1; i < 10; i++)//循环嵌套,使被乘数1~9遍历
 {
  for (j = 1; j < 10; j++)//循环嵌套,使乘数1~9遍历
  {
   printf("%d*%d=%d\t", i, j, i*j);
  }
  printf("\n");
 } 
 system("pause");
 return 0;
}

弊端:整体呈现九行九列,排行朴素,不够美观。是否能够像小时候背诵表那样以直角三角形形式排开呢?

思路升级:根据乘法的交换率,9X9乘法口诀表中81个式子其中有很多都有重复,例如:2X3=6和3X2=6一样,则保留2X3=6即可。
根据规律可以发现,凡是当 i > j 时就会出现重复,则可以省去

//An highlighted blockvar #include <stdio.h> 
#include <windows.h>
 int main()
  {
    int i, j;
      for (i = 1; i <= 9; i++)
       {
          for (j = 1; j <= 9; j++)
           {
               if (j < i)     //如果打印八个空格,就是右上三角形
                   continue;
               else
                    printf("%d*%d=%2d  ", i, j, i*j);
           }
          printf("\n");
 }
 system("pause");
 return 0;
}

在这里插入图片描述
如果在判断处打印八个空格,就是右上三角形;

#include <stdio.h> 
#include <windows.h> 
int main() 
{
  int i, j;  
  for (i = 1; i <= 9; i++) 
  {
     for (j = 1; j <= 9; j++) 
     {
         if (j < i)     
              printf("        ");    
         else
              printf("%d*%d=%2d  ", i, j, i*j);   
      }
      printf("\n");
 }
 system("pause");
 return 0;
}

在这里插入图片描述
同样也可以去除类似2X3=6的部分式子,也会得到一个美丽的下方三角形;

//An highlighted blockvar foo = 'bar';
#include <stdio.h>
int main() 
{
	int i, j, n;	
	for (i = 1; i <= 9; i++)
	 {		 //将下面的for循环注释掉,就输出左下三角形
	       for (n = 1; n <= 9 - i; n++)		
	         	printf("        "); 		
	       for (j = 1; j <= i; j++)		
	         	printf("%d*%d=%2d  ", i, j, i*j);
	       printf("\n"); 
	  }	
	  system("pause");	
	  return 0;
 }

在这里插入图片描述
将标注的for循环注释掉,就输出左下三角形;

//An highlighted blockvar foo = 'bar';
#include <stdio.h>
int main() 
{
 int i, j, n; 
 for (i = 1; i <= 9; i++)
  {   //将下面的for循环注释掉,就输出左下三角形
       //for (n = 1; n <= 9 - i; n++)  
          // printf("        ");   
        for (j = 1; j <= i; j++)  
           printf("%d*%d=%2d  ", i, j, i*j);
        printf("\n"); 
   } 
   system("pause"); 
   return 0;
 }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值