目录
6-15 使用函数输出指定范围内的Fibonacci数 (20 分)
6-9 输入多个单词,统计以指定字母开头的单词个数 (10 分)
7-26 用指针方法求10个数最大和最小值之差 (20 分)
函数-函数题
6-1 简单输出整数 (10 分)
void PrintN ( int N ){
int i;
for(i=1;i<=N;i++){
printf("%d\n",i);
}
}
6-2 简单阶乘计算 (10 分)
int Factorial( const int N ){
if(N<0)
return 0;
else if(N==0||N==1){
return 1;
}else{
return Factorial(N-1)*N;
}
}
6-3 找两个数中最大者 (10 分)
int max( int a, int b ){
return a>b ? a:b;
}
6-4 数字金字塔 (15 分)
void pyramid(int n){
int i,j,k;
for(i=1;i<=n;i++){
for(j=1;j<=n-i;j++){
printf(" ");
}
for(k=1;k<=i;k++){
printf("%d ",i);
}
printf("\n");
}
}
6-5 符号函数 (10 分)
int sign( int x ){
if(x>0)
return 1;
if(x<0)
return -1;
else
return 0;
}
目录
int even( int n ){
if(n%2==0)
return 1;
else
return 0;
}
6-7 使用函数求余弦函数的近似值 (15 分)
double factorial(int x){
double y=1;
for(int i=x;i>0;i--){
y*=i;
}
return y;
}
double funcos( double e, double x ){
double cos=0;
double item=1,i=0,p=1;
while(item>=e){
item=pow(x,i)/factorial(i);
cos+=p*item;
i=i+2;
p=-p;
}
return cos;
}
6-8 使用函数验证哥德巴赫猜想 (20 分)
int prime( int p ){
if(p==1)
return 0;
for(int i=2;i<=sqrt(p);i++){
if(p%i==0)
return 0;
}
return 1;
}
void Goldbach( int n ){
for(int i=2;i<=n/2;i++){
if(prime(i)&&prime(n-i)){
printf("%d=%d+%d",n,i,n-i);
break;
}
}
}
6-9 使用函数求最大公约数 (10 分)
int gcd( int x, int y ){
int a;
while(y!=0){
a=x%y;
x=y;
y=a;
}
return x;
}
6-10 统计某类完全平方数 (20 分)
int IsTheNumber ( const int N ){
int a=sqrt(N);
int b[10]={0};
int c=N;
if(a*a==c){
while(c){
b[c%10]++;
c/=10;
}
for(int i=0;i<10;i++){
if(b[i]>1)
return 1;
}
return 0;
}
return 0;
}
6-11 统计个位数字 (15 分)
int Count_Digit ( const int N, const int D ){
int x=N;
int cnt=0;
int n;
if(x<0)
x=-x;
if(x==0){
if(x==D)
return 1;
}
while(x){
n=x%10;
if(n==D)
cnt++;
x/=10;
}
return cnt;
}
6-12 使用函数计算两点间的距离 (10 分)
double dist( double x1, double y1, double x2, double y2 ){
double i,j,sum=0;
i=fabs(x1-x2);
j=fabs(y1-y2) ;
sum=sqrt(i*i+j*j) ;
return sum;
}
6-13 使用函数求特殊a串数列和 (20 分)
int fn( int a, int n ){
int temp=a;
for(int i=1;i<n;i++){
temp=temp*10+a;
}
return temp;
}
int SumA( int a, int n ){
int sum=0;
for(int i=1;i<=n;i++){
sum+=fn(a,i);
}
return sum;
}
6-14 使用函数输出指定范围内的完数 (20 分)
int factorsum( int number ){
int sum=0;
for(int i=1;i<number;i++){
if(number%i==0){
sum+=i;
}
}
return sum;
}
void PrintPN( int m, int n ){
int flag=0;
for(int i=m;i<=n;i++){
if(factorsum(i)==i){
flag=1;
printf("%d = 1",i);
for(int j=2;j<i;j++){
if(i%j==0)
printf(" + %d",j);
}
printf("\n");
}
}
if(flag==0)
printf("No perfect number\n");
}
6-15 使用函数输出指定范围内的Fibonacci数 (20 分)
int fib( int n ){
if(n==1||n==2)
return 1;
if(n>2)
return fib(n-1)+fib(n-2);
}
void PrintFN( int m, int n ){
int cnt=0;
for(int i=1;fib(i)<=n;i++){
if(fib(i)>=m){
cnt++;
if(cnt==1)
printf("%d",fib(i));
else
printf(" %d",fib(i));
}
}
if(cnt==0)
printf("No Fibonacci number");
}
6-16 使用函数输出一个整数的逆序数 (20 分)
int reverse( int number ){
int x=1;
if(number<0){
number=-number;
x=-x;
}
int temp;
int sum=0;
while(number){
temp=number%10;
sum=sum*10+temp;
number/=10;
}
return sum*x;
}
6-17 统计各位数字之和是5的数 (20 分)
int is( int number ){
int sum=0;
while(number){
sum+=number%10;
number/=10;
}
if(sum==5)
return 1;
return 0;
}
void count_sum( int a, int b ){
int sum=0;
int cnt=0;
for(int i=a;i<=b;i++){
if(is(i)){
sum+=i;
cnt++;
}
}
printf("count = %d, sum = %d",cnt,sum);
}
6-18 使用递归函数计算1到n之和 (10 分)
int sum( int n ){
long int s=0;
if(n<=0)
return 0;
else if(n==1)
return 1;
else
s=n+sum(n-1);
return s;
}
6-19 递归实现指数函数 (15 分)
double calc_pow( double x, int n ){
int sum=0;
if(n==1)
return x;
else
sum=x*calc_pow(x, n-1);
return sum;
}
6-20 递归求Fabonacci数列 (10 分)
int f( int n ){
int sum=0;
if(n==0)
return 0;
if(n==1)
return 1;
if(n==2)
return 1;
else
sum=f(n-2)+f(n-1);
return sum;
}
6-21 递归实现顺序输出整数 (15 分)
void printdigits( int n ){
if(n<10)
printf("%d\n",n);
else{
printdigits(n/10);
printf("%d\n",n%10);
}
}
6-22 递归计算P函数 (15 分)
double P( int n, double x ){
double s=0;
if(n==0)
return 1;
if(n==1)
return x;
else
s=((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;
return s;
}
6-23 阶乘计算 (10 分)
double fac()
{
static double f=1;
static double i=1;
static int flag=0;
if(flag==0)
{
flag=1;
return 1;
}
if(flag==1)
{
i=i+1;
f=f*i;
}
return f;
}
6-25 整数的“平方根” (10 分)
int fun (x){
int a=sqrt(x);
return a;
}
指针与数组函数题
6-1 一维数组的输出 (10 分)
void outputA(int *d,int n){
if(n==0)
printf("[]");
else if(n==1)
printf("[%d]",d[0]);
else{
printf("[%d",d[0]);
for(int i=1;i<n;i++){
printf(",%d",d[i]);
}
printf("]");
}
}
6-2 移除指定元素 (10 分)
//在这里描述函数接口。例如:
int fun (int *A,int N,int val){
int i,j=0;
for(i=0;i<N;i++){
if(A[i]!=val){
A[j]=A[i];
j++;
}
}
return j;
}
6-3 统计大于等于平均分人数 (10 分)
int fun ( float *s, int n, float *aver ){
double sum=0;
int count=0;
for(int i=0;i<n;i++)
{
sum+=s[i];
*aver=sum/n;
}
for(int i=0;i<n;i++)
{
if(s[i]>*aver){
count++;
}
}
return count;
}
6-4 求出数组中最大数和次最大数 (10 分)
int fun ( int *a, int n ){
int i,j,k,m;
for(i=0;i<2;i++){
m=i;
for(j=i+1;j<n;j++)
if(a[j]>a[m])
m=j;
k=a[i];
a[i]=a[m];
a[m]=k;
}
}
6-5 数组去最值 (10 分)
int delMaxMin(int A[],int n){
int index_max=0,index_min=0;
int cnt=0;
for(int i=0;i<n;i++){
if(A[i]>=A[index_max]){
index_max=i;
}
if(A[i]<=A[index_min]){
index_min=i;
}
}
// printf("%d %d",index_max,index_min);
if(index_max<index_min){
for(int i=index_max+1;i<index_min;i++){
A[i-1]=A[i];
cnt++;
}
for(int i=index_min+1;i<n;i++){
A[i-2]=A[i];
cnt++;
}
}
if(index_max>index_min){
for(int i=index_min+1;i<index_max;i++){
A[i-1]=A[i];
cnt++;
}
for(int i=index_max+1;i<n;i++){
A[i-2]=A[i];
cnt++;
}
}
return cnt;
}
6-6 谁编程最厉害? (10 分)
int Max2(int d[],int n){
int i,j;
int a[]={-1};
for(i=0;i<n;i++){
if(d[i]%2==0)
{
a[i]=d[i];
}
}
int max=0;
for(j=0;j<n;j++){
if(a[j]>a[max]){
a[max]=a[j];
//printf("%d\n",a[max]);
}
}
return a[max];
}
6-7 利用指针找最大值 (10 分)
void findmax( int *px, int *py, int *pmax ){
*pmax=*py;
if(*px>*py)
*pmax=*px;
}
6-8 求最大值最小值 (10 分)
void maxmin(int arr[ ],int *pt1,int *pt2,int n){
*pt1=*pt2=arr[0];
for(int i=0;i<n;i++){
if(arr[i]>*pt1){
*pt1=arr[i];
}
if(arr[i]<*pt2){
*pt2=arr[i];
}
}
}
6-9 数组的最小最大值移位 (10 分)
void Maxmin(int d[],int n){
int imax=0,imin=0;
for(int i=0;i<n;i++){
if(d[i]>d[imax]){
imax=i;
}
if(d[i]<d[imin]){
imin=i;
}
}
if(imax==n-1&&imin>0){
swap(d,0,imin);
}
else if(imin==0&&imax<n-1){
swap(d,n-1,imax);
}
else if(imin>0&&imax<n-1){
swap(d,n-1,imax);
swap(d,0,imin);
}else if(imin==n-1&&imax==0){
swap(d,imin,imax);
}else if(imin==0&&imax==n-1){
return 0;
}
}
6-10 求方阵和 (10 分)
/*void createMatrix(int a[][N]){
int i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++){
scanf("%d",&a[i][j]);
}
}*/
int sumMatrix(int a[][N]){
int i,j;
int add=0;
int sum=0;
for(i=0;i<N;i++)
for(j=0;j<N;j++){
sum+=a[i][j];
}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
if(j==i||i==N-1||j==N-1){
add+=a[i][j];
}
}
}
add=sum-add;
return add;
}
6-13 高效查重 (10 分)
int fun(int n){
int b[n];
for(int i = 0;i<n;i++)
{
b[i]=0;
}
for(int i = 0;i<n;i++)
{
b[getDi(i)]++;
}
for(int i=0;i<n;i++){
if(b[i]>1)
return 1;
}
return 0;
}
6-14 摘桃几何 (10 分)
int fun ( int *nums,int N ){
int a[N];
int A,B;
a[0]=nums[0];
a[1]=(nums[0]>nums[1]?nums[0]:nums[1]);
for(int i=2;i<N;i++){
A=a[i-2]+nums[i];
B=a[i-1];
a[i]=(A>B?A:B);
}
return a[N-1];
}
6-15 有序数组唯一化 (10 分)
int fun (int *D,int N ){
int i,j,k;
for(i=0;i<N-1;i++){
for(j=i+1;j<N;j++){
if(D[i]==D[j]){
for(k=j;k<N-1;k++){
D[k]=D[k+1];
}
N--;
j--;
}
}
}
return N;
}
6-16 强者几何 (10 分)
int* fun(int *d,int N){
int *S=(int *)malloc(N*sizeof(int));
int a[101]={0};
for(int i=0;i<N;i++){
a[d[i]]++;
}
for(int i=0;i<N;i++){
int j=0,k=0;
for(int p=d[i]+1;p<101;p++){
j=a[p];
k+=j;
}
S[i]=k;
}
return S;
}
6-17 约瑟夫环之循环数组 (10 分)
if(i==n) i=0;
if(d[i]==1){
j++;
if((j%m)==0){
d[i]=0;
num[k]=i;
k++;
}
}
i++;
6-18 浇树几何 (10 分)
int fun(int *w,int N,int W){
int max=w[0];
int s=0;
int j=0,c=1;
for(int i=0;i<N;i++){
if(max<=W){
if(s<=i-j)
s=i+1-j;
if(i!=N-1)
max=max+w[i+1];
}
else{
max-=w[j++];
max+=w[i+1];
}
}
return s;
}
6-19 红包几何 (10 分)
int fun(int *d,int N,int k){
int c,sum=0;
for(int i=0;i<=k;i++){
c=0;
for(int j=0;j<k-i;j++){
c+=d[j];
}
for(int j=0;j<i;j++){
c+=d[N-1-j];
}
if(sum<c)
sum=c;
}
return sum;
}
6-20 赛程安排 (10 分)
int fun ( int *A,int N ){
int cnt=0;
for(int i=0;i<N;i=i+2){
if(A[i]/2!=A[i+1]/2){
for(int j=i+2;j<N;j++){
if(A[j]/2==A[i]/2){
int temp=A[j];
A[j]=A[i+1];
A[i+1]=temp;
cnt++;
break;
}
}
}
}
return cnt;
}
6-21 最短同度子序列 (10 分)
#define MAX_SIZE 50005
int fun (int *nums,int numsSize ){
int first[MAX_SIZE]={0};
int last[MAX_SIZE]={0};
int dig[MAX_SIZE]={0};
int maxDig=0;
int minLen=numsSize;
for(int i=0;i<numsSize;i++){
dig[nums[i]]++;
maxDig=maxDig>dig[nums[i]]?maxDig:dig[nums[i]];
last[nums[i]]=i+1;
if(!first[nums[i]]){
first[nums[i]]=i+1;
}
}
for(int i=0;i<numsSize;i++){
if(dig[nums[i]]==maxDig){
minLen=minLen<(last[nums[i]]-first[nums[i]])?minLen:(last[nums[i]]-first[nums[i]]);
}
}
return minLen+1;
}
6-24 滑动窗口最大值 (10 分)
int* fun(int *nums, int numsSize, int k, int* returnSize){
int q[numsSize];
int left = 0, right = 0;
for (int i = 0; i < k; ++i) {
while (left < right && nums[i] >= nums[q[right - 1]]) {
right--;
}
q[right++] = i;
}
*returnSize = 0;
int* ans = malloc(sizeof(int) * (numsSize - k + 1));
ans[(*returnSize)++] = nums[q[left]];
for (int i = k; i < numsSize; ++i) {
while (left < right && nums[i] >= nums[q[right - 1]]) {
right--;
}
q[right++] = i;
while (q[left] <= i - k) {
left++;
}
ans[(*returnSize)++] = nums[q[left]];
}
return ans;
}
6-26 矩阵就地旋转 (10 分)
void fun(int **Mat, int N){
for(int i=0;i<N;i++){
for(int j=i;j<N;j++){
int temp=Mat[j][i];
Mat[j][i]=Mat[i][j];
Mat[i][j]=temp;
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N/2;j++){
int temp=Mat[i][j];
Mat[i][j]=Mat[i][N-j-1];
Mat[i][N-j-1]=temp;
}
}
}
6-27 数组指针与二维数组的关系 (10 分)
void reOut(int (*p)[3]){
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("%3d",p[i][j]);
}
printf("\n");
}
for(int i=0;i<3;i++){
for(int j=0;j<2;j++){
printf("%3d",p[j][i]);
}
printf("\n");
}
}
6-32 高效查单I (10 分)
int Fun(int n){
int j=0;
for(int i=0;i<n;i++){
j^=getDi(i);
}
return j;
}
字符串函数题
6-1 字符串拷贝 (10 分)
int length=0;
int i=0;
while(str2[i]!='\0'){
length++;
i++;
}
if(length>x){
for(int i=0;i<x-1;i++){
str1[i]=str2[i];
}
str1[i]='\0';
return 0;
}else{
for(int i=0;i<length;i++){
str1[i]=str2[i];
}
str1[i]='\0';
return 1;
}
6-2 字符串逆置* (10 分)
char* StrReverse(char *str){
char temp;
int i;
int length=strlen(str);
for(i=0;i<length/2;i++){
temp=str[i];
str[i]=str[length-1-i];
str[length-1-i]=temp;
}
return str;
}
6-3 字符串 - 2. 字符串复制(赋值) (10 分)
char* StrCpy(char *dst, const char *src){
int i;
for(i=0;src[i]!='\0';i++){
dst[i]=src[i];
}
dst[i]='\0';
return dst;
}
6-4 strcmp (10 分)
int mycmp( const char* s1, const char* s2 ){
//assert(s1&&s2);
while(*s1==*s2){
if(*s1=='\0')
return 0;
s1++;
s2++;
}
return *s1-*s2;
}
6-6 复制部分字符串 (10 分)
void strcopy(char *str1,char *str2,int m){
int i;
int j=0;
for(i=m-1;str1[i]!='\0';i++){
str2[j]=str1[i];
j++;
}
str2[i]='\0';
}
6-7 删除字符串中数字字符 (10 分)
void delnum(char *s){
int j=0;
int i=0;
while(s[i]!='\0'){
if(s[i]>'9'||s[i]<'0'){
s[j++]=s[i];
}
i++;
}
s[j]='\0';
}
6-8 strlen (10 分)
int mylen( const char *s ){
int length=0;
for(int i=0;s[i]!='\0';i++){
length++;
}
return length;
}
6-9 输入多个单词,统计以指定字母开头的单词个数 (10 分)
int getWordNum(char ar1[], char ch) {
int cnt=0;
int i;
if(ar1[0]==ch||ar1[0]==ch+32||ar1[0]==ch-32){
cnt=1;
}
for(i=1;ar1[i]!='\0';i++){
if((ar1[i]==ch||ar1[i]==ch+32||ar1[i]==ch-32)&&ar1[i-1]==' ')//i-1看不懂??
cnt++;
}
return cnt;
}
6-10 分类统计字符个数 (15 分)
void StringCount( char s[] ){
int length=0;
for(int k=0;s[k]!='\0';k++){
length++;
}
int i,letter=0,blank=0,digit=0,other=0;
for(i=0;i<length;i++){
if((s[i]>='A'&&s[i]<='Z')||(s[i]>='a'&&s[i]<='z')){
letter++;
}
else if(s[i]>='0'&&s[i]<='9'){
digit++;
}
else if(s[i]==' '||s[i]=='\n'){
blank++;
}else{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
}
6-11 移动字母 (10 分)
void Shift( char s[] ){
char str[3];
int i,j;
for(i=0;i<3;i++){
str[i]=s[i];
}
for(i=3;s[i]!=0;i++){
s[i-3]=s[i];
}
j=i-3;
for(i=0;i<3;i++){
s[j++]=str[i];
}
}