关于C语言习题一

1、数转字符
复制代码
#include<stdio.h>
#include<string.h>
/*
char *itoa(int a){
   static char b[20];
    int i=0,l;
    char t;
    while(a!=0){
        b[i]='0'+a%10;
        a=a/10;
        i++;
    }
    b[i]='\0';
    l=strlen(b);
    for(i=0;i<l/2;i++){
        t=b[l-1];
        b[l-1]=b[i];
        b[i]=t;
        l--;
    }
    return b;
}
*/

int main(){
    char *itoc(int a,char str[]);
    int a;
    char str[11];
    char *b;
    printf("please input a number:");
    scanf("%d",&a);
    b = itoc(a,str);
    printf("%s\n",b);
    return 0;
}
char *itoc(int a,char str[]){
    char stack[10];
    int top;
    int i=0,x;
    top = -1;
    while(a!=0){
        x = a%10;
        top++;
        stack[top] = '0'+x;
        a = a/10;
    }
    while(top>-1){
        str[i]=stack[top];
        top--;
        i++;
    }
    str[i]='\0';
    return str;
}
复制代码

2、5*5二维数组找最大

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 5
int main(){
    void maxn(int a[][5],int n,int *x,int *y,int *max);
    int a[N][N];
    int i,j;
    int x,y,max;
    srand((unsigned)time(NULL));
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            a[i][j]=rand()%100;
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    maxn(a,N,&x,&y,&max);
    printf("max=%d,x=%d,y=%d\n",max,x,y);

    return 0;
}
void maxn(int a[][5],int n,int *x,int *y,int *max){
    int i,j;
    *max=a[0][0];
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(*max<a[i][j]){
                *max=a[i][j];
                *x=i+1;
                *y=j+1;
            }
        }
    }
}
复制代码

 3、输出带格式的9*9的乘法表

复制代码
#include<stdio.h>
int main(){
    int i,j;
    printf("    |   1    2    3    4    5    6    7    8    9  \n");
    printf("____|_______________________________________________\n");
     for(i=0;i<9;i++){
        printf("%4d|",i+1);
        for(j=0;j<9;j++){
            if(j<i){
                printf("     ");
            }
            else
                printf("%4d ",(i+1)*(j+1));
        }
        printf("\n");
    }
    return 0;
    
}
复制代码

 4、计算1-n有多少个9

复制代码
#include<stdio.h>
#define N 100
int main(){
    int nine(int *a,int n);
    int a[N];
    int num;
    int n;
    printf("please input the number:");
    scanf("%d",&n);
    num = nine(a,n);
    printf("the nines number is :%d\n",num);
    return 0;
}
int nine(int *a,int n){
    int i,j;
    int count = 0;
    for(i = 0;i < n;i++){
        a[i] = i+1;
    }
    for(i = 0;i < n;i++){
        while(a[i]!=0){
            j = a[i]%10;
            if(9==j){
                count++;
            }
            a[i] = a[i]/10;
        }
    }
    return count;
}
复制代码

5、出掉3

第一种算法(自己)

复制代码
#include<stdio.h>
#define N 100
int main(){
    int outhree(int *a,int n);
    int n;
    int a[N]={0};
    int i;
    printf("please input the number(1,100):");
    scanf("%d",&n);
    printf("the last one is:%d\n",outhree(a,n));
    return 0;
}
int outhree(int *a,int n){
    int count = 0;
    int i;
    int j = 3;//只是为了进入循环
    int x;
    while(j>1){
        j = 0;
        for(i=0;i<n;i++){
            if(a[i]!=1){
                count++;
                j++;
            }
            if(count == 3){
                count = 0;
                a[i] = 1;
            }
        }
    }
    for(i=0;i<n;i++){//循环结束条件
        if(a[i]!=1){
            x = i+1;
            break;
        }
    }
    return x;   
}
复制代码

 第二种算法:

复制代码
#include<stdio.h>
#include<stdlib.h>
int main(){
    int outhree(int *a,int n);
    int n;
    int *a;
    int i;
    printf("please input the number(1,100):");
    scanf("%d",&n);
    a = (int *)malloc(n*(sizeof(int)));
    for(i=0;i<n;i++){
        a[i]=i+1;
    }
    printf("the last one is:%d\n",outhree(a,n));
    free(a);
    return 0;
}
int outhree(int *a,int n){
    int count = 0;
    int i;
    int x;
    int num=n;
    while(num>1){
        for(i=0;i<n;i++){
            if(a[i]!=0){
                count++;
                if(num==2&&count==2){
                    x = i+1;
                }
            }
            if(count == 3){
                count = 0;
                a[i] = 0;
                num--;
            }
        }
    }
    return x;   
}
复制代码

 

6、命令行输入5个数(正数、负数、小数),并且由小到大排(重点,用了atof把字符串型转成float型,并且进行选择排序,输出时不想输出浮点数的0,所以有了%g)

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,const char *argv[]){
    void sortf(float *array);
    float array[5];
    int i;
    for(i=0;i<5;i++){
        array[i]=atof(argv[i+1]);
    }
    sortf(array);
    for(i=0;i<5;i++){
        printf("%g ",array[i]);
    }
    printf("\n");
    return 0;
}
void sortf(float *array){
    int i,j;
    float min = array[0],t;
    for(i=0;i<5;i++){
        for(j=i;j<5;j++){
             if(array[i]>array[j]){
                t = array[i];
                array[i] = array[j];
                array[j] = t;
            }
        }
    }
}
复制代码

7、100以内的素数(重点,判断条件,i==j 一下子忘记了怎么判断了)可以改进,可能改天补。

复制代码
#include<stdio.h>
int main(){
    int i,j;
    for(i=1;i<100;i++){
        for(j=2;j<=i;j++){
            if(i%j==0)
                break;
        }
        if(i==j){
            printf("%d ",i);
        }
    }
    printf("\n");
    return 0;
}
复制代码

8、一个数等于因子之和,1000以内

复制代码
#include<stdio.h>
int main(){
    int i,j;
    int sum;
    for(i=1;i<1000;i++){
        sum = 0;
        for(j=1;j<i;j++){
            if(i%j==0){
                sum+=j;
            }
        }
        if(i==sum){
            printf("%d ",i);
        }
    }
    printf("\n");
    return 0;
}
复制代码

 9、找出5*5数组找出最大最小位置和第一最后换

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 5
int main(){
    void trans(int a[][N],int n);
    srand((unsigned)time(NULL));
    int a[N][N];
    int i,j;
    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");
    }
    printf("\n");
    trans(a,5);
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
void trans(int a[][N],int n){
    int i,j;
    int min=a[0][0];
    int max=a[4][4];
    int hx,hy;
    int lx,ly;
    int t;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(min>a[i][j]){
                min = a[i][j];
                lx=i;
                ly=j;
            }
           if(max<a[i][j]){
                max = a[i][j];
                hx=i;
                hy=j;
            }
        }
    }
    t = a[0][0];
    a[0][0] = a[lx][ly];
    a[lx][ly] = t;
    t = a[4][4];
    a[4][4] = a[hx][hy];
    a[hx][hy] = t;
}
复制代码

10、字符串中数字子串最大的长度

复制代码
#include<stdio.h>
#include<string.h>
#define N 30
int main(){
    char a[N];
    int len=0;
    int longlen=0;
    int i=0;
    scanf("%s",a);
    while(a[i]!='\0'){
        if(a[i]>='0'&&a[i]<='9'){
            len++;
        }
        else{
            if(longlen<len){
                longlen=len;
            }
            len=0;
        }
        i++;   
    }
    if(longlen<len){//如果最后一个数字子串在最后的话,就执行不到else 所以需要在比较一遍。
        longlen=len;
    }
    printf("%d\n",longlen);
    return 0;
}
复制代码

11、判断输入的字符子串 含有数字的字符串最长是多少(输入有限制," hd kfi sdj ws ",要保证前后有空格)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<stdio.h>
#include<string.h>
#define N 30
#define M 10
int main(){
    char a[N];
    int b[M];
    int count = 0;
    int i = 0,j = 0;
    int max;
    int n,m;
    int l;
    fgets(a,N,stdin);
    fputs(a,stdout);
    l=strlen(a);
    for(i=0;i<l;i++){
        if(a[i]>='0'&&a[i]<='9'){
            n=i;
            while(a[n]!=' '){
                count++;
                    n--;
            }
            m=i;
            while(a[m]!=' '){
                count++;
                    m++;
            }
            i=m;
            b[j]=count-1;
            count=0;
            j++;
        }
    }
    max=b[0];
    for(i=0;i<j;i++){
        printf("%d\n",b[i]);
    }
    for(i=0;i<j;i++){
        if(max<b[i]){
            max=b[i];
        }
    }
    printf("the most long stris:%d\n",max);
    return 0;
}

  12、打印菱形号

复制代码
#include<stdio.h>
void print1(){
    int i,j;
    for(i=1;i<=4;i++){
        for(j=1;j<=4-i;j++){
            printf(" ");
        }
        for(j=1;j<=2*i-1;j++){
            printf("*");
        }
        printf("\n");
    }
    for(i=1;i<=3;i++){
        for(j=1;j<=i;j++){
            printf(" ");
        }
        for(j=1;j<=7-2*i;j++){
            printf("*");
        }
        printf("\n");
    }
    
}
void print2(){
    int i,j;
    for(i=1;i<=4;i++){
        for(j=1;j<=4-i;j++){
            printf(" ");
        }
        printf("*");
        if(i>1){
            for(j=1;j<2*(i-1);j++){
             printf(" ");
        
            }
            printf("*");
        }
        printf("\n");
    }
    for(i=1;i<=3;i++){
        for(j=1;j<=i;j++){
            printf(" ");
        }
        printf("*");
        if(i!=3){
            for(j=1;j<=5-(2*i);j++){
                printf(" ");
            }
            printf("*");
        }
        printf("\n");
    }
    
}
int main(){
    print1();
    print2();
    return 0;
}
复制代码

13、求ab最大公约数(辗转相除法)

复制代码
#include<stdio.h>
//辗转相除法
int main(){
    int bigcom(int a,int b);
    int a;
    int b;
    int c;
    printf("please input two nums:");
    scanf("%d%d",&a,&b);
    c = bigcom(a,b);
    printf("%d和%d最大公约数为:%d\n",a,b,c);
    return 0;
} 
int bigcom(int a,int b){
    int t;
    while(b!=0){
        t = a % b;
        a = b;
        b = t;
    }
    return a;
}
复制代码

14、求π

复制代码
#include<stdio.h>
#include<math.h>
int main(){
    float a = 1;
    float sum1=0,sum2=1;
    int flag = 1;
    while(fabs(sum1-sum2)>pow(10,-5)){
        sum2 = sum1;
        sum1 += flag*(1/a);
        flag *= -1;
        a += 2;
    }
    printf("pai is %g\n",4*sum1);
    return 0;
    
复制代码

15、求2/1+3/2+5/3++++前20项的和

复制代码
#include<stdio.h>
int main(){
    float cal(int n);
    int n;
    float sum;
    printf("please input a number:");
    scanf("%d",&n);
    sum = cal(n);
    printf(" %d head sum is %g\n",n,sum);
    return 0;    

}
float cal(int n){
    int a = 2;
    int b = 1;
    int i;
    int t;
    float sum = 0;
    for(i = 1;i <= n;i++){
        sum += (float)a/b;
        t = a;
        a = a + b;
        b = t;
    }
    return sum;
}
复制代码

16、求100~200之间的所有素数,每行带引5个素数

复制代码
#include<stdio.h>
int main(){
    void outprime(int a,int b);
    int a,b;
    printf("please input two numbers:");
    scanf("%d%d",&a,&b);
    outprime(a,b);
    return 0;
}
void outprime(int a,int b){
    int i,j;
    int count = 0;
    for(i=a;i<b;i++){
        for(j=2;j<i;j++){
            if(i%j==0){
                break;
            }
        }
        if(i==j){
            printf("%4d",i);
            count++;
        }
        if(count==5){
            count=0;
            printf("\n");
        }
    }
    prnitf("\n");
}
复制代码

17、计算字符串(带有数字的)中的单词数

复制代码
#include<stdio.h>
int main(){
    int  blank(char *a);
    char a[30];
    int num;
    fgets(a,30,stdin);
    num = blank(a);
    printf("there are %d strings\n",num);
    return 0;
}
int blank(char *a){
    int i=0,num=0;
    int count=0;
    int flag1=0;//数字标识
    int flag2=1;//空格标识
    while(a[i]!='\0'){
        if(a[i]>='0'&&a[i]<='9'){
            flag1 = 1;
            if(num<1&&count==0) 
                    flag2=0;
            if(flag1==1&&flag2==0){
                num++;
                flag2 = 1;
            }
        }
        else if(a[i]==32){
            flag2 = 0;
            flag1 = 0;
            if(count == 0) count =1;
        }
        i++;
    }
    return num;
}

复制代码

课上应该写的

复制代码
#include<stdio.h>
int main(){
    int  blank(char *a);
    char a[30];
    int num;
    fgets(a,30,stdin);
    num = blank(a);
    printf("there are %d strings\n",num);
    return 0;
}
int blank(char *a){
    int i=1,num=0;
    int count=0;
    while(a[i]!='\0'){
        if(a[i]==32&&a[i-1]!=32){
            count++;
        }
        i++;
    }
    return count+1;
}
复制代码

 

18、将整数转换为10进制,2进制,16进制

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

    } 
    printf("hexadecimal is:");
    for(i--;i>=0;i--){
        printf("%c",s[i]);
    }
    printf("\n");
}
复制代码

19、打印字符串、复制字符串、连接字符串

复制代码
#include<stdio.h>
#include<string.h>
int main(){
    void print(char *a);
    void copy(char *a,char *b);
    void link(char *a,char *b);
    char a[30],b[20];
    printf("please input two strings: ");
    scanf("%s%s",a,b);
    print(a);
    print(b);
    copy(a,b);
    print(a);
    print(b);
    link(a,b);
    print(a);
    print(b);
    return 0;
}
void print(char *a){
    int i = 0;
    while(a[i]!='\0'){
        printf("%c",a[i]);
        i++;
    }
    printf("\n");
}
void link(char *a,char *b){
    int i = 0;
    int l;
    l = strlen(a);
    while(b[i]!='\0'){
        a[l] = b[i];
        l++;
        i++;
    }
    a[l] = '\0';
}
void copy(char *a,char *b){
    int i=0;
    while(b[i]!='\0'){
        a[i] = b[i];
        i++;
    }
    a[i] = '\0';
} 
复制代码

比较完整地关于字符串的操作

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    void myscanf(char *a);
    void myprint(char *a);
    int mystrlen(char *a);
    int mystrcmp(char *a,char *b);
    int mystrncmp(char *a,const char *b,int n);
    void mystrcpy(char *a,char *b);
    void mystrncpy(char *a,const char *b,int n);
    void mystrcat(char *a,char *b);
    void mystrncat(char *a,const char *b,int n);
    char a[20];
    char b[10];
    int n;
    int differ1,differ2;
    printf("please input two strings:");
    myscanf(a);
    myscanf(b);
    

  //  myprint(a);
  //  myprint(b);
  //  n = mystrlen(a);

 /* printf("please input num you want compare:");
    scanf("%d",&n);
    differ1=mystrcmp(a,b);
    differ2=mystrncmp(a,b,n);
    printf("differs are :%d %d\n",differ1,differ2);
 */

/*
    mystrcpy(a,b);
    myprint(a);
    myprint(b);
    printf("please input num you want :");
    scanf("%d",&n);
    mystrncpy(a,b,n);
    myprint(a);
    myprint(b);
*/  

    mystrcat(a,b);
    myprint(a);
    myprint(b);
    printf("please input num you want :");
    scanf("%d",&n);
    mystrncat(a,b,n);
    myprint(a);
    myprint(b);


    return 0;
}
void myscanf(char *a){
    int i = 0;
    char ch;
    while(1){
        scanf("%c",&ch);
        if(ch=='\n')
            break;
        a[i] = ch;
        i++;
    }
    a[i] = '\0';

}

void myprint(char *a){
    int i = 0;
    while(a[i]!='\0'){
        printf("%c",a[i]);
        i++;
    }
    printf("\n");
}

int mystrlen(char *a){
    int i = 0;
    while(a[i]!='\0'){
        i++;
    }
    return i;
}

int mystrcmp(char *a,char *b){
    int i = 0;
    int n;
    while(a[i]!='\0'&&b[i]!='\0'){
        if(a[i]!=b[i]){
            n = a[i] - b[i];
            break;
        }
        i++;
    }
    if(a[i]=='\0'&&b[i]=='\0') n = 0;
    else if(a[i]!='\0'&&b[i]=='\0') n = a[i];
    else if(a[i]=='\0'&&b[i]!='\0') n= -b[i];
    return n;
}

int mystrncmp(char *a,const char *b,int n){
    int i = 0;
    int m;
    while(n){
        if(a[i]=='\0'||b[i]=='\0') break;
        if(a[i]!=b[i]){
            m= a[i] - b[i];
            break;
        }
        n--;
        i++;
    }
    if(a[i]!='\0'&&b[i]=='\0') m = a[i];
    else if(a[i]=='\0'&&b[i]!='\0') m = -b[i];
    return m;
}

void mystrcpy(char *a,char *b){
    int i=0;
    while(b[i]!='\0'){
        a[i] = b[i];
        i++;
    }
    a[i] = '\0';
} 

void mystrncpy(char *a,const char *b,int n){
    int i=0;
    while(n){
        a[i] = b[i];
        i++;
        n--;
    }
    a[i] = '\0'; 
}

void mystrcat(char *a,char *b){
    int i = 0;
    int l;
    l = strlen(a);
    while(b[i]!='\0'){
        a[l] = b[i];
        l++;
        i++;
    }
    a[l] = '\0';
}
void mystrncat(char *a,const char *b,int n){
    int i = 0;
    int l;
    l = mystrlen(a);
    while(n&&b[i]!='\0'){
        a[l] = b[i];
        i++;
        l++;
        n--; 
    }
    a[l] = '\0';
}
复制代码

20、整数数组的冒泡排序(可以单独写一个输出函数)

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
    srand((unsigned)time(NULL));
    void bub(int *a,int n);
    int a[10];
    int i;
    for(i=0;i<10;i++){
        a[i]= rand()%100;
    }
    for(i=0;i<10;i++){
        printf("%4d",a[i]);
    }
    printf("\n");
    bub(a,10);
    for(i=0;i<10;i++){
        printf("%4d",a[i]);
    }
    printf("\n");
    return 0;
}
void bub(int *a,int n){
    int i,j,t;
    for(i=0;i<n;i++){
        for(j=0;j<n-i-1;j++){
            if(a[j]>a[j+1]){
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
}
复制代码

21、对于任意一个正整数都可以找出至少一串连续奇数,他们的和等于该数的立方。验证2-20

复制代码
#include<stdio.h>
int main(){
    int n,m;
    int i;
    int j;
    int x,y;
    int z;
    int sum=0;
    printf("please input two number:");
    scanf("%d%d",&n,&m);
    for(j=n;j<=m;j++){
        sum = 0;
        z = j*j;
        x = y = z;
        if(z%2==0){
            for(i = 1;i <= j/2;i++){
                 if(i==1){
                    x = x - 1;
                    y = y + 1;
                 }
                 else{
                    x = x - 2;
                    y = y + 2;
                  }
            }
         }
         else{
             for(i = 1;i <= j/2;i++){
                  x = x - 2;
                  y = y + 2;
              }
             }
         printf("%d part of %d-%d\n",j,x,y);
         for(i=x;i<=y;){
              sum+=i;
              i+=2;
          }
         printf("%d^3 is %d,%d~%d sum is:%d\n",j,j*j*j,x,y,sum);
  }
   return 0;

}
复制代码

 

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