C语言基本编程题

在此整理出之前做的一些题目,所有函数包含在同一个头文件中,可在main函数中自行测试,都是些经典题目,供新手老手参阅。转载标明出处,谢谢。

//  mywork.c
//  data_struct
//
//  Created by sdd on 17/8/22.
//  Copyright © 2017年 sdd. All rights reserved.
//

#include "mywork.h"
#include <stdio.h>
#include "math.h"
#include <string.h>
#include <stdlib.h>


//题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
//程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

int first() {
    // insert code here...
    // insert code here.
    printf("there are numbers:\n");
    int count=0;
    for(int i=1;i<5;i++){
        for(int j=1;j<5;j++){
            for(int k=1;k<5;k++){
                if(i!=j && i!=k && j!=k){
                    printf("%d\n",i*100+j*10+k);
                    count++;
                }
            }
        }
    }
    printf("there are total %d numbers\n",count);
    return 0;
}

//一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
int second(){
    int a=-100;
    while(a<1000){
        int temp1=(int)(sqrt(a+100));
        int temp2=(int)(sqrt(a+168));
        if(temp1*temp1==(a+100) &&temp2*temp2 == (a+168)){
            break;

        }
        a++;
    }

    printf("this number is %d\n",a);
    return 0;

}

//给出日期,计算出是今年的第几天
int third(int year,int month,int day){
    int date[12];
    int result=0;
    //判断闰年
    switch(month){
        case(1): date[0]=0;
        case(2): date[1]=31;
        case(3): date[2]=59;
        case(4): date[3]=90;
        case(5): date[4]=120;
        case(6): date[5]=151;
        case(7): date[6]=181;
        case(8): date[7]=212;
        case(9): date[8]=243;
        case(10): date[9]=273;
        case(11): date[10]=304;
        case(12): date[11]=334;
    }

    if((year%4==0&&year%100!=0)||(year%400==0)){
        if(month>=3){
            for(int i=3;i<12;i++){
                date[i]=date[i]+1;
            }

        }
        result=date[month]+day;
    }else{
        result=date[month]+day;
    }

    printf("third is %d\n",result);
    return result;
}

//将xyz永远由由小到大的顺序输出
//程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。

void fifth(int x,int y,int z){
    int tmp;
    if(x>y){     //第一句
        tmp=x;
        x=y;
        y=tmp;
    }
    if(x>z){        //第二句,和第一句都是为了将x赋予最小值
        tmp=x;
        x=z;
        z=tmp;
    }
    if(y>z){
        tmp=y;      //第三句,就是为了将z赋予成为最大值
        y=z;
        z=tmp;
    }
    printf("%d\t%d\t%d\t",x,y,z);//编程的重要要求:固定输出
    return;
}

//画出一个c
void sixth(){
    printf("this is the c i draw!\n");

    printf("    * *\n");
    printf("  *     *\n");
    printf(" *\n");
    printf("*\n");
    printf(" *\n");
    printf("  *     *\n");
    printf("   *  *\n");
    return;


}

//打印九九乘法表
void eighth(){
    int result=0;
    printf("九九乘法表打印如下:\n");
    for(int i=1;i<10;i++){
        for(int j=1;j<10;j++){
            result=i*j;
            printf("%dx%d=%d\t",i,j,result);
        }
        printf("\n");
    }
    return;
}

//打印斐波那契数列
//古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
//  后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
//    程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....

int ninth(int month){
    int result=1;
    if(month==1||month==2){
        result= 1;
        return result;
    }
    while(1){
        result = ninth(month-1)+ninth(month-2);
        return result;
    }

}

//打印101到200之间所有的素数并算出总数
void tenth(){
    int count=0;
    for(int i=101;i<201;i++){
        int temp=(int)sqrt(i);
        int j=2;
        for(j=2;j<(temp+1);j++){
            if(i%j==0){
                break;
            }
        }
        if(j>temp){
            count++;
            printf("%d\n",i);
        }
    }
    printf("total:%d\n",count);
}

//打印所有的水仙花数,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身
void eleventh(){
    for(int i=100;i<1000;i++){
        int hundred,ten,one;
        hundred=(int)(i/100);
        ten=(int)((i-hundred*100)/10);
        one=(int)(i-hundred*100-ten*10);
        if(hundred*hundred*hundred+ten*ten*ten+one*one*one==i){
            printf("%d\n",i);
        }
    }
}

//判断一个数字是否为质数
int iszhishu(unsigned int a){
    int temp=(int)sqrt(a);
    for(int i=2;i<(temp+1);i++){
        if(a%i==0){
            return 0;
        }
    }
    return 1;
}

//将正整数分解质因数
//程序分析:1. 若i与number相等,则空伦一遍循环跳出for,打印出最后一个数字。2. 若可以整除,则打印出来i并赋予number新值,继续进行while的判             断!!!(巧妙!!!),这样可以非常方便地判断剩下数字是否还可以被这个最小质数整除!!!
//        3. 若不可整除,则进行正常的下一轮for循环。
//         最后的排列顺序一定是由小到大的排列顺序。
int twelfth(unsigned int number){
    printf("%d=",number);
    int i;
    for(i=2;i<(number+1);i++){
        while(i!=number){
            if(number%i==0){
                printf("%dx",i);
                number=number/i;
            }else{
                break;
            }
        }
    }
    printf("%d\n",number);
    return 0;
}


//利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
//程序分析:(a>b)?a:b这是条件运算符的基本例子。

void thirteenth(unsigned int score){
    char grade;
    grade=(score<60)?'C':(score>=90)?'A':'B';
    printf("%c\n",grade);

}

//输入两个正整数m和n,求其最大公约数和最小公倍数。
//使用辗转相除法,最小公倍数是两数相乘再除以最小公约数

void forteenth(int big,int small){
    int a1=big;
    int a2=small;
    while(small!=0){
        int tmp=big%small;
        if(tmp>small){
            big=tmp;
        }else{
            big=small;
            small=tmp;
        }
    }

    printf("最大公约数:%d\n",big);
    printf("最小公倍数:%d\n",a1*a2/big);
    return;


}

//输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
void fifteenth(){
    char c;;
    int count1=0;
    int count2=0;
    int count3=0;
    int count4=0;
    while((c=getchar())!='\n'){
        if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
            count1++;
        }else if (c==' '){
            count2++;
        }else if(c>='0'&&c<='9'){
            count3++;

        }else{
            count4++;
        }
    }

    printf("the english number is:%d\nthe blank number is:%d\nmath number is:%d\nother number is:%d\n",count1,count2,count3,count4);
    return;

}

//求s=a+aa+aaa+aaaa+a…a的值,其中a是一个数字。例如2+22+222+2222+22222(共有5个数相加),几个数相加有键盘控制。
void sixteenth(int number,int mount){
    int multi=1;
    int sum=0;
    int result=0;
    for(int i=1;i<(mount+1);i++){

        sum=sum+number*multi;
        multi=multi*10;
        result=result+sum;
    }

    printf("%d\n",result);
}


//一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
void seventeenth(){
    int storage[100];   //定义得稍微大一点防止溢出
    for(int i=1;i<1000;i++){
        int count=0;
        for(int j=1;j<i;j++){

                if(i%j==0){
                    storage[count]=j;
                    count++;
                }
            }
        int sum=0;
        for(int k=0;k<(count);k++){   //一定是count,因为最后count还加了1,所以最后的count代表了数组内存入有效数字的个数
            sum=sum+storage[k];

        }
        if(sum==i){
            printf("%d\n",i);
        }
    }
}


//一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
void eighteenth(){
    double hight=50;
    double sum=100;
    for(int i=1;i<10;i++){
        sum=hight*2+sum;
        hight=hight/2;
    }
    printf("%f\n%f\n",hight,sum);
}


//猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
void ninteenth(){
    int day=9;
    int sum=1;
    while(day!=0){
        sum=(1+sum)*2;
        day--;

    }
    printf("%d\n",sum);
    return;
}

//:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
//程序分析: 先将所有可能的结果用三重循环全部列出,再加上两两对战和某某与某某不比的条件,通过条件筛选的即为最后对战次序。
void twentieth(){
    char i,j,k;
    for(i='x';i<='z';i++){
        for(j='x';j<='z';j++){
            for(k='x';k<='z';k++){
                if((i!=k)&&(i!=j)&&(j!=k)){
                    if(i!='x'&&k!='x'&&k!='z'){
                        printf("a battle with %c\nb battle with %c\nc battle with %c\n",i,j,k);
                    }
                }

            }
        }
    }
}

//打印出如下图案(菱形)
//    *
//   ***
//  ******
// ********
//  ******
//   ***
//    *
//解答这道题建立在深入理解循环以及for小括号中各个量值的具体含义的基础上。
void twefirst(){
    for(int i=0;i<4;i++){
        for(int j=1;j<(4-i);j++){
            printf(" ");
        }
        for(int k=0;k<(2*i+1);k++){
                printf("*");
        }
        printf("\n");
    }

    for(int i=0;i<3;i++){
        for(int j=0;j<(i+1);j++){
            printf(" ");
        }
        for(int k=0;k<(5-i*2);k++){
            printf("*");
        }
        printf("\n");
    }
}

//有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
//程序分析:请抓住分子与分母的变化规律。

void twesecond(){
    double a=2;
    double b=1;
    double tmp;
    double sum=0;
    for(int i=0;i<20;i++){
        sum=sum+(a/b);
        tmp=a+b;
        b=a;
        a=tmp;
    }

    printf("%9.6f\n",sum);//表示数字一共占9位,其中小数点保留6位
}

//题目:求1+2!+3!+...+20!的和
//程序分析:此程序只是把累加变成了累乘。
//应当注意sum的数据类型应该设置为long int(%ld)或float(%lf)
void twethird(){
    float sum=0;
    int now=1;
    for(int i=1;i<=20;i++){
        now=now*i;
        sum=sum+now;
    }
    printf("%lf\n",sum);
    return;
}
//题目:利用递归方法求5!。
//程序分析:递归公式:fn=fn_1*4!
int tweforth(int number){
    if(number==1||number==0){  //注意0!=1
        return 1;
    }
    while(number!=1){
        return number*tweforth(number-1);
    }
    return 0;
}

//题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
void twefifth(){

}
//题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
//程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
int twesixth(int number){
    if(number==1){
        return 10;
    }
    while(number!=1){
        return twesixth(number-1)+2;

    }
    return 0;
}


//给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

//解发一如下是一种非常简单的算法,十分笨拙。1000之类的数字会打印错误。
void tweseventh(long int number){
    int a1=(int)(number/10000);
    int a2=(int)((number-10000*a1)/1000);
    int a3=(int)((number-10000*a1-1000*a2)/100);
    int a4=(int)((number-10000*a1-1000*a2-100*a3)/10);
    int a5=(int)(number%10);

    if(a1!=0){
        printf("there is 5,%d%d%d%d%d\n",a5,a4,a3,a2,a1);

    }else if(a2!=0){
        printf("there is 4,%d%d%d%d\n",a4,a3,a2,a1);
    }else if(a3!=0){
         printf("there is 3,%d%d%d\n",a3,a2,a1);
    }else if(a4!=0){
         printf("there is 2,%d%d\n",a2,a1);
    }else if(a5!=0){
         printf("there is 1,%d\n",a1);
    }else{
        printf("0\n");
    }
}

//解法二十分巧妙!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!
void tweighth(long int number){
    int sum=0;
    int count=0;
    int a;
    while(number!=0){
        a=number%10;
        number=number/10;
        sum=sum*10+a;  //这是十分重要的一步,这一步使得填写的总是最后一位!前面相加的值不停地向左移位(不停地乘10)
        count++;
    }
    printf("%d\nthere is total:%d number\n",sum,count);
}


//一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
void tweninth(long int number){
    if(number<10000||number>999999){
        printf("you have input a wrong number!\n");
        return;
    }
    long int a[5];
    int count=0;
    for(int i=0;i<5;i++){
        a[i]=number%10;
        number=number/10;
    }
    for(int i=0;i<2;i++){
        if(a[i]==a[4-i]){
            count++;
        }
    }
    if(count==2){
        printf("yes!\n");
    }else{
        printf("no!\n");
    }
}
//请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母
int thirtieth(){
    printf("please input the first char:\n");
    char c;
    scanf("%c",&c);
    rewind(stdin);
    //setbuf(stdin,NULL);//rewind和setbuf都可以用作清除缓存区使用,但是fflush在xcode中不可使用。
    if(c=='m'){
        printf("this is monday\n");
    }else if(c=='w'){
        printf("the is is wednesday\n");
    }else if(c=='f'){
        printf("this is friday\n");
    }else if(c=='s'){
        printf("please input second char:\n");
        scanf("%c",&c);
        if(c=='u'){
            printf("this is sunday\n");
        }else if(c=='a'){
            printf("this is saturday\n");
        }
    }else if(c=='t'){
        printf("please input second char:\n");
        scanf("%c",&c);
        if(c=='u'){
            printf("this is tuesday\n");
        }else if(c=='h'){
            printf("this is thursday\n");
        }

    }

    return 0;
}

//求100之内的素数
void thirfirst(){
    int sushu[50];
    int mark=0;
    for(int i=2;i<101;i++){
        int tmp=sqrt(i);
        int count=0;
        for(int j=2;j<=tmp;j++){
            if(i%j==0){
                count=1;
                break;
            }

        }
        if(count==0){
            sushu[mark]=i;
            mark++;
        }
    }

    for(int i=0;i<mark;i++){
        printf("%d\n",sushu[i]);
    }
    printf("the total number is:%d\n",mark);
    return;
}

//对10个数进行排序
//程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。

void thirsecond(double*pre){
    for(int i=0;i<10;i++){
        double tmp;
        for(int j=0;j<(9-i);j++){
            if(pre[j]<pre[j+1]){
                tmp=pre[j];
                pre[j]=pre[j+1];
                pre[j+1]=tmp;
            }
        }
    }

    for(int i=0;i<10;i++){
        printf("%f\n",pre[i]);
    }
}

//题目:求一个3*3矩阵对角线元素之和
//程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
void thirthird(double pre[][3]){   //后面这个三表示一行有几个数字,
    double sum=0;
    for(int i=0;i<3;i++){
        sum=sum+pre[i][i];
    }
    printf("sum is %f\n",sum);
}
//题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
//程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
void thirforth(int *pre,int size,int number){
    int *after=(int*)malloc((size+1)*sizeof(int));
    if(number<=pre[size]){
        for(int i=0;i<size;i++){
            after[i]=pre[i];
        }
        after[size]=number;
    }else{
        for(int i=0;i<size;i++){
            if(number>=pre[i]){
                //number占i位,0~i-1,after和pre一样,i+1到size是pre[i-1]=after[i]
                after[i]=number;
                for(int j=0;j<(size+1);j++){
                    printf("%d\n",after[j]);
                }
                printf("\n");
                for(int j=0;j<i;j++){
                    after[j]=pre[j];
                }
                for(int j=0;j<(size+1);j++){
                    printf("%d\n",after[j]);
                }
                printf("\n");
                for(int j=(i+1);j<=size;j++){
                    after[j]=pre[j-1];
                }
                for(int j=0;j<(size+1);j++){
                    printf("%d\n",after[i]);
                }
                printf("\n");
            }

        }
    }

  //  for(int i=0;i<(size+1);i++){
  //      printf("%d\n",after[i]);
  //  }


}

//将一个数组逆序输出。
//程序分析:用第一个与最后一个交换
void thirfifth(int* pre,int number){
    printf("number/2 is:%d\n",number/2);
    int i;
    i=(double)(number/2);

    printf("the previous is:\n");
    for(int j=0;j<number;j++){
        printf("%d\n",pre[j]);
    }

    for(int j=0;j<i;j++){
       int tmp;
       tmp=pre[j];
       pre[j]=pre[number-1-j];
       pre[number-1-j]=tmp;
    }
    printf("the after is:\n");
    for(int j=0;j<number;j++){
       printf("%d\n",pre[j]);
    }
}



//学习static定义静态变量的用法
void static_fun(){
    int i=0;
    static int j=0;
    printf("i=%d\n",i);
    i++;
    printf("static j=%d\n",j);
    j++;
}

以下为头文件:

//  mywork.h
//  data_struct
//
//  Created by sdd on 17/8/22.
//  Copyright © 2017年 sdd. All rights reserved.
//

#ifndef mywork_h
#define mywork_h

#include <stdio.h>

//1234不重复的三位数,分别输出并计算总数
int first();
//某数+100,+168均为完全平方数,求这个值
int second();
//
int third(int year,int month,int day);

void fifth(int x,int y,int z);

void sixth();

void seventh();

void eighth();

int ninth(int month);//斐波那契数列

void tenth();//判断101到200之间有多少素数,并打印出来

void eleventh();//打印所有的水仙花数

int twelfth(unsigned int number);//将正整数分解质因数

int iszhishu(unsigned int a);

void thirteenth(unsigned int score);

void forteenth(int big, int small);

void fifteenth();

void sixteenth(int number,int mount);

void seventeenth();

void eighteenth();

void ninteenth();

void twentieth();
void twefirst();
void twesecond();
void twethird();
int tweforth(int number);
void twefifth();
int twesixth(int number);
void tweseventh(long int number);
void tweighth(long int number);
void tweninth(long int number);
int thirtieth();
void thirfirst();
void thirsecond(double*pre);
void thirthird(double pre[][3]);
void thirforth(int pre[],int size,int number);
void thirfifth(int* pre,int number);
void static_fun();

#endif /* mywork_h */
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值