C语言程序设计 第七章实验报告
expr1
已知求Sn的公式:
S
n
=
∑
i
=
1
n
i
S_{n} = \sum _{i=1}^{n}i
Sn=i=1∑ni
想要求出Sn从1到20的值
#include<stdio.h>
int psum(int n){
int ans = 0;
for(int i=0;i<=n;i++)
ans+= i;
return ans;
}
int main(){
int m;
scanf("%d",&m);
for(int i=1;i<=20;i++){
printf("%-5d",psum(i));
if(!(i%4)) putchar('\n');
}
return 0;
}
expr2
使用基于指针进行双向地址传递的函数来同时返回一个数组之中的最大值和最小值
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void max_min(double *num, double *max, double *min){
int n;
for(n =1; n<10; n++){
if(num[n]>*max)
*max = num[n];
if(num[n]<*min)
*min = num[n];
}
}
int main(){
double *k = (double*)malloc(sizeof(double)*10);
double max=0.00, min=0.00;
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
k[i]= (rand()%1000)/77.0000;
printf("%-8.3f",k[i]);
}
min = k[0];
putchar('\n');
max_min(k,&max,&min);
printf("%f\t%f",max,min);
return 0;
}
Line16 \ Line 18 使用当前的时间戳作为随机种子生成随机数。
(rand()%1000)/77.0000;
生成了伪随机的浮点数(因为rand生成的是随机整数)
需要注意的是,这个函数可以进行进一步的优化。在function之中就应该说明**min = k[0]; **而不是在main函数里面才说。
没有21行的话会导致输出min0.0000
考虑数据范围!!
expr3
判断一个数是不是“回归数”,即满足:
a
n
s
=
∑
i
=
0
n
−
1
x
i
n
a
n
s
=
∑
j
=
1
n
−
1
1
0
j
∗
x
j
ans = \sum ^{n-1}_{i = 0} x_{i}^{n} \\ ans = \sum_{j = 1}^{n-1} 10^{j} * x_{j}
ans=i=0∑n−1xinans=j=1∑n−110j∗xj
#include<stdio.h>
#include<math.h>
int regress(int m){
int temp = m, ans = 1,sum=0;
while(temp/=10) ans++;
temp = m;
for(;temp;temp/=10)
sum+= pow(temp%10,ans);
if(sum == m) return 1;
else return 0;
}
int main(){
for(int i=100;i<1000;i++){
if(regress(i))printf("%-5d",i);
}
return 0;
}
regress先通过while循环来实现判断一个数字的长度,然后判断一个数是否为回归数。
expr4
使用递归来实现求组合数
#include<stdio.h>
int Combi(int n, int m){
if(n>m/2) return Combi(m-n,m);
else if(n == 1) return m;
else if(n == 0) return 1;
else
return Combi(n,m-1)+ Combi(n-1,m-1);
}
int main(){
int n,m;
scanf("%d,%d",&n,&m);
printf("%d",Combi(n,m));
return 0;
}
C m n = { C m 0 = 1 , n = 0 ; C m 1 = m , n = 1 ; C m n = C m m − n , n > m 2 ; C m n = C m − 1 n + C m − 1 n − 1 ; C_{m}^{n}=\left\{ \begin{array}{rcl} C^{0}_{m} = 1, n=0;\\ C^{1}_{m} = m,n =1;\\ C^{n}_{m} = C^{m-n}_{m}, n>\frac{m}{2};\\ C^{n}_{m} = C^{n}_{m-1} + C^{n-1}_{m-1}; \end{array} \right. Cmn=⎩⎪⎪⎨⎪⎪⎧Cm0=1,n=0;Cm1=m,n=1;Cmn=Cmm−n,n>2m;Cmn=Cm−1n+Cm−1n−1;
expr5
#include<stdio.h>
#define square(x) (x*x)
int main(){
printf("%d",square(6)/square(3));
return 0;
}
主函数: expr6.c
#include<stdio.h>
#include"myfun.c"
int main(){
int m;
scanf("%d",&m);
fun(m);
return 0;
}
分解质因数的函数: myfun.c
void fun(int m){
int i = 2;
printf("%d = 1",m);
while(m>1){
if(m%i==0){
m/=i;
printf("*%d",i);
}
else i++;
}
}