C언어 함수구현 문제1

성민개발로그·2021년 7월 7일
0

C언어

목록 보기
3/9
post-thumbnail

문제1

字符串连接

请使用字符数组,编写自己的字符串插入函数mystrins()。假设输入的两个字符串的长度都不大于50 ,功能是若m小于0,则在字符串str1的首字符之前插入字符串str2;若m大于字符串str1的长度,则在字符串str1的尾字符之后插入字符串str2;其他情况,在字符串str1的第m个字符的位置插入字符串str2。 形成新的字符串。
编写主程序,功能是能够由键盘输入两个字符串和一个整数,并能调用自己编写的字符串插入函数,输出新的字符串。

#include <stdio.h> 
void mystrins(char *str1,char *str2,int m);
int main(void)
{
	int m;
	char str1[50], str2[50] = { 0 }, str3[100] = { 0 };
	printf("input m:");
	scanf_s("%d", &m);
	fflush(stdin);//개행문자를 버리기위한 함수사용
	printf("input str1:");
	scanf_s("%s", str1,sizeof(str1));
	fflush(stdin);
	printf("input str2:");
	scanf_s("%s", str2,sizeof(str2));
	 
	mystrins(str1, str2, m, str3);
	printf("%s", str3);
	
	return 0;
}
void mystrins(char *str1, char *str2, int m,char *str3) {
	int l1, l2;
	l1 = strlen(str1);
	l2 = strlen(str2);
	if (m < 0) {
		for (int i = 0; i < l1 + l2; i++) {
			if (i < l2)str3[i] = str2[i];
			else str3[i] = str1[i - l2];
		}
	}
	else if (m > l1) {
		for (int i = 0; i < l1 + l2; i++) {
			if (i < l1)str3[i] = str1[i];
			else str3[i] = str2[i - l1];
		}
	}
	else {
		for (int i = 0; i < m; i++) str3[i] = str1[i];
		for (int j = 0; j < l2; j++) str3[j + m] = str2[j];
		for (int k = m; k < l1; k++) str3[k + l2] = str1[k];
	}
}

문제2

角夫猜想

日本数学家角夫提出了如下的猜想: 任意一个自然数,比如奇数,将其乘以3再加1;如果是偶数将其除以2;反复运算。请大家编写程序,看会出现什么结果?
编写程序功能要求能够不停的输入自然数,遇到输入自然数0时,程序结束。如
输入: 请输入自然数n:30
输出: 自然数n按照角夫猜想运算规则变化的各次结果:15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 。。。。。。(直到结果收敛,不再变化)

#include<stdio.h>

int f(int n){
                while(n!=1){
                if(n%2==0)n=n/2;
                else n=n*3+1;
                printf("%d ",n);
        }

        return 0;
}
int main(void){
        int n;
        while(n!=0){
                scanf("%d",&n);
                if(n!=0) f(n);
        }
        return 0;

}

문제3

数学黑洞

任意一个4位自然数(除4个数字完全一样除外,例如4444、7777等),将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍然为一个自然数,重复上述运算,你会发现一个神秘数。
编写程序功能要求能够不停的输入自然数,遇到输入0时,程序结束。如
输入: 请输入自然数n: 7754
输出: 自然数n按照以上运算规则变化的各次规律:(7754,4577,3177) (7731,1377,6534)(6543,3456,3087) (8730,0378,8352) (8532,2358,6174)。。。。。(直到结果收敛,不再变化)

#include<stdio.h>
#include<math.h>
int max_min(int x) {
    int max = 1, min = 0;
    int flag = 1;
    while (flag) {
        max = 0, min = 0;
        
        int arr[10] = { 0 };
        int arr1[10] = { 0 };
        arr[x / 1000]++;
        arr[x / 100 % 10]++;
        arr[x / 10 % 10]++;
        arr[x % 10]++;
        int k = 0, m = 3;
        for (int i = 0; i < 10; i++) {
            if (arr[i] != 0) {
                for (int j = arr[i]; j > 0; j--) {
                    max = max + i * pow(10, k);
                    min = min + i * pow(10, m);
                    m--;
                    k++;
                }
            }
        }
        x = max - min;
        arr1[x / 1000]++;
        arr1[x / 100 % 10]++;
        arr1[x / 10 % 10]++;
        arr1[x % 10]++;
        for (int i = 0; i < 10; i++) {
            if (arr[i] != arr1[i])break;
            if (i == 9)flag = 0;
        }
        if (min > 1000) printf("(%d %d %d)  ", max, min, x);
        else if (min < 1000)  printf("(%d 0%d %d)  ", max, min, x);

    }

}
int main(void) {
    int n;
    while (1) {
        printf("input n:");
        scanf_s("%d", &n);
        if (n == 0)break;
        max_min(n);
    }
}

문제4

勒让德多项式

用递归思想求n阶勒让德多项式的值,该多项式为:

여기부턴 재귀함수 구현이다
코드:

#include<stdio.h>

double p(double x,int n){
        double answer;
        if(n==0) answer=1;
        else if(n==1) answer =x;
        else{
        answer=((2*n-1)*x*p(x,n-1)-(n-1)*p(x,n-2))/2;
        }
        return answer;

}
int main(void){
        double answer;
        double x=5.0;
        int n=6;
        answer = p(x,n);
        printf("answer=%.5f",answer);
        return 0;
}

문제5

设计递归程序

任意给定输入的一个小写英文字符串a1a2a3…an-1an (n≥5)
输出:字符串Ana1An-1a2An-2a3…A2an-1A1an,其中Ai为ai的大写形式
例如,输入aybdx,则递归程序输出XaDyBbYdAx

#include<stdio.h>
#include<string.h>
int f(char *s ,int l, int n){
        if(n==0) return 0;
        else{
                printf("%c%c",s[n-1]-32,s[l-n]);
                f(s,l,n-1);
        }

}
int main(void){
        char s[20];
        printf("input string:");
        fgets(s,20,stdin);// fgets사용법을 좀더 숙지 해볼 필요가 있다고 생각한다 
        int l;
        l=strlen(s);
        f(s,l-1,l-1);
        return 0;
}

문제6

子串查找

编写一个函数,计算一个子串在主串中首次出现的位置,以及出现的次数,并设法传回上述两值。如果子串没有在主串中出现,则返回-1和0。
编写主程序,输入两个字符串,调用自己编写的子串查找函数,在主程序中输出子串在主串中首次出现的位置和出现的次数。

#include<stdio.h>
#include<string.h>
int str_f(char* s1, char* s2, int  sp, int sc) {
    int l1, l2;
    l1 = strlen(s1);
    l2 = strlen(s2);
    for (int i = 0; i < l2 - 1; i++) {
        if (s1[0] == s2[i]) {
            int t = 1;
            for (int j = 1; j < l1 - 1; j++) {
                if (s1[j] != s2[i + j])break;
                t++;
                if (t == l1 - 1) {
                    if (sc == 0) {
                        sp = i;
                        sc++;
                        i = i + t;
                    }
                    else {
                        sc++;
                        i = i + t;
                    }
                }
            }
        }
    }
    printf("start point:%d count:%d", sp, sc);
    return 0;
}

int main(void) {
    char s1[10];
    char s2[100];
    int sp = -1, sc = 0;
    printf("input s1:");
    fgets(s1, 10, stdin);
    fflush(stdin);
    printf("input s2:");
    fgets(s2, 100, stdin);
    fflush(stdin);
    str_f(s1, s2, sp, sc);
    
    return 0;

}

결과:

0개의 댓글