关于C语言习题二

1、5*5数组中找出一行中最大的数,同时也是一列中最大的数。

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 5
int main(){
    srand((unsigned)time(NULL));
    int i,j;
    int a[5][5];
    int row;
    int col;
    int max;
    int found=0;
do{
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            a[i][j]=rand()%100;
        }
    }
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    for(i=0;i<N;i++){
        max=a[i][0];
        row = i;
        col = 0;
        for(j = 0;j < N;j++){
            if(max<a[i][j]){
                max = a[i][j];
                col = j;
            }
        }
        for(j=0;j<N;j++){
            if(max>a[j][col]){
                break;
            }
        }
        if(j == N){
            found = 1;
            printf("num is %d, row = %d,col = %d\n",max,row,col);
        }
    }
}while(found == 0);//一直循环到找到saddle为止
if(found==0){ printf("not found saddle\n"); } return 0; }
复制代码

 2、字符串逆序

复制代码
#include<stdio.h>
int main(){
    void verse(char *a);
    char a[20];
    scanf("%[^\n]",a);
    verse(a);
    printf("%s\n",a);
    return 0;
}
void verse(char *a){
    int i = 0;
    int j = 0;
    int t;
    while(a[i]!='\0'){
        i++;
    }
    i--;
    while(j<i){
        t = a[j];
        a[j] = a[i];
        a[i] = t;
        j++;
        i--;
    }
    
}
复制代码

3、整数转为任意进制的字符串输出。

复制代码
#include<stdio.h>
int main(){
    void verse(char *a);
    char two(int n,char *a);
    char eight(int n,char *a);
    char ten(int n,char *a);
    char sixteen(int n,char *a);
    int n;
    char a[10];
    char b[10];
    char c[10];
    char d[10];    
    printf("please input a number:");
    scanf("%d",&n);
    two(n,a);
    eight(n,b);
    ten(n,c);
    sixteen(n,d);
    printf("%s\n",a);
    printf("%s\n",b);
    printf("%s\n",c);
    printf("%s\n",d);
    return 0;
}
void verse(char *a){
    int i = 0;
    int j = 0;
    int t;
    while(a[i]!='\0'){
        i++;
    }
    i--;
    while(j<i){
        t = a[j];
        a[j] = a[i];
        a[i] = t;
        j++;
        i--;
    }
    
}
char two(int n,char *a){
    int i = 0;
    while(n!=0){
        a[i] = (n % 2) + '0';
        i++;
        n = n / 2;
    }
    verse(a);
}
char eight(int n,char *a){
    int i = 0;
    while(n != 0){
         a[i] = (n % 8) + '0';
         i++;
         n = n / 8;
    }
    verse(a);
}
char ten(int n,char *a){
    int i = 0;
    while(n != 0){
         a[i] = (n % 10) + '0';
         i++;
         n = n / 10;
    }
    verse(a);  
}
char sixteen(int n,char *a){
    int i = 0;
    while(n != 0){
        switch(n%16){
            case 0: a[i] = 0+'0';break;
            case 1: a[i] = 1+'0';break;
            case 2: a[i] = 2+'0';break;
            case 3: a[i] = 3+'0';break;
            case 4: a[i] = 4+'0';break;
            case 5: a[i] = 5+'0';break;
            case 6: a[i] = 6+'0';break;
            case 7: a[i] = 7+'0';break;
            case 8: a[i] = 8+'0';break;
            case 9: a[i] = 9+'0';break;
            case 10: a[i] = 'A';break;
            case 11: a[i] = 'B';break;
            case 12: a[i] = 'C';break;
            case 13: a[i] = 'D';break;
            case 14: a[i] = 'E';break;
            case 15: a[i] = 'F';break;
        }
        i++;
        n = n / 16;
    }
    verse(a);
}
复制代码

4、计算主串中子串出现的次数

复制代码
#include<stdio.h>
#include<string.h>
int main(){
    char a[20];
    char b[20];
    int n;
    int find(char *a,char *b);

    printf("please input the string:");
    scanf("%s",a);
    printf("please input the substring:");
    scanf("%s",b);

    n = find(a,b);
    if(n == 0) printf("not found!\n");
    else printf(" found %d time\n",n);

    return 0;

}
int find(char *a,char *b){
    int count = 0;
    int i = 0;
    int j = 0;
    int k;//位标,如果b没有比结束,就不等于了,就调回a的下一下和b【0】重新比较.
    while(a[i]!='\0'){
        if(a[i] == b[j]){
            i++;
            j++;
            if(j == 1) k = i;
            if(j==strlen(b)){
                count++;
                j = 0;
            }
        }
        else{
            i++;
            if(j!=strlen(b)&&j!=0) i = k;
            j = 0;
        }
    }
    return count;
    
}
//kmp  算法可能会补
复制代码

5、将i am from shanghai

复制代码
#include<stdio.h>
int main(){
    int i = 0;
    int j = 0;
    int k = 0;
    int n;
    char a[] = "I am from shanghai";
    char b [10][10]= {0};
    while(a[i]!=0){
        if(a[i]==' '&&a[i+1]!='\0'){
            j++;
            k = 0;
        }
        else if ( a[i]!=' '){
            b[j][k] = a[i];
            k ++;
        }
        i++;

    }
    while(b[j][0]!='\0'){
        printf("%s ",b[j]);
        
        j--;
    }
    printf("\n");
    return 0;
}
复制代码

6、输入一个字符串,开头是head结尾是tail,判断是不是合法帧(寻找最前面的那个head最后面的那个tail)

复制代码
#include<stdio.h>
int main(){
   char a[30];
   int i = 0;
int first = 0;
int local1 = 0,local2 = 0; printf("please input a string:"); scanf("%s",a); while(a[i]!='\0'){ if(a[i]=='h'&&first==0){ if(a[i+1]=='e'&&a[i+2]=='a'&&a[i+3]=='d'){ local1 = i; i = i+3;
first++; } }
if(a[i]=='t'){ if(a[i+1]=='a'&&a[i+2]=='i'&&a[i+3]=='l'){ local2 = i; } } i++; } if((local2-local1)>4){ for(i = local1;i<=local2+3;i++){ printf("%c",a[i]); } printf("\n"); } else printf("not found!"); return 0; }
复制代码

 7、请编写一个c函数,该函数给出一个字节中被置为1的位的个数

 

复制代码
#include<stdio.h>

int main(){
    int and(int n);
    int n;
    int count;
    scanf("%d",&n);
    count = and(n);
    printf("The num of one %d\n",count);
    return 0;

}

int and(int n){
    int max = 1;
    int i;
    int count = 0;
    for(i = 1; i<=8;i++){
        if(max&n) count++;
         max<<=1;
    }
    return count;
}
复制代码

 

8、输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1p2.

 

复制代码
#include<stdio.h>
int main(){
    void part(int a,int p1,int p2);
    int a;
    int p1;
    int p2;
    printf("please input a integer:");
    scanf("%d",&a);
    printf("please input two limits:");
    scanf("%d%d",&p1,&p2);
    part(a,p1,p2);
    return 0;
}
void part(int a,int p1,int p2){
    int i;
    int max = 1;
    a>>=(p1-1);
    for(i = p1; i <= p2;i++){
        if(max&a) putchar('1');
        else putchar('0');
        max<<=1;
    }
    printf("\n");
    
}
复制代码

 

9、输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1p2位取反后输出

 

复制代码
#include<stdio.h>

int main(){

    void part(int a,int p1,int p2);

    int a;

    int p1;

    int p2;

    printf("please input a integer:");

    scanf("%d",&a);

    printf("please input two limits:");

    scanf("%d%d",&p1,&p2);

    part(a,p1,p2);

    return 0;

}

void part(int a,int p1,int p2){

    int i;

    int max = 1;

    a>>=(p1-1);

    for(i = p1; i <= p2;i++){

        if(max&a) putchar('0');

        else putchar('1');

        max<<=1;

    }

    printf("\n");

    

}
复制代码

 

10、输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数ap位设置为v,输出修改后的该整数的二进制表示.

 

复制代码
#include<stdio.h>

int main(){

    void part(int a,int p,char v);

    int a;

    int p;

    int v;

    printf("please input a integer:");

    scanf("%d",&a);

    printf("please input location:");

    scanf("%d",&p);

    printf("please input 0||1:");

    scanf("%d",&v);

    part(a,p,v+'0');

    return 0;

}

void part(int a,int p,char v){

    int i;

    int max = 1;

    max<<=31;

    for(i = 1; i <=32;i++){

        if(33-p == i) putchar(v);

        else{

            if(max&a) putchar('1');

            else putchar('0');

        }

        max>>=1;

    }

    printf("\n");

    

}
复制代码

 11、b的每一位数有a左右两位异或得到

复制代码
#include<stdio.h>
int main()
{
    int a;
    int b=0;
    scanf("%d",&a);
    for(int i=0;i<32;i++)
    {
        b=b+((((a<<(30-i))>>31)^((a<<32-i)>>31))<<i);
    }   
    printf("%d",b);
    return 0;
}
复制代码

 

posted @   风中凌乱的猪头  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示