B : 求m到n之间的素数和----函数
题目描述
输入两个正整数m和n(m<n),求m到n之间(包括m和n)所有素数的和,要求定义并调用函数isprime(x)来判断x是否为素数(素数是除1以外只能被自身整除的自然数)。
#include <stdio.h>
#include <math.h>
int isprime(int x)
{
if(x==1) return 0;
int i;
for(i=2;i<=sqrt(x);i++)
if(!(x%i))
return 0;
return 1;
}
int main()
{
int m,n,i,sum=0;
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++)
if(isprime(i)) sum+=i;
printf("%d\n",sum);
return 0;
}
在isprime函数中,没有必要用flag保存素数判断的结果(很多同学都用了),如果x%i结果为0直接返回0即可
C : 求组合数的值----函数
题目描述
编制程序,输入m,n(M>=n>=0)后,计算下列表达式的值并输出:
m!
————
n! (m-n)!
要求将计算阶乘运算的函数写为fact(n),函数返回值的类型为float
优秀代码
#include<stdio.h>
int main()
{
int a[11],n,m,i,j,k,flag,count;
scanf("%d",&n);
while(n--)
{
flag=1; // 用于判断m是否在数组中的变量
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(i=0;i<10;i++) // 判断m是否在数组中
{
if(a[i]==m)
{
flag=0;
}
}
if(m%2==0&&flag) // 第一种情况
{
a[10]=m;
for(i=0;i<11;i++) // 对数组进行冒泡排序
{
for(j=1;j<11;j++)
{
if(a[j]>a[j-1])
{
k=a[j];
a[j]=a[j-1];
a[j-1]=k;
}
}
}
for(i=0;i<11;i++) // 输出结果
{
if(i==10) printf("%d\n",a[i]);
else printf("%d ",a[i]);
}
}
else if(m%2&&flag==0) // 第二种情况
{
for(i=0;i<10;i++) // 对数组进行冒泡排序
{
for(j=1;j<10;j++)
{
if(a[j]<a[j-1])
{
k=a[j];
a[j]=a[j-1];
a[j-1]=k;
}
}
}
for(i=0;i<10;i++) // 输出结果
{
if (a[i]!=m&&i!=9) printf("%d ",a[i]);
else if(a[i]!=m&&i==9) printf("%d\n",a[9]);
}
}
else // 第三种情况
{
count=0;
for(i=0;i<10;i++) // 对数组进行冒泡排序
{
for(j=1;j<10;j++)
{
if(a[j]>a[j-1])
{
k=a[j];
a[j]=a[j-1];
a[j-1]=k;
}
}
}
for(i=0;i<10;i++) // 统计奇数的数量
{
if(a[i]%2)
{
printf("%d ",a[i]);
count++;
}
}
count=9-count;
for(i=0;i<10;i++)
{
if(a[i]%2==0&&count) // 先输出偶数
{
printf("%d ",a[i]);
count--;
}
else if(a[i]%2==0&&count==0) // 然后输出奇数
{
printf("%d\n",a[i]);
}
}
}
}
return 0;
}
这段代码整体的思路是比较清晰的,格式也非常不错
D: 编写删除字符串中某个字符的函数----函数
题目描述
编制函数del_char
函数原型为 void del_char(char *,char),函数的功能是删除a指向的字符串中值为ch的字符,例如从字符串"AscADef"中删除'A'后,字符串为"scDef"。
优秀代码
#include <stdio.h>
void del_char(char ch1,char ch2[]); //函数原型声明
int main()
{
char ch1,ch2[100];
scanf("%c%s",&ch1,ch2);
del_char(ch1,ch2); //函数调用(地址传递方式)
printf("%s\n",ch2);
return 0;
}
void del_char(char ch1,char ch2[]) //函数定义(ch1,ch2[]是形参)
{
int i,j;
for (i=0;ch2[i]!='\0';i++)
{
if (ch2[i]==ch1)
for (j=i;ch2[j]!='\0';j++)
ch2[j]=ch2[j+1];
if (ch2[i]==ch1) //检查是否有连续的同一个字符
i--;
}
}
E:鞍点定位
题目描述
在一个二维矩阵中,如果某个位置的数值是该行最大值,同时也是该列最小值,我们则称该位置是矩阵的鞍点。鞍点在工业控制,建筑力学等方面有着广泛应用。鞍点可能有多个,也可能没有。
请编写程序找出矩阵的鞍点。
优秀代码
#include <stdio.h>
#define NUM1 100
#define NUM2 100
void check(int a[NUM1][NUM2]);
int main()
{
int a[NUM1][NUM2],i,j,k,T,m,n,flag;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&m,&n);
for (i=0;i<m;i++)
for (j=0;j<n;j++)
scanf("%d",&a[i][j]);
for (i=0;i<m;i++)
{
k=0;
for (j=0;j<n;j++)
{
if (a[i][k]<a[i][j]) // 超出该行最大值的列号
k=j;
}
flag=1;
for (j=0;j<m;j++) // 在该行最大值那一列找是否存在更小的数
if (a[i][k]>a[j][k])
{
flag=0;
break;
}
if (flag) // 输出鞍点
{
printf("%d %d\n",i,k);
break;
}
}
if (!flag) // 找不到鞍点
printf("-1\n");
}
return 0;
}