1、C语言学者都会做的一道题目——输出质数,却在之前被许多公司笔试选取,其重点在于程序的优化问题。
最基础的写法:
#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 (i == j)
printf("%-4d", i);
}
return 0;
}
运行结果正常,但程序不是最优化版本,其中两个for循环进行的数据太多,可以减少次数。
#include "stdio.h"
#include "math.h"
int main()
{
int i, j;
for (i = 100; i <= 200; i++)
{
for (j = 2; j < sqrt((double)i); j++)
{
if (i%j == 0)
break;
}
if (j > sqrt((double)i))
printf("%-4d", i);
}
return 0;
}
以上版本在第二个for循环括号内修改,使得循环检测范围为根号下i(一个数学问题),减少程序运行内容
但其实仍然可以优化,偶数必然不是质数,因此在第一个for循环可以改变范围,只在奇数内排查,并且可以加入一个变量,统计其总数
#include "stdio.h"
#include "math.h"
int main()
{
int i, j;
int number=0;
for (i = 101; i <= 200; i=i+2)
{
for (j = 2; j < sqrt((double)i); j++)
{
if (i%j == 0)
break;
}
if (j > sqrt((double)i))
{
number++;
printf("%-4d", i);
}
}
printf("\nSum is :%d\n",number);
return 0;
上述版本即为最终版本
2、给定两个变量并附值,要求交换两个值
#include<stdio.h>'
int main()
{
int a=6;b=4; //要求交换
int c; //设置一个中间变量
c=a;a=b;b=c;
printf("%d,%d",a,b);
return 0;
}
结果: 6,4 完成交换
倘若此题为面值题,面试官告诉你:“不允许设定中间值,能否完成”。
#include<stdio.h>'
int main()
{
int a=6;b=4; //要求交换
a=a+b; b=a-b;a=a-b; //此为关键点
printf("%d,%d",a,b);
return 0;
结果:4,6 完成交换,此处运用了一个算法知识。
而此时面试官又告诉你,此程序会不会有bug,或者能否加快运算速度(因为计算机计算加减是最慢的,而计算位运算效率最高)
#include<stdio.h>'
int main()
{
int a=6;b=4; //要求交换
a=a^b; // 0000 0110 2
b=a^b; // 0000 0100 6
a=a^b; //4 a=4
printf("%d,%d",a,b);
return 0;
结果:4,6,完成交换,此处运用异或运算,具体设计计算机对于数据的储存和异或运算的计算。
异或:两者相同为0,不同为1
心得:程序的编写追求的是效率和完成度,即使是一个再简单的程序,也有修改的空间。
此博文到此结束
欢迎转载,请标明出处
作者:琛