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;
}