C常见题型

** 从终端输入一个 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容