OUC复试---C程序设计---日更

1.给定程序中,函数 void fun(char *s)的功能是:把形参 s 所指字符串中下标为偶数的字符右移到下一个偶数位置,最右边被移出字符串的字符绕回放到第一个偶数位置,下标为奇数的字符不动(注:字符串的长度大于等于 2)。例:若输入:abcd123,输出:3badc21

#include <stdio.h>
#include <string.h>
void fun(char* s){
	int len = strlen(s);
	//初始化控制循环的i
	int i = 0;
	//tmp保存下一个要赋值的字符
	char tmp; 
	if (len < 2){
		return ;
	}
	//给tmp赋初值
	tmp = s[0];
	//,
	for(i ; i+2 < len ; ){
		//tmp1每次拿到tmp2的值
		char tmp1 = tmp;
		//tmp拿下一次要交换的值
		tmp = s[i+2];
		//用tmp1拿到的值覆盖下一次要交换的值
		s[i+2] = tmp1;
		//i移动两步
		i +=2;
	}
	s[0] = tmp;
}
int main(){
	char str1[] = "abcd123";
	char str2[] = "abcd12";
	fun(str1);
	printf("%s\n",str1);
	return 0;
}

2.编写函数 long fun(int high,int n),功能是:计算并返回 high 以内(不包含high)最大的 n 个素数之和。若不足 n 个,则到最小素数 2 为止。例如:若high=100,n=10,则函数的返回值为:732;若 high=11,n=10,则函数返回:17。

#include <stdio.h>
#include <math.h>
# define N 1000
long fun(int high,int n){
	//i是开始循环的第一个数,m是记录数组的长度,j是控制某个数的二层循环
	int i =2, m=0,j;
	int arr[N];
	//sum是总和
	int sum = 0;
	for(i ; i < high ; i++){
		//拿到每个数的开方
		int sq = (int)sqrt(i);
		//记录是否为素数0为是,1不是
		int flag =0;
		for(j =2 ; j<=sq; j++){
			if(i%j == 0){
				flag= 1;
			}
		}
		//为0的时候就记录到数组里
		if (!flag){
			arr[m++] = i;
		}
	}
	//if如果真实数组的大小m能提供n个数
	//else if如果真实数组的大小m不能能提供n个数
	if (m >= n){
		 //从最后一个数开始往前打印。此时的m为个数,因为在上面循环中使用的是m++;
		for(i = 1; i <= n;i++){
			printf("%d\n",arr[m-i]);
			sum =sum+arr[m-i];
		}
	}else if(m < n){
	//从数组第一个数开始打印,打印m个
		for(i = 0;i<m;i++){
			printf("%d\n",arr[i]);
			sum =sum + arr[i];
		}
	}
	return sum;
}

int main(){
	int sum = (int)fun(11,10);
	printf("%d",sum);
	return 0 ;
}

约瑟夫环

//未完成。
#include <stdio.h>
#define N 1000
typedef struct YueSe{
	struct YueSe* next;	
	int num;
}YueSe;
int fun(int n,int *p){
	int arrNum =0;
	int count = n;
	int i =2 ;
	YueSe* first = {first,1};
//first->next = first;
//	first->num = 1;
	YueSe* p = new YueSe;
	for(i ;i<n+1;i++){
		YueSe* tmp = new YueSe{p->next,i};
		p->next = tmp;
		p = tmp;
	}
	YueSe* pre = first;
	YueSe* last = pre->next;

	while(count >1){
		YueSe* deletP = last->next;
		pre = last;
		last = deletP->next;
		p[arrNum] = deletP->num;
		count--;
		arrNum++;
	}
	return pre ->num;
}



int main(){

	
	
	return 0;
}

4求一元二次方程ax2+bx+c的解。要求考虑所有的情况。

//c++
#include <iostream>
#include <math.h>
using namespace std;
double* getX(double a,double b, double c){
	double cur = b*b-4*a*c;
	double arr[2];
	if(cur<0){
		return 0;
	}
	double x1 = (-b + sqrt(cur)) / (2*a);
	double x2 = (-b - sqrt(cur)) / (2*a);
	arr[0] = x1;
	arr[1] = x2;
	return arr;
}
int main(){
	double* x = getX(1,2,3); 
	if(x == NULL){
	cout<<"是一个复数"<<endl;
	return 0;
	}
		if (x[0] == x[1]){
			cout<<x[0]<<endl;
	}else{
			cout<< x[0]<<" "<< x[1]<<endl;
	}


	return 0;
}
}

5.字符串匹配定位
编写函数 int locStr(char *str1 ,char *str2)实现字符串匹配的定位功能;若字符串 str1 中 含有字符串 str2,则返回字符串 str2 在字符串 str1 中的位置,否则返回-1;

int locStr(char* firstStr,char* secondStr){
    if (strlen(firstStr)<strlen(secondStr)) {
        return -1;
    }
    for(int i = 0 ; i < strlen(firstStr);i++){
        int j =0 ;
        for (; j < strlen(secondStr); j++) {
            if (firstStr[i+j]!=secondStr[j]) {
                break;
            }
        }
        if (j == strlen(secondStr)) {
            return 1;
        }
    }
    return -1;
}

int main(){

    char a[] = "nihaoadasdasdas";
    char b[] = "woshiyigehaorena";
    char c[] = "nihaoa";
    cout<<locStr(a, b)<<endl;
    cout<<locStr(a, c)<<endl;
    
    return 0;
}


//兄弟数
#include <iostream>
#include <math.h>
using namespace std;
int main(){
    //a为小数  b为大数
    int a;int b;
    cin >>a>>b;
    //m为弟,n为兄数
    int m = b+1;int n =b+1;
    for (int i = a; i<b; i++) {
        if (i > (a+b)/2) {
            break;
        }
        for (int j=i+1 ; j<=b; j++) {
            if (i+j > m+n) {
                break;
            }
            if(i*j%(i+j) == 0){
                if (i+j == m+n) {
                    if (i<m) {
                        m = i;
                        n = j;
                    }
                }
                if (i+j < m+n) {
                    m =i;
                    n= j;
                }
            }
        }
    }
    cout<<"兄数为:" <<int(n)<<"弟数为:"<<int(m);
}
//打印斐波那契数列
#include <iostream>
#include <math.h>
using namespace std;
int main(){
    int a =1,b =1;
    int k;
    cin>>k;
    if (k == 1 ) {
        cout<<1<<" ";
    }
    else{
        cout<<1<<" "<<1<<" ";
        for (int i=0; i<k-2; i++) {
            int  cur = a+b;
            a= b;
            b= cur;
            cout<<b<<" ";
        }
    }
}
//小于n 阶乘的和
#include <iostream>
#include <math.h>
using namespace std;
int main(){
    int n;
    int sum =0;
    cin >>n;
    for (int i=1; i<=n; i++) {
        int curSum = 1;
        for (int j =i; j>=1; j--) {
            curSum *= j;
        }
        sum += curSum;
        cout<< sum << endl;
    }
    cout<< sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值