素数求和
#include <stdio.h>
int main ()
{
int a,b;
scanf("%d %d",&a,&b);
if(a < 2){
a = 2;
}
int d;
int sum = 0;
for(d = a;d < b;d++){
int isPrime = 1;
int e;
for(e = 2;e < d;e++){
if (d % e == 0){
isPrime = 0;
break;
}
}
if(isPrime == 1){
sum += d;
}
}
printf("%d\n",sum);
return 0;
}
0 100
1060
--------------------------------
Process exited after 1.84 seconds with return value 0
上述程序中第一个for循环为枚举指定范围内的所有数字,第二个for循环为计算是否是素数,第一个if循环为控制表示素数的变量的值,第二个if为计算满足条件的数字(素数)的和。
上述程序中12到20行是用来判断一个数字是不是的素数的,可以单独拿出来放在前面做成一个函数。
#include <stdio.h>
int isPrime(int d)
{
int isPrime = 1;
int e;
for(e = 2;e < d;e++){
if (d % e == 0){
isPrime = 0;
break;
}
}
return isPrime;
}
int main ()
{
int a,b;
scanf("%d %d",&a,&b);
if(a < 2)a = 2;
int d;
int sum = 0;
for(d = a;d < b;d++){
if(isPrime(d) == 1){
sum += d;
}
}
printf("%d\n",sum);
return 0;
}
0 100
1060
--------------------------------
Process exited after 1.623 seconds with return value 0
::: warning 第三行函数int isPrime(int d)定义时给了参数int d,该函数isPrime称为有参函数,这个参数d在主函数中第23行调用判断是否为素数时候,需要22行代码把输入范围内的每一个数字枚举出来提供给判断是否为素数的函数做进一步判断,即需要参数值的传递。 ::: printf是C语言标准库中的一个函数,上述程序中3到14行是程序定义的一个函数,和printf一样,定义后可以随时调用。 有了定义的函数判断素数后,上述程序的主函数就会比较简单,即22到26行,对每一个符合要求的数字做遍历,循环的每一步调用定义的函数isPrime(d)来判断d是否为素数。 上述定义的isPrime函数也可以在其他需要做素数判断的程序中调用。 上述程序也可以用如下程序输出结果:
#include <stdio.h>
int isPrime(int i)
{
int ret = 1;
int k;
for (k=2;k < i - 1;k++){
if (i%k == 0 ) {
ret = 0;
break;
}
}
return ret;
}
int main()
{
int m, n;
int sum = 0;
int i;
scanf( "%d %d", &m,&n) ;
if (m<2)m=2;
for ( i=m; i<=n; i++ ) {
if ( isPrime(i) ) {
sum += i;
}
}
printf("%d\n",sum) ;
return 0;
}
数字求和
分别求1-10、20-30、35-45的中所有素数的和:
#include <stdio.h>
int isPrime(int d)
{
int isPrime = 1;
int e;
for(e = 2;e < d ;e++){
if (d % e == 0){
isPrime = 0;
break;
}
}
return isPrime;
}
int main ()
{
int a = 5,b = 10;
if(a < 2){
a = 2;
}
int sum1 = 0;
int d;
for(d = a;d < b;d++){
if(isPrime(d) == 1){
sum1 += d;
}
}
printf("%d\n",sum1);
int m = 20,n = 30;
if(m < 2){
m = 2;
}
int sum2 = 0;
for(d = m;d < n;d++){
if(isPrime(d) == 1){
sum2 += d;
}
}
printf("%d\n",sum2);
int p = 35,q = 45;
if(p < 2){
p = 2;
}
int sum3 = 0;
for(d = p;d < q;d++){
if(isPrime(d) == 1){
sum3 += d;
}
}
printf("%d\n",sum3);
return 0;
}
12
52
121
--------------------------------
Process exited after 0.0151 seconds with return value 0
上述程序复用了素数判断的程序,但是下面的三个for循环是复制修改数字得来的。 ::: warning 如上的代码复制是程序质量不良的表现。如果后期需要代码维护,会增加工作量。 ::: 使用如下代码优化:
#include <stdio.h>
void sum(int begin,int end)
{
int d;
int sum = 0;
for(d = begin;d <= end;d++){
if(isPrime(d) == 1){
sum += d;
}
}
printf("%d\n",sum);
}
int isPrime(int d)
{
int isPrime = 1;
int e;
for(e = 2;e < d ;e++){
if (d % e == 0){
isPrime = 0;
break;
}
}
return isPrime;
}
int main ()
{
sum(5,10);
sum(20,30);
sum(35,45);
return 0;
}
12
52
121
--------------------------------
Process exited after 0.01651 seconds with return value 0
函数定义
什么是函数: 函数是程序中的一块代码,接收0个或多个参数,做一件事情并返回0个或一个值。如下:
void sum(int begin,int end)
{
int d;
int sum = 0;
for(d = begin;d <= end;d++){
if(isPrime(d) == 1){
sum += d;
}
}
printf("%d\n",sum);
}
第一行是函数头,大括号内是函数体,函数一定要有大括号。 ::: tip 在函数头void sum(int begin,int end)上,void称为返回类型,sum称为函数名,圆括号内称为参数表。 void表示不返回,即sum函数不返回任何内容。参数表中表示sum函数有两个参数,分别是int类型的begin和int类型的end。 :::
函数调用
调用函数需要给出函数名加上参数值,函数表中有几个参数,就需要传递几个正确类型的参数。 没有参数时函数名后加圆括号。 ::: warning 在函数头上,参数表的圆括号一定要写,即使没有参数也要写。圆括号()起到表示参数调用的重要作用。 :::
#include <stdio.h>
void cheer()
{
printf("cheer\n");
}
int main()
{
cheer();
return 0 ;
}
cheer
--------------------------------
Process exited after 0.0156 seconds with return value 0
上述程序中,cheer()参数表为空,表示不接受任何参数,返回类型为void,即不返回任何内容,cheer函数内输出“cheer”。在main函数中调用cheer函数,可以输出cheer。 如果主函数调用cheer时候没有在cheer后加圆括号,会有警告信息提示“cheer表达式的结果未被使用”,函数调用失败,没有输出信息。 ::: tip 函数名后面括号内有参数时需要给出正确的数量和顺序,这些值会按照顺序依次初始化函数中的参数。如前面程序使用void sum(int begin,int end)和sum(5,10),在调用sum时候给了两个值分别对应sum函数的两个函数begin和end。 ::: 函数知道调用位置,会把结果返回到调用位置下方。如上述程序,第一次调用sum时候会将结果返回到第二个sum处,第二次调用sum时候会将结果返回到第三个sum处,第三次调用sum时候会将结果返回到return处。
从函数中返回值
每段函数如果需要返回结果,就需要使用return将结果交给调用函数的地方。 如:int isPrime(int i),表示isPrime返回一个int的结果,需要使用return来返回一个int。
int max(int a,int b);
{
int ret;
if(a > b){
ret = a;
}else{
ret = b;
}
return ret;
}
上述程序表示,如果a > b,return为a,else时return为b。 return语句作用是停止函数运行和返回一个值。 return有两种写法,return后直接接分号和return后跟一个表达式(值) 一个函数中可以出现多个return语句。 也可以直接把return写在if循环内,如下:
int max(int a,int b);
{
if(a > b){
return = a;
}else{
return = b;
}
}
为遵循单一出口的原则,不使用这种写法。(多个return会导致程序有多个离开函数的出口,有多条语句可以将函数值传递到函数外,如果未来需要修改函数出口,会增加很多无用劳动)。
#include <stdio.h>
int max(int a,int b)
{
int ret;
if(a > b){
ret = a;
}else{
ret = b;
}
return ret;
}
int main()
{
int a,b,c;
a = 5;
b = 6;
c = max(10,12);
c = max(a,b);
c = max(c,23);
printf("%d\n",max(a,b));
return 0;
}
6
--------------------------------
Process exited after 0.01047 seconds with return value 0
上述程序中,第18行的max(10,12)的结果是ret的值,即return返回的值会作为函数运行的结果继续参与运算如赋给变量。 上述程序的第21行printf中,是将max函数的值作为printf的结果输出,程序需要再返回到3-12行函数max处进行计算,得出max(a,b)的结果是ret并计算出ret的值结果为6,printf输出结果。 上述程序表明函数返回值可以赋值给变量,也可以再传递给函数,也可以丢弃。即函数max调用但不把结果交给任何变量,printf没有结果输出,在程序编译时没有问题。 如上述程序中还可以写出max(max(a,b),c)的语句。
没有返回值的函数
- 函数名前的类型需要写成void
- 不能使用带值的return,也可以没有return(当函数运行到最后一行到大括号的位置时候,函数也会返回)
- 在调用过程中不能做返回值的赋值。如void sum(int begin,int end),不能再把sum变量的值用来参与运算或传递给其他变量。
如果函数有返回值,必须使用带值得return。