美文网首页
C常见题型

C常见题型

作者: pingui | 来源:发表于2016-02-25 16:23 被阅读137次

    ** 从终端输入一个 n ,求1+2+3+……+n结果。例如:输入5输出 1+2+3+4+5=15 **

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int i, n, sum= 0;
        scanf("%d", &n);
        for(i=1; i<=n; i++)
        {
            sum +=i;
            printf("%d",i);
            if(i < n)//将最后一次的+去掉
            {
                printf("+");
            }
        }
        printf("=%d\n",sum);
        return 0;
    }
    

    ** 分解质因数 120 = 22235 **

    ** 单层循环 **

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int num;
        scanf("%d", &num);
        printf("%d=",num);
        for(int i =2;i<num; )
        {
            if(num%i==0)
            {
                printf("%d*",i);
                num /= i;
            }
            else
            {
                i++;
            }
        }
        printf("%d\n", num);
        return 0;
    }
    

    ** 双重循环 **

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int num;
        scanf("%d", &num);
        printf("%d=",num);
        for(int i=2;i<num;i++)
        {
            while(num%i==0)
            {
                printf("%d*",i);
                num /= i;
                if(num==i)
                {
                    break;
                }
            }
        }
        printf("%d\n",num);
        return 0;
    }
    

    ** 输出n以内任意数范围内的的质数。注意输入使用scanf输入 **
    比如:
    输入 5 输出为
    2
    3
    5
    输入 3 输出为
    2
    3

    #include <stdio.h>
    int main(int argc, const char * argv[]) {
        int n=100;
        if (n<2) {
            printf("没有\n");
        }
        if (n==2) {
            printf("2\n");
        }
        if (n>2) {
            printf("2\n");
            for (int i=3; i<=n; i++) {
                for (int j=2; j<i; j++) {
                    if (i%j==0) {
                        break;
                    }
                    if (j==i-1) {
                        printf("%d\n",i);
                    }
                }
            }
        }
        return 0;
    }
    

    ** 定义一个字符数组,输入 10 个字符到数组中,将字符数组内容逐个输出,每个字符之间使用空格隔开 **
    输入:A B C D E F G H I J
    输出:A B C D E F G H I J

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        char ch[10]={0};//最好先清空
        char space;
        for(int i=0; i<10; i++)
        {
            scanf("%c%c",&ch[i], &space);//用space来接收空格
            printf("%c ",ch[i]);
        }
        return 0;
    }
    

    或者

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        char ch[10]={0};//最好先清空
        for(int i=0; i<10; i++)
        {
            scanf(" %c",&ch[i]);//第一次的空格会忽略
            printf("%c ",ch[i]);
        }
        return 0;
    }
    

    ** 倒序输出两个大写字母之间的字母序列。注意输入使用scanf输入 **
    比如:
    输入 U
    Y输出为
    Y
    X
    W
    V
    U
    输入 V
    X 输出为
    X
    W
    V

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        char c1,c2;
        int i;
        scanf("%c\n%c",&c1,&c2);//注意要加 \n
        for(i=c2;i>=c1;i--)
            printf("%c\n",i);
        return 0;
    }
    

    ** 输出数字序列2/1,3/2,5/3,8/5,13/8,21/13...,输出个数由键盘输入。注意输入使用scanf输入 **
    比如:
    输入 3输出为
    2/1
    3/2
    5/3

    输入 4 输出为
    2/1
    3/2
    5/3
    8/5

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int i, n;
        scanf("%d", &n);
        int a[n], b[n];
        a[0]=2; b[0]=1;
        a[1]=3; b[1]=2;
        if(n==1)
        {   
            printf("%d/%d\n",a[n-1],b[n-1]);
        }   
        if(n==2)
        {   
            printf("%d/%d\n",a[n-2],b[n-2]);
            printf("%d/%d\n",a[n-1],b[n-1]);
        }   
        if(n>2)
        {   
            for(i=0;i<n;i++)
            {   
                if(i>1)
                {   
                    a[i]=a[i-1]+a[i-2];
                    b[i]=b[i-1]+b[i-2];
                }   
                printf("%d/%d\n",a[i],b[i]);
            }   
        }
        return 0;
    }
    

    汉诺塔
      有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问该怎么移动?至少需要多少次?

    #include <stdio.h>
    
    void hanoi(int n, char a, char b, char c)
    {
        if (n > 0)
        {
            hanoi(n-1, a, c, b);
            printf("%c--->%c\n",a,b);
            hanoi(n-1, c, b, a);
        }
    }
    
    int main(int argc, char * argv[])
    {
        int N;
        printf("请输入需要移动的盘子数:");
        scanf("%d", &N);
        hanoi(N, 'A', 'B', 'C');
        return 0;
    }
    

    ** 递归求阶乘 **

    #include <stdio.h>
    double factorial(int n){
        if(n == 0 || n== 1) return 1;   //注意结束条件
        return n * factorial(n-1);
    }
    
    int main(int argc, char * argv[])
    {
        int a;
        printf("请输入一个数字:");
        scanf("%d", &a);
        printf("%d的阶乘为:%.0f\n", a, factorial(a));
        return 0;
    }
    

    ** 杨辉三角 **

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int num;
        printf("请输入需要打印的行数:");
        scanf("%d", &num);
        int a[num][num];
        for(int i=0; i<num; i++)
        {
            for(int j=0;j<=i;j++)
            {
                if(j==0 || j==i)
                {
                    a[i][j] = 1;
                }
                else
                {
                    a[i][j] = a[i-1][j] + a[i-1][j-1];
                }
                printf("%d\t",a[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    

    ** 打印 1、1、2、3、5、8、13...输入需要打印的个数 **

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int N;
        printf("请输入需要打印的个数:");
        scanf("%d",&N);
        int a[N];
        a[0] = 1;
        a[1] = 1;
        for(int i=2; i<N;i++)
        {
            a[i] = a[i-1] +a[i-2];
        }
        for(int i=0; i<N; i++)
        {
            printf("%d ",a[i]);
        }
        printf("\n");
        return 0;
    }
    

    ** 统计色子各个点出现的次数 **

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main(int argc, char * argv[])
    {
        srand(time(0));     //随机数的种子
        int n = 6000;       //摇色子的次数
        int nums[6]={0};
        for(int i=0; i<n;i++)
        {
            int num = rand() % 6 +1;//产生1 ~ 6 的随机数
            nums[num -1]++;
        }
        for(int i=1; i<=6;i++)
        {
            printf("%d点出现的次数%d\n",i,nums[i-1]);
        }
        return 0;
    }
    

    ** Craps游戏 **
      摇色字游戏:第一次:7、11玩家胜;2、3、12庄家胜;其他点数游戏继续。在继续的过程中,如果摇出了7点,庄家胜;如果摇出了第一次摇的点数,玩家胜。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    typedef int BOOL;
    
    static const int YES = 1;
    static const int NO = 0;
    
    // 摇两颗色子返回点数之和
    int roll_two_dice() {
        int face1 = rand() % 6 + 1;
        int face2 = rand() % 6 + 1;
        return face1 + face2;
    }
    
    int main() {
        srand((unsigned int)time(0));
        int money = 1000;
        do {
            printf("你的余额为: %d\n", money);
            int debt = 0;
            do {
                printf("请下注: ");
                scanf("%d", &debt);
            } while (debt <= 0 || debt > money);
            BOOL go_on = NO;
            int first_point, current_point;
            first_point = current_point = roll_two_dice();
            printf("玩家摇出了%d点\n", current_point);
            switch(current_point) {
                case 7: case 11:
                    money += debt;
                    printf("玩家胜!!!\n");
                    break;
                case 2: case 3: case 12:
                    money -= debt;
                    printf("庄家胜!!!\n");
                    break;
                default:
                    go_on = YES;
                    break;
            }
            while (go_on) {
                current_point = roll_two_dice();
                printf("玩家摇出了%d点\n", current_point);
                if (current_point == 7) {
                    money -= debt;
                    printf("庄家胜!!!\n");
                    go_on = NO;
                }
                else if (current_point == first_point) {
                    money += debt;
                    printf("玩家胜!!!\n");
                    go_on = NO;
                }
            }
        } while (money > 0);
        printf("你已经破产, 游戏结束!!!\n");
        return 0;
    }
    

    图案打印

    ** 用for:输出图形,底边长n。后一行比前一行多一个星号**

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int i, j, n;
        scanf("%d", &n);
        for(i=0; i<n; i++)
        {
            for(j=0; j<=i; j++)
            {
                printf("*");
            }
            printf("\n");
        }
        return 0;
    }
    

    ** 输入一个大写字母,如 F,输出 **
    比如:
    输入:F
    输出:
    F
    EFE
    DEFED
    CDEFEDC
    BCDEFEDCB
    ABCDEFEDCBA

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int i, j, t;
        char ch1, ch = 'A';
        scanf("%c", &ch1);
        t = ch1 - ch + 1;
        for(i=0; i<t; i++)
        {
            for(j=0; j<2*i+1;j++)
            {
                if(j<i)
                    printf("%c",ch1-i+j);
                else
                    printf("%c",ch1-j+i);
            }
            printf("\n");
        }
        return 0;
    }
    

    ** 输入一个大写字母,如F **
    比如:
    输入:F
    输出:
    A
    ABA
    ABCBA
    ABCDCBA
    ABCDEDCBA
    ABCDEFEDCBA

    #include <stdio.h>
    int main(int argc, char * argv[])
    {    
        char ch1, ch = 'A';
        int i, j, t;
        scanf("%c",&ch1);
        t = ch1 - ch + 1;
        for(i=0; i<t; i++)
        {
            for(j=0; j<2*i+1; j++)
            {
                if(j<i)
                    printf("%c",ch+j);
                else
                    printf("%c",ch+2*i-j);
            }
            printf("\n");
        }
        return 0;
    }
    

    ** 在屏幕上输出以下图形(等腰三角形),行数由输入的数字来控制 **

    #include <stdio.h>
    int main(int argc, char * argv[]) 
    {
        int n;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<2*n-1; j++)
            {
                if(j>=n-1-i && j<=n-1+i)
                    printf("*");
                else
                    printf(" ");
            }
                printf("\n");
        }
        return 0;
    }
    

    ** 在屏幕上输出以下图形(等腰三角形的外框),行数由输入的数字来控制 **

    #include <stdio.h>
    int main(int argc, char * argv[]) 
    {
        int n;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
                if(i<n-1)
                {
                    for(int j=0; j<2*n-1; j++)
                        {
                            if(j==n-i-1 || j==n+i-1)
                            printf("*");
                            else
                            printf(" ");
                        }
                }
                if(i==n-1)
                {
                    for(int j=0; j<n; j++)
                    {
                        printf("* ");
                    }
                }
                printf("\n");
        }
        return 0;
    }
    

    字符串函数

    ** strlen计算字符串有效长度 **

    int  mystrlen(const char *c){
        if (c == NULL) {
            return -1;
        }
        else
        {
            int n=0;
            while (*c++ != 0){
                n++;
            }
            return n;
        }
    }
    

    ** strcpy字符串复制 **

    char *mystrcpy(char *dest, const char *src){
          //方法一:
        int i=0;
        while (src[i]){
            dest[i] = src[i];
            i++;
        }
         return dest;
        
        //方法二:
        if (dest==NULL || src == NULL) {
            return NULL;
        }//不能为空,只要有一个为空都不行
        while (*src) {
            *dest++ = *src++;//*src++ = *(src++);
            }
        *dest = '\0';
        return dest;
    }
    

    ** myatoi将字符串转换成整数 **
    ** mystrcmp比较两个字符串的大小 **

    int mystrcmp(const char *s1, const char *s2){
    //    int j=0,i=0;
    //    while (s1[i]==s2[i]){
    //        if (s1[i]==0) {
    //            return j;
    //        }
    //        i++;
    //    }
    //    j=s1[i]-s2[i];
    //    return j;
    
        int ret=0;
        while ((*s1!=0) || (*s2!=0)) {
            if(*s1!=*s2){
                ret = *s1-*s2;
            }
            s1++;
            s2++;
        }
        return ret;
    }
    
    int mystrcmp2(const char *s1, const char *s2){
        while((*s1!=0)&&(*s2!=0)&&(*s1==*s2)){
            s1++;
            s2++;
        }
        return *s1-*s2;
    }
    

    ** mystrcat字符串连接 **
    ** mystrstr查找字符串 **

    ** 定义一个字符数组c[10],并初始化数组,将字符数组内容倒序输出。。注意输入使用scanf输入 **
    比如:
    输入
    asdf
    输出为
    fdsa

    #include <stdio.h>
    
    int main(int argc, const char * argv[]) {
        char c[10]={0};
        int i;
        for (i=0; i<10; i++) {
            scanf("%c",&c[i]);
        }
        for (i=9; i>=0; i--) {
            if(c[i]!='\0')
                printf("%c",c[i]);
        }
        return 0;
    }
    

    ** 定义一个有5个元素的整型数组a,并终端输入初始化值,再定义一个有5个元素的一维指针数组p。并将p数组中的每个指针变量指向a数组中对应的元素值,然后剩用p数组将a数组中的值输出来。 **
    比如:
    输入5 6 8 3 4
    输出为
    5
    6
    8
    3
    4

    #include <Stdio.h>
    int main(int argc, char * argv[])
    {
        int a[5];
        int i;
        for (i=0; i<5; i++) {
            scanf("%d",&a[i]);
        }
        int *p[5];
        for (i=0; i<5; i++) {
            p[i]=&a[i];
        }
        for (i=0; i<5; i++) {
            printf("%d\n",*p[i]);
        }
        return 0;
    }
    

    ** 找出 100 以内 7 的倍数 **

    #include <stdio.h>
    int main(int argc, char * argv[])
    {
        int a=1;
        while(7 * a < 100)
        {
            printf("%d\n",7 * a);
            a++;
        }
        return 0;
    }
    

    ** 数组排序 **

    // 9 1 2 3 4 5 6 7 8

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

    // 9 2 3 4 5 6 7 8 1

    输入字符的处理
    第一种情况:

    int main(int argc, const char * argv[]) {
        char ch;
        do{
            printf("输入正确\n");
            scanf("%c",&ch);
        }while(ch=='Y' || ch == 'y');
        return 0;
    }
    

    第二种情况:

    int main(int argc, const char * argv[]) {
        char ch, jy;
        do{
            printf("输入正确\n");
            scanf("%c%c",&ch,&jy);
        }while(ch=='Y' || ch == 'y');
        return 0;
    }
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            int a = 6, b = 2;
            printf("%d\n",a / b);       //3
            
            int a1 = 6, b1 = 0;
            printf("%d", a1 / b1);      //不能输出
            
            double a2 = 6, b2 = 2;
            printf("%lf\n", a2 / b2);   //3.000000
            
            double a3 = 6, b3 = 0;
            printf("%lf\n", a3 / b3);   //inf
            
            double a4 = 6, b4 = -0;
            printf("%lf\n", a4 / b4);   //inf
            
            double a5 = 0, b5 = 0;
            printf("%lf\n", a5 / b5);   //nan
            
            double a6 = -0, b6 = 0;
            printf("%lf\n", a6 / b6);   //nan
            
            double a7 = -0, b7 = -0;
            printf("%lf\n", a7 / b7);   //nan
        }
            return 0;
    }
    

    ** 比较下面两段代码的输出结果 **

    #include <Stdio.h>
    #include "unistd.h"
    
    int main(int argc, char * argv[])
    {   
        while(1){
            printf("hello, world");
            usleep(10000);
        }
        return 0;
    }
    
    #include <Stdio.h>
    #include "unistd.h"
    
    int main(int argc, char * argv[])
    {   
        while(1){
            printf("hello, world\n");
            usleep(10000);
        }
        return 0;
    }
    

    运行结果:
      第一段代码:等待缓冲区填满之后输出一长串 hello,world
      第二段代码每过0.01s输出一次 hello,world

    相关文章

      网友评论

          本文标题:C常见题型

          本文链接:https://www.haomeiwen.com/subject/jigikttx.html