红皮书2-5代码

第二章------基础练习

1,求100-200以内的素数和

#include<stdio.h>
int main(){
    int x=100;
    while(x<200){
        int i,isPrime=1;
        for(i=2;i<x;i++){
             if(x%i==0){
                isPrime = 0;
                break;
            }
        }
        if(isPrime==1){
            printf("%4d", x);
        }
        x++;
    }
}
//函数实现100-200的素数
#include<stdio.h>
#include<math.h>
int happy(int n){
    int i;
    for (i = 2; i < n;i++){
        if(n%i==0)
            return 0;
    }
    return 1;
    }
int main(){
    int happy(int n);
    int  i;
    for (i =100; i <200;i++){
        if(happy(i)){
            printf("%4d",i);
        }
    }
}

2,对输入的正整数,求它的约数和

#include<stdio.h>
int main(){
    int i,j;//用于保存正整数
    scanf("%d", &i);
    int sum = 0;
    for (j = 1; j <=i;j++){
        if(i%j==0)
            sum += j;
    }
    printf("%d", sum);
}

3,输出1000以内所有完数,格式为%d its factors are a,b,c;

(完数:整数=它的因子数之和,6=1+2+3)

#include<stdio.h>
int main(){
    int n=1,i;
    int sum=0;
    int count = 0;
    int factor[100];
    while(n<1000){
        int sum = 0,count=0;
        for (i = 1; i <= (n / 2); i++)
        {
            if(n%i==0){
                sum += i;
                factor[count++] = i;
            }
        }
    if(sum==n){
            printf("%d its factors are ",n);
            for (i = 0; i < count;i++)
                printf("%d," ,factor[i]);
            printf("\n");
    }
    n++;
}
}

4,将一个正整数分解质因数

(例如:90=2*3*3*5)

#include<stdio.h>
int main(){
    int i,n;
    printf("输入整数为:");
    scanf("%d", &n);
    for (i = 2; i < n;i++){
        while(n%i==0){
            printf("%d", i);
            n /= i;
            printf("*");
        }
    }
    printf("%d\n", n);
}

5,计算n是否为完全平方数

(完全平方数:一个整数=另一个整数的平方)

#include<stdio.h>
#include<math.h>
int isSquare(int n){
    int i;
    if(n==1||n==0)
        return 1;
    i = sqrt(n);
    if(i*i==n)
        return 1;
    else
        return 0;
}
int main(){
    int n;
    scanf("%d", &n);
    if(isSquare(n)!=0)
        printf("%d是平方数", n);
}

6,输出三位整数中,既是完全平方数,又有两位数字相同的数

#include<stdio.h>
#include<math.h>
int isSquare(int n){
    int i;
    if(n==1||n==0)
        return 1;
    i = sqrt(n);
    if(i*i==n)
        return 1;
    else
        return 0;
}
int main(){
    int a, b, c;
    int num = 1;
    while(num<1000){
        if(isSquare(num)){
            a = num % 10;
            b = (num %100) /10;
            c = num / 100;
                if(a==b||b==c||c==a){
                    printf("%4d", num);
            }
        }
            num++;
    }
}

7,输出符合条件的整数:

加上100是完全平方数,加上168仍为完全平方数


#include<math.h>
int isSquare(int n){
    int i;
    if(n==1||n==0)
        return 1;
    i = sqrt(n);
    if(i*i==n)
        return 1;
    else
        return 0;
}
int main(){
    int num = 1;//默认是10000以内,可自行输入
    while(num<9999){
        if(isSquare(num+100)&&(isSquare(num+168))){
                printf("%4d", num);
            }
        num++;
        }      
}

8,M是任一整数,求立方小于m的最大整数,egM=10,2*2*2=8<10;

#include<stdio.h>
int main(){
    int m, i=1;
    scanf("%d", &m);
    while(i *i *i < m){
        i++;
    }
    printf("%d", --i);
}

9,函数实现任意两值的最大公约数(辗转相除)

#include<stdio.h>
int Prime(int a,int b){
    int temp;//交换数值
    while(b!=0){
        temp = a % b;
        a = b;
        b = temp;
    }
    if(a==1)
        return 1;
    else
        return 0;
}
int main(){
    int a,b,n;
    scanf("%d,%d", &a, &b);
    n = Prime(a, b);
    if(n==1){
        printf("两数互为质数");}
}

10,输出前20组的素数对(或者100以内的素数对)

#include<stdio.h>
#include<math.h>
int isprime(int n){
    if(n==1||n==0)//判边值
        return 0;
    for (int i = 2; i < sqrt(n);i++){
        if(n%i==0)
            return 0;
        return 1;
    }
}
int main(){
    int num = 3;
    int count = 20;
    while(count){
        if(isprime(num)&&isprime(num+2)){
            printf("(%d,%d)", num, num + 2);
            count--;
        }
        num+=2;
    }
}

11.5,给出年月日计算时第几天

//忘了借鉴的哪位大佬,
#include<stdio.h>
int isleap(int year){
    if((year%4==0&&year%100==0)||year%400!=0){//判平年闰年
        return 1;    
    }else{
        return 0;    
    }
}
int main(){
    int year,month,day,count=0,i;
    int month1[13]={0,31,28,31,30,31,31,30,31,31,30,31};//设数组表示天数
    scanf("%d,%d,%d",&year,&month,&day);
    if(isleap(year)){
        month1[2]+=1;
    }
    for(i=1;i<month;i++){
        count+=month1[i];
        count+=day;//计算是该年的第几天
        printf("%d",count);
    }
}

12,实现复数加法和复数运算

#include<stdio.h>
int main(){
    int  a1,b1,a2,b2,p,q,e,f; //p记录实数,q记录复数部
	printf("请输入复数:");
	scanf("%d,%d,%d,%d",&a1,&b1,&a2,&b2);
	p=a1+a2;//加法 
	q=b1+b2;
	e=a1*a2-b1*b2;//乘法 
	f=a1*b2+a2*b1;
	printf("相加得%d+%di\n",p,q);
	printf("相乘得%d+%di\n",e,f); 
	return 0;
}

 13,有1,2,3,4四位数字,能组成多少个互不相同且无重复的三位数?(几位数就几层for,我觉得嵌套太多了……不过水平很垃圾目前没想好如何优化)

#include<stdio.h>
int main(){
    int i, j, k,count=0; // count用于统计个数
    printf("\n");
    for (i = 1; i < 5;i++){
        for (j = 1; j < 5;j++){
            for (k = 1; k < 5;k++){
                if (i != k&&i!=j&&j!=k){
                    printf("%d%d%d  ", i, j, k);
                    count++;
                }
            }
        }
    }
    printf("%d", count);
}

14,函数实现三个整数xyz由小到大输出

//三个数字由小到大输出---用函数比较快
#include<stdio.h>
void sort(int *a, int l){
    int i,v;//v用于交换
    for (i = 0; i < l - 1; i++){//l-1
            if (a[i] > a[i+1]){
                v = a[i];
                a[i] = a[i+1];
                a[i+1] = v;
            }
        }
}
int main(){
    int a[3],i;
    printf("请输入三个整数:");
    for (i = 0; i < 3; i++){
        scanf("%d", &a[i]);
    }
    sort(a, 3);
    for (i = 0; i < 3;i++)
        printf("%d", a[i]);
}

15,输出9*9乘法口诀

#include<stdio.h>
int main(){
    int i, j;
    for (i = 1; i <9;i++){
        for (j = 1; j < i;j++){
            printf("%d*%d=%d ", i, j, i * j);
        }
        printf("\n");
    }
}

16,输出1!+2!+3!……20!的和(注意数值范围)

#include<stdio.h>
int main(){
    int i;
    double sum=0,max=1;
    for (i = 1; i <= 20;i++){
        max *= i;
        sum += max;
    }
    printf("%.2f ", sum);
}

17,判断两个数是否友好(也就是亲密数,判a的约数和是否等于b的约数和,不包括数字本身)

#include <stdio.h>
int QMS(int x)
{
    int fact= 1;
    for (int i = 2; i < x; i++){
        if (x%i == 0){
            fact += i;
        }
    }
    return fact;
}
int main()
{
    int m = 0,n = 0;
    printf("Input m, n:\n");
    scanf("%d,%d",&m,&n);
    if (QMS(m) == n&&QMS(n) == m)
    {
        printf("是亲密数\n");
    }else{
        printf("不是亲密数\n");
    }
}

18,(输出指定范围内的亲密数——摘自明天再学习博主)

#include<stdio.h>
int main()
{
	int i,j,n;
	scanf("%d",&n);
	for(i=1;i<n;i++){
		int sum1=0,sum2=0;
		for(j=1;j<i;j++){
			if(i%j==0)
				sum1+=j;
		}
		for(j=1;j<sum1;j++){
			if(sum1%j==0)
				sum2+=j;
			}
		if(sum1<i&&sum2==i)
			printf("%d<__>%d\n",sum1,i);
	}
}
第三章------拆数问题

1,输出所有水仙花数,以三位数为例(水仙花数:其各位数字的立方和等于该数本身)

#include<stdio.h>
int main(){
    int i = 100;
    int a, b, c;
    for (i = 100; i < 1000;i++){
        a = i % 10;
        b = (i / 10) % 10;
        c = i / 100;
        if(a*a*a+b*b*b+c*c*c==i)
            printf("%4d", i);
    }
}

2,输入正整数N,N=r1*r2*r3……rn,计算r1!+r2!+r3!……rn!(r1=百位,以此类推,个人感觉改成求构成该数因子的阶乘比较有意思,比如90=2*3*3*5,求2,2,3,5的阶乘)

#include<stdio.h>
int jc(int x){
	int data=1,i=1;
    for (i = 1; i <= x;i++){
        data=data*i;//累乘
    }
    if (x>=1)//判1
        return data;
    else
        return 0;
}
int main(){
	int sum=0,num,k;
	scanf("%d",&num);
	while(num!=0){
		k=num%10;
        sum+=jc(k);
		num=num/10;
	}
    printf("计算结果为%d", sum);
    return 0;
} 

3,判断输入正整数的位数(eg:13输出为2,3044输出为4,函数也比较好实现)

#include<stdio.h>
int main(){
    int num, count = 0;
    scanf("%d", &num);
    while(num!=0){
        num = num / 10;
        count += 1;
    }
    printf("%d", count);
}

4,//计算Sn=a+aa+aaa+aaaa+aaaaa,n表示a的位数,a是一个数字

(注意这里不是计算从1到n个a连乘的和)

#include<stdio.h>
int main(){
    int num, sum = 0,i=1,s=0;//num做记录基本数字
    int n;//输入n的个数
    scanf("%d%d", &num,&n);
    for (i = 1; i <= n;i++){
        s = s + num;
        sum += s;
        num = num * 10;
    }
    printf("%d", sum);
}

5,将整数m的各位保存到数组A中(这个题给出的算法思路看的我有点迷糊,故根据自己理解结合大神代码做了新的解释)

#include<stdio.h>
int recursion(int* arr, int num) {
	//判定递归的尾部,返回0到上一层,正好赋arr[0]的值
	if (num == 0) 
        return 0;
	int index = recursion(arr, num / 10) ;
	arr[index] = num % 10;//赋当前num值的个位数
	return index+1;
}
int main() {
	int num;
    scanf("%d", &num);
    int arr[10] = {0};
	int len = recursion(arr, num);//返回的值刚好是num的长度
	for (int i = 0; i < len; i++) {//遍历这个数组。
		printf("%d ", arr[i]);
	}
	return 0;
}

6,输入正整数,输出该数各个位数的和(原答案有数组,感觉有些多余)

#include<stdio.h>
int main(){
    int num;
    scanf("%d", &num);
    int sum=0;
    while(num!=0){
        sum += num % 10;
        num = num / 10;
    }
    printf("%d", sum);
}

7,判断给定整数是否由1、3、7、9组成

#include<stdio.h>
int main(){
    int m, n, flag = 1;//flag做判定条件
    scanf("%d", &n);
    while(n!=0){
        m = n % 10;
        n /= 10;
        if(!(m==1||m==3||m==7||m==9)){
            flag = 0;
            break;
        }
    }    
    if(flag)
        printf("YES!");
    else
        printf("No");
}

8,输出一个数的反序数(个位是百位,百位是各位)

#include<stdio.h>
int main(){
    int num;
    int n,sum=0;
    scanf("%d", &num);
    while(num!=0){
        n = num % 10;
        num /= 10;
        sum = sum * 10 + n;
    }
    printf("%d", sum);
}

9,字符串逆序,将字符串abc反转为cba(两个指针会更快)

#include<stdio.h>
#include<string.h>
void reverse(char* s, int sSize){
	int start = 0;
	int end = sSize - 1; 
	char t = 0; //中间变量用做交换
	if(sSize == 0 || sSize == 1)// 判断字符串长度如果是0或1,则反转后的字符串为本身
		s = s;
	// 字符串对调
	while(start < end){
		t = s[start];
		s[start] = s[end];
		s[end]   = t;	
		++start;
		--end;
	}	
	printf("反转后的字符串为:%s\r\n", s);
}
int main()
{
	int len = 0;
	char s[10] = {0};
	printf("请输入字符串:");
    gets(s);
    //scanf("%s", s);
	len = strlen(s);
	//printf("字符串为:%s, 字符串长度为%d\r\n", s, len);
	reverse(s, len);
	return 0;
}

10,判断一个数是否为回文数(回文数也称逆序数,形如12321,13431,个位与最高位同,以此类推,感觉用累加的方式相比挨个取值要快。)

#include<stdio.h>
int main(){
    int num,m,n;
    int sum=0;
    scanf("%d", &num);
    n=num;
    while(num!=0){
        m = num % 10;
        num /= 10;
        sum = sum * 10 + m;
    }
    if(sum==n)
        printf("是回文数");
    else
        printf("不是回文数");
}

11,整数文法定义

#include<stdio.h>
int main(){
    int i, N = 0;
    char str[100];
    scanf("%s", str);
    for (i = 0; str[i] != '\0';i++){
        if(str[i]>='0'&&str[i]<='9'){
            N = str[i] - '0' + N * 10;
        }else{
            printf("error\n");
            break;
        }
    }
    if(str[i]=='\0')
        printf("%d\n", N);
    return 0;
}

12,算法,对两个正整数输入,求结果(123*45=1*4+1*5+2*4+2*5+2*4+3*5=54),分别相乘

(debug和run出结果不一致,目前没发现问题在哪。)

int main(){
    int a, b, sum;
    int len1=0,len2=0;
    printf("请输入两整数:");
    scanf("%d,%d", &a,&b);
    int num1[10] = {0};
    int num2[10] = {0};
    while(a!=0){
        num1[len1++] = a % 10;
        a /= 10;
    }
    while(b!=0){
        num2[len2++] = b % 10;
        b /= 10;
    }
    for (int i = 0; i < len1;i++)
        for (int j = 0; j <len2;j++){
            sum += num1[i] * num2[j];
        }
    printf("%d", sum);
}

13,给数字加密,输入四位数,每位数字分别+5,在用/10的余数代替,交换14,23位置的数字,输出极为加密后的数据

注意边界值!!

#include<stdio.h>
void exchange(int *a, int *b){
    int t;
     t = *a;
    *a = *b;
    *b = t;
}
int main(){
    int a[4], n, i;
    scanf("%d", &n);
    while(n<1000||n>9999){
        printf("该数不合要求,请重新输入:\n");
        scanf("%d",&n);
        continue;
    }
    for (i = 0; i < 4;i++){
        a[i] = ((n % 10) + 5) % 10;
        n = n / 10;
    }
    exchange(&a[0], &a[3]);
    exchange(&a[1], &a[2]);
    for (i = 3; i >=0;i--){
        printf("%d", a[i]);
    }
}

14,对于自然数,是偶数则除2,是奇数则*3+1,有限次运算后可得到1,计算运算次数

(书上例题是输入22,step=16,我个人运行是15)

int main(){
    int a, step=0;
    scanf("%d", &a);
    while(a!=1){
        if(a%2==0){
            a /= 2;
            step++;
        }else{
            a = a * 3 + 1;
            step++;
        }
    }
    printf("%d", step);
}
第四章-----数据集合与进制

1,集合M定义如下,整数1属于M,如果n属于M,则y=2*n+1;z=3*n+1也属于M,再没有别的数属于M。有点懵逼

#include<stdio.h>
int a[200];
void insert(int k){
    int i;
    for (i = 0; i < 200;i++)//集合有这个元素,直接返回
        if(a[i]==k)
            return;
    for (i = 199; i >= 0;i--){//往后挨个对比
        if(a[i]==0)
            continue;
        if(k<a[i])
            a[i + 1] = a[i];//数组元素后移
        else{
            a[i + 1] = k;//插入
            return;
        }
    }
}
int main(){
    int count = 0, i, y, z,n;
    a[0] = 1;
    for (i = 0; i < 200;i++){
        n = a[i];
        printf("%4d", a[i]);
        count++;
        y = 2 * n + 1;
        z = 3 * n + 1;
        insert(y);
        insert(z);
        if(count==100)
            break;
    }
    return 0;
}

2,对任意输出的整数n,打印出集合{0,1,……n-1}的子集

代码摘自UUTK(http://t.csdn.cn/xB0vd

#include<stdio.h>
#include<math.h>
int main(){
	int n;
	printf("请输入n的值:"); 
    scanf("%d",&n); 
    int m=pow(2,n);
    for(int i=0;i<m;i++){
	    int B[n];
	    int t=0;
	    int tmp=i;//转二进制 
		while (tmp != 0){
	        B[t] = tmp % 2;
	        t++;   
	        tmp/= 2;
    }
	    printf("{");
	    int flag=0; //flag用来控制逗号的输出 
	    for(int j=0;j<n;j++){
		   if(B[j]==1){
		   	if(flag==0){
			   	printf("%d",j);
			   	flag=1;
			}else{
				printf(",%d",j);
			} 
		   }
		}
        printf("} ");
    }
	return 0;
}

3,16进制转10进制

#include<stdio.h>
#include<string.h>
#define N 10
int fun(char array[]){
    int i, sum = 0;
    for (i = 0; i < strlen(array);i++){
        if(array[i]>='0'&&array[i]<='9')
            sum = sum * 16 + array[i] - '0';
        else if(array[i]>='A'&&array[i]<='F')
            sum = sum * 16 + array[i] - 'A' + 10;
        else if(array[i]>='a'&&array[i]<='f')
            sum = sum * 16 + array[i] - 'a' + 10;//16进制不区分abc大小写,判小写
        else
            break;
    }
    return sum;
}
int main(){
    char array[N];
    gets(array);
    printf("%d", fun(array));//调用函数
    return 0;
}

4,十进制转二进制输出(书上代码会多一个0)

#include<stdio.h>
void dectobin(int n) {
    int sum = 0;
    int y, x = 1;
    while (n != 0) {
        y = n % 2;
        sum = x * y + sum;
        x *= 10;
        n /= 2;
    }
    printf("%d", sum);
}
int main(){
    int n;//输入一个十进制整数
    scanf("%d", &n);
    dectobin(n);
}

5,计算二进制的和,注意边界值(代码摘自http://t.csdn.cn/cr033

#include<stdio.h>
void add(int a[],int n)
{
	int i=n-1;
	while(a[i]==1){//所有连续的1,变成0,遇到的第一个0,变成1 
		a[i]=0;
		i--;
}
	if(i!=-1){//判断位数是否需要增加 
		a[i]=1;
	}else{
    for(int i=1;i<=n;i++){//数组内元素全为1,加一需增加一位 
			a[i]=0;
	}
	a[0]=1;//进位首元素为1 
	n++;//数组长度+1 
}
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
}
	printf("\n");
}
int main()
{
	int a[5]={1,1,1,1};
	add(a,4);
	return 0; 
}

8,不同进制的非负整数转换,输入a,n,b,将a进制的n转为b进制,输出字母符号时全大写

(08年北大机试题)

#include<stdio.h>
#include<string.h>
int main(){
	int a,b;
	char str[40];
	while(scanf("%d%s%d",&a,str,&b)!=EOF){
		int tmp = 0,c=1;
		int len=strlen(str);
		for(int i=len-1;i>=0;i--){//从低位到高位遍历每个数位上的数
			int x;//计算该位上数字
			if(str[i]>='0' && str[i]<='9'){
				x = str[i]-'0';
			}else if(str[i]>='a' && str[i]<='z'){
				x = str[i]-'a'+10; 
			}else{
				x = str[i]-'A'+10;
			}
			tmp+=x*c;
			c*=a; //求出这个十进制数 
		}
		char ans[50];
		int cnt= 0;
		do{
			int x = tmp % b; //计算该位数字
			ans[cnt++]=(x<10)? x : x-10+'A';
			tmp/=b; 
		}while(tmp); 
		for(int i= cnt-1;i>=0;i--)
		  printf("%c",ans[i]);
		printf("\n");
	}
	return 0;
}

9,输出由0,1组成的字符序列,以"*"作为结束标志,输出对应的十进制数(其实就是二转十啦,不考虑溢出,用函数比较快)

#include<stdio.h>  
#include<math.h> 
#define N 100
int convert(char *str){
	char s;
    int i,len,result=0;
    len = strlen(str);
	for(i=0;(s=str[i])!='*';i++)
		if(s=='1')
			result += pow(2,len-2-i);
	return result;
}
int main(){
    char str[N];
  	printf("请输入二进制数,以*结束:");
	gets(str);
	int result = convert(str);
    printf("相应的十进制为:%d\n",result); 
}

10,十进制转八进制(目前没发现自己写的问题在哪)

#include<stdio.h>
int main(){
	int a;
	printf("请输入需要转换的数:");
	scanf("%d", &a);
	int b[10] = {0};//数组用于记录除8的余数
	int count = 0;//记录数位
	while(a!=0){
		b[count++] = a % 8;
		a /= 8;
	}
	for (count=count-1; count>= 0;count--)
		printf("%d", b[count]);
}
//书上原代码
#include<stdio.h>
int main(){
	int a;
	printf("请输入需要转换的数:");
	scanf("%d", &a);
	int b[10] = {0};//数组用于记录除8的余数
	int count = 0;//记录数位
	while(a/8!=0){
		b[count++] = a % 8;
		a /= 8;
	}
	b[count] = a;
	while (count != 0){
		printf("%d", b[count--]);
	}
	printf("%d", b[0]);
}
第五章------数组

1,编写函数实现N*M矩阵中的最大值和平均值

void get_stats(int array[][COLS], int rows, int cols, int* max, float* avg) {
    int sum = 0;
    *max = array[0][0];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (array[i][j] > *max) {
                *max = array[i][j];
            }
            sum += array[i][j];
        }
    }
    *avg = (float) sum / (rows * cols);
}

int main() {
    int array[ROWS][COLS] = {
        {5, 8, 3, 4},
        {2, 6, 7, 1},
        {9, 4, 6, 2}
    };
    int max_val;
    float avg_val;
    get_stats(array, ROWS, COLS, &max_val, &avg_val);//要取地址,才能存值
    printf("最大值:%d\n", max_val);
    printf("平均值:%f\n", avg_val);
    return 0;

2,编写函数,将数组A分为左右部分,其中左为奇数,右为偶数

#include<stdio.h>
void separate(int arr[], int len) {
    int left = 0, right = len - 1;
    while (left < right) {
        while (left < right && arr[left] % 2 != 0) {
            left++;
        }
        while (left < right && arr[right] % 2 == 0) {
            right--;
        }
        if (left < right) {
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }
}
int main(){
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int n = 10;
    separate(a, 10);
    for (int i = 0; i < 10;i++)
{
        printf("%4d", a[i]);
}}

3,给定m*n矩阵,编写函数将矩阵逆置

#include <stdio.h>
#define ROWS 3
#define COLS 4
int main() {
    int matrix[ROWS][COLS] = {{00, 01, 02, 03},
                              {10, 11, 12, 13},
                              {20, 21, 22, 23},};
    printf("Original matrix:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
//核心交换代码
    for (int i = 0; i < ROWS / 2; i++) {
        for (int j = 0; j < COLS; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[ROWS - 1 - i][COLS - 1 - j];
            matrix[ROWS - 1 - i][COLS - 1 - j] = temp;
        }
    }
    printf("Modified matrix:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

4,AB合并成有序数组C

#include<stdio.h>
void merge(int A[], int m, int B[], int n, int C[]) {
    int i = 0, j = 0, k = 0;
    while (i < m && j < n) {
        if (A[i] < B[j]) {
            C[k++] = A[i++];
        } else {
            C[k++] = B[j++];
        }
    }
    // 将剩余的元素加入C中
    while (i < m) {
        C[k++] = A[i++];
    }
    while (j < n) {
        C[k++] = B[j++];
    }
}

5,编写函数,将数组的偶数从小到大放到数组前半部分,奇数有序放在后半部分

#include<stdio.h>
#define N 7 
void sort(int a[],int m,int n){
    int t;
    for (int i = m; i < n - 1;i++)
        for (int j = m; j < n - 1-i;j++){
            if(a[j]>a[j+1]){
                t = a[j + 1];
                a[j + 1] = a[j];
                a[j] = t;
            }
        }
    }
int main(){
    int a[N] = {1, 4, 3, 2, 5, 9, 7};
    int i = 0, j = N - 1, temp, p = 0, q = 0;//用于交换奇偶
    while(i<j){
        while(a[i]%2==0){
            i++;
            p++;//用于统计偶数的个数
        }
        while(a[j]%2!=0){
            j--;
            q++;//统计奇数的个数
        }
        if(i<j){
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
    sort(a, 0, p - 1);
    sort(a, p, p + q - 1);
    for (i = 0; i < N;i++)
        printf("%d", a[i]);
}

6,编写函数将两向量的位置互换

#include<stdio.h>
#define N 6
#define M 5
void reverse(int a[],int n){
    int i, temp;
    for (i = 0; i < n / 2;i++){
        temp = a[i];
        a[i] = a[n - 1 - i];
        a[n - 1 - i] = temp;
    }
}
int main(){
    int i;
    int a[M + N];
    for (i = 0; i < M + N;i++)
        scanf("%d", &a[i]);
    reverse(a, M + N);//整个逆置
    reverse(a, N);//前半部分逆置
    reverse(a + N, M);//后半部分逆置
    for (i = 0; i < M + N;i++)
        printf("%d", a[i]);
}

7,15个数放从大到小在数组中,输入一个数用折半查找该数是第几个元素值

#include <stdio.h>
#define N 15
int binarySearch(int arr[], int low, int high, int key)
int main() {
    int arr[N] = {99, 88, 77, 66, 55, 44, 33, 22, 21, 20, 19, 18, 17, 16, 15}; // 已经排好序的数组
    int key, index; // 要查找的数和其下标

    printf("请输入要查找的数:");
    scanf("%d", &key);

    index = binarySearch(arr, 0, N - 1, key);

    if (index == -1) {
        printf("该数不存在!");
    } else {
        printf("该数是第%d个元素的值。\n", index + 1);
    }
    return 0;
}

int binarySearch(int arr[], int low, int high, int key) {
    while (low <= high) {
        int mid = (low + high) / 2; // 求中间位置
        if (key == arr[mid]) { // 找到
            return mid;
        } else if (key > arr[mid]) { // 在左半边继续查找
            high = mid - 1;
        } else { // 在右半边继续查找
            low = mid + 1;
        }
    }

    return -1; // 没找到
}

8,输入一组数字,求由改组数字组成的最大整数

#include<stdio.h>
int main(){
    int i, j, k=0, temp, n,a[10],ne=0;
    scanf("%d", &n);
    while(n!=0){//各位元素存入数组
        a[k] = n % 10;
        n /= 10;
        k++;
    }
    for (i = 0; i < k;i++)//交换大小元素
        for (j = k - 1; j > i;j--){
            if(a[j]>a[j-1]){
                temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }
        }
    for (i = 0; i < k;i++)
        ne = ne * 10 + a[i];
    printf("%d", ne);
}

9,输入字符串,判断字符串是否包含大小写字母,数字三类字符中的两类

#include<stdio.h>
#include<string.h>
int main(){
    char c;//存储字符串
    //gets(s);
    int flag1=0, flag2=0,flag3=0;//用于记录大小写字母
    printf("请输入字符串\n");
    while((c=getchar())!='\n'){
            if(c>='a'&&c<='z')
                flag1=1;
            else if(c>='A'&&c<='Z')
                flag2=1;
            else if(c >= '0' && c <= '9')
                flag3=1;
            else;
        }
    flag1 = flag1 + flag2 + flag3;
    if(flag1>=2)
        printf("包含两种字符;");
    else
        printf("----");
}

10,数组逆序输出

#include<stdio.h>
#define N 10
int main(){
    int a[N] = {1, 2, 4, 7, 6, 9, 3, 2, 5, 10};
    int i=0, j=N-1;
    for (i = 0; i < N/2;i++,j--){
        int temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    for (i = 0; i < N;i++)
        printf("%d ", a[i]);
}

11,对数组全体进行向右移动,输出数组。(感觉这题很有意思,可能是因为我一直没弄明白)

#include<stdio.h>
#include<stdlib.h>
void print_arr(int array[],int n){//打印数组
        int i;
        for (i = 0; i < n;++i)
            printf("% d", array[i]);
        printf("\n");
}
void move(int array[],int n,int offset){//滚动数组
        int *p, *arr_end,last;
        arr_end = array + n;//数组最后一个元素的下一个位置
        while(offset){//直到偏移量为0
            last = *(arr_end - 1);
            for (p = arr_end - 1; p != array; --p)//向右滚动移位
                *p = *(p - 1);
            *array = last;
            --offset;
        }
}
int main(){
    int arr[20], i, n, offset;
    printf("Total numbers?\n");//输入数组大小和数组内容
    scanf("%d", &n);
    for (i = 0; i < n;i++)
            scanf("%d", &arr[i]);
    printf("set your offset.\n");//输入滚动偏移量
    scanf("%d", &offset);
    print_arr(arr, n);//打印滚动前的数组
    move(arr, n, offset);//滚动数组并打印
    print_arr(arr, n);
}

12,函数计算字符串长度。

#include<stdio.h>
int fun(char *str){
    int i = 0;
    while(*str!='\0'){
        i++;
        str++;
    }
    return i;
}
int main(){
    char str[20],len;
    gets(str);
    len = fun(str);
    printf("字符串长度为:%d",len);
}

13,此题感觉就一半,不全,缺条件

14,假设包含m个元素的整型数组a,该数组存放m个不重复的整数,编写函数求数组中第k大的数,其中m>=1,i<=k<=m

#include <stdio.h>
// 冒泡排序算法(快排也可)
void bubble_sort(int a[], int m)
{
    int i, j, temp;
    for (i = 0; i < m - 1; i++){
        for (j = 0; j < m - i - 1; j++){
            if (a[j] > a[j + 1]){
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}
// 求数组中第k大的数
int find_kth_largest(int a[], int m, int k)
{
    bubble_sort(a, m);
    return a[m - k];
}
int main()
{
    int a[] = {5, 2, 9, 3, 7, 1, 8, 6, 4};
    int m = sizeof(a) / sizeof(a[0]);
    int k;
    scanf("%d", &k);
    printf("原数组:");
    for (int i = 0; i < m; i++)
        printf("%d ", a[i]);
    printf("\n");
    int kth_largest = find_kth_largest(a, m, k);
    printf("第%d大的数为:%d\n", k, kth_largest);
    return 0;
}

内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为新质生产力的代表,已成为中国经济新的增长点。报告从发展环境、资金投入、创新能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创新能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值