待到秋来九月八,我花开后百花杀
先给自己一个激励话:
企者不立,跨者不行;
自见者不明;自是者不立;
自伐者无功;自矜者不长;
其在道也,曰余食赘形,物或恶之。
故有道者不处。
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;
}