牛客网编程初学者入门训练讲解(C语言)

 

 以十进制显示数字,使用%d;以八进制 显示数字,使用%o;以十六进制显示数字,使用%x。另外,要显示各进制数的前缀0、0x和0X,必须使用%#o、%#x、%#X。 ——《C Primier Plus》第六版

#include<stdio.h>

int main()
{
    printf("%#o %#0X", 1234, 1234);
    return 0;
}

反向输出四位数

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	while(n)
	{
		printf("%d", n % 10);
		n /= 10;
	}
	printf("\n");

	return 0;
}

 

C语言中有一个函数:getchar( )——获取一个字符,输入一个字符。

C语言还有一个函数:putchar( )——输出一个字符,打印一个字符。

关于字符@!~,但是计算机中存储的是二进制,所以要给这些字符编码比如A:65,a:97。这些数字叫ASCII码。

#include <stdio.h>

int main()
{
	int ch = 0;
	ch = getchar();
	putchar(ch);
	return 0;
}

此处ch为整型,输入一个字符时,将ASCII码赋值到ch中,如A就是65,然后putchar会将ASCII码转化成对应的字符输出。

#include <stdio.h>

int main()
{
	int ch = 0;
	ch = getchar();
	putchar(ch+32);
	return 0;
}

A:65 a:97,差32,所以大小写转化只需要多加32.

特点:只能接收一个字符!

#include <stdio.h>

int main()
{
	int ch = 0;
	while(ch = getchar())
	{
		putchar(ch + 32);
	}
	return 0;
}

 比如输入A,A此时在输入缓冲区中,但是没有送给getchar,还要加上回车才能给它,即A\n。

A变成a后,因为循环又从输入缓冲区中看到了\n(10),加上32为'*'。

因为while循环,会一直让你输入。

是不是不舒服。

#include <stdio.h>

int main()
{
	int ch = 0;
	while(ch = getchar())
	{
		putchar(ch + 32);
		getchar();
	}
	return 0;
}

 只需要再加个getchar()把\n吃掉就好了!

不过,这个循环会让你一直输入,是个无底洞。

#include <stdio.h>

int main()
{
	int ch = 0;
	while((ch = getchar()) != EOF)
	{
		putchar(ch + 32);
		getchar();
	}
	return 0;
}

getchar函数在文件读取错误或者文件结束时,返回EOF(End of file),通常放在文件的末尾。

要想停止,只要ctrl+z就行了。

#include <stdio.h>

int main()
{
    int ch = 0;
    while((ch = getchar()) != EOF)
    {
        printf("%c\n", ch+32);
        getchar();
    }
    return 0;
}

 

%15d的效果是靠着右边的墙排排站。

#include <stdio.h>
int main()
{
	printf("%#X\n", 0xABCDEF);
    return 0;
}

 十六进制为%X或%x,#用于显示前导的0X或0x.

printf函数返回的是:打印在屏幕上的字符的个数。

#include <stdio.h>

int main()
{
	int ret = printf("hehe");
	printf("%d\n", ret);
	return 0;
}

 

#include <stdio.h>

int main()
{
    printf("\n%d", printf("Hello world!"));
    return 0;
}

先调第一个printf1函数,那么它的值是后面一个printf2,printf2先打印Hello world!,再返回返回值为打印的字符的个数,再换行打印printf1。

 

        有小数最好用double,虽然还有float,但是浮点数默认都是double类型,而且double类型的数值范围比float大很多,推荐使用double。

        C语言编程时常量写为0时,系统默认其是一个整型常量int,写0.0时系统默认其是双精度浮点型常量double。

        %f为单精度类型的数据(占4个字节),而%lf为双精度类型的数据(占8个字节)。超出范围会四舍五入。

        %.2f,%.2lf代表小数点后保留2位小数。

#include <stdio.h>

int main()
{
    int id = 0;
    double c_score = 0.0;
    double math_score = 0.0;
    double eng_score = 0.0;
    scanf("%d;%lf,%lf,%lf", &id, &c_score, &math_score, &eng_score);
    printf("The each subject score of  No. %d is %.2lf, %.2lf, %.2lf.", id, c_score, math_score, eng_score);
    return 0;
}

输入 17140216;80.845,90.55,100.00

 double类型,float类型在存储时会有精度丢失,所以四舍五入的答案不对。

那为什么会有精度丢失呢?

        是因为我们输入时是十进制,但是在计算机内部计算时需要先转换成二进制。

参考:如何理解double精度丢失问题? - 知乎

比如把0.1转换成二进制,0.1 = 1 / 10。那么二进制就是0.1 = 1 / 1010 = 0.0001100110011……,放进double类型中。

  • 半精度(16bit):11 位有效数字
  • 单精度(32bit):24 位有效数字
  • 双精度(64bit):53 位有效数字
  • 四精度(128bit):113 位有效数字

//关于有效数字,我不会算。看到的有懂的说一下!

双精度的有效数字为53位,那么最后的数怎么办呢?待处理部分有没有达到前一位的一半,达到就进位,没达到就舍去。也就是说0舍1入。

然后再将二进制数转换为十进制,十进制就会有误差。

//荒废了几天,一点都没有学习,痛恨!反思!立马调整状态。

 

#include <stdio.h>

int main()
{
    int id = 0;
    float c_score = 0.0;
    float math_score = 0.0;
    float eng_score = 0.0;
    scanf("%d;%f,%f,%f", &id, &c_score, &math_score, &eng_score);
    printf("The each subject score of  No. %d is %.2f, %.2f, %.2f.", id, c_score, math_score, eng_score);
    return 0;
}

#include <stdio.h>

int main()
{
    int ch = 0;
    while((ch = getchar()) != EOF)
    {
        if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
        getchar();
    }
    
    return 0;
}

1)首先是判断大小写,‘a’被单引号引起来的字母,是它的ASCII码值。所以int类型的ch能与之判断。在‘a’和‘z’之间的为小写或者是在‘A’和‘Z’之间的是大写。注意一定要写成或者。

或者用isalpha函数来判断一个字符是不是字母,是返回真,否为0.

要加上头文件#include <ctype.h>

2)getchar函数一次只能获取一个字符,当输入H回车时就会有两个字符,即H和\n,所以要在下面再加上一个getchar()把换行吃掉,一定要注意!不要忘了隐身的,孤独的换行符。

3)getchar函数的返回值为整型!

 

#include <stdio.h>

int main()
{
    char ch = 0;
    int i = 0;
    ch = getchar();
    for(i=0; i<5; i++)
    {
        int j = 0;
        for(j=0; j<4-i; j++)
        {
            printf(" ");
        }
        for(j=0; j<=i; j++)
        {
            printf("%c ", ch);
        }
        printf("\n");
    }
    return 0;
}

 一行行来处理,让问题变得简单。

C语言规定:变量定义在当前代码块的最前面。

代码块为大括号的位置。

#include <stdio.h>

int main()
{
	char arr[] = {73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for(i=0; i<sz; i++)
	{
		printf("%c", arr[i]);
	}
    return 0;
}

 放到char类型的一维数组中好处理,注意长度的计算,一维数组是没有‘\0’的,字符串才有,所以照常计算,sizeof(arr)为1*个数/1 = 个数。

#include <stdio.h>

int main()
{
    int year = 0;
    int month = 0;
    int date = 0;
    scanf("%4d%2d%2d", &year, &month, &date);
    printf("year=%4d\nmonth=%02d\ndate=%02d\n", year, month, date);
}

输入需要指定域宽,所以要给定列数的大小,输出时也要注意补0,用%0#d,当#位的数字不足时,补0.

#include <stdio.h>

int main()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        printf("%d\n", 1<<n);
    }
    return 0;
}

 

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 0;
    scanf("a=%d,b=%d", &a, &b);
    printf("a=%d,b=%d\n", b, a);
    return 0;
}

#include <stdio.h>

int main()
{
    char ch = 0;
    scanf("%c", &ch);
    printf("%d\n", ch);
    return 0;
}

注:字符的输入有两种

1)scanf("%c", &ch);、、不要忘记前面是%c

2)ch = getchar();

#include <stdio.h>

int main()
{
    int weight = 0;
    int height = 0;
    scanf("%d %d", &weight, &height);
    printf("%.2lf\n", weight / ((height / 100.0) * (height / 100.0)));
    return 0;
}

注意BMI的计算方式:体重公斤数除以身高米数平方。输入的单位为公斤和厘米,所以后者需要转换,并要精确计算,所以是height / 100.0 = 1.7,然后是它的平方。

最后别忘了保留小数点后两位,%.2lf.

 题目的要求一定要认真看清楚!

#include <stdio.h>
#include <math.h>

int main()
{
    double a = 0.0;
    double b = 0.0;
    double c = 0.0;
    double circumference = 0.0;
    double area = 0.0;
    scanf("%lf %lf %lf", &a, &b, &c);
    circumference = a+b+c;
    double p = circumference / 2;
    area = sqrt(p*(p-a)*(p-b)*(p-c));
    printf("circumference=%.2lf area=%.2lf\n", circumference, area);
    return 0;
}

输出中是浮点型,所以边长要定为浮点型,初始化为0.0。

一定要保持一遍的正确率,用了sqrt就要看有没有头文件。

%.2lf是小数点后2位,默认是小数点后6位。

 

#include <stdio.h>
#define PI 3.1415926

int main()
{
    double r = 0.0;
    scanf("%lf", &r);
    double v = 0.0;
    v = 4.0/3*PI*r*r*r;
    printf("%.3lf\n", v);
    return 0;
}

 注意:4/3两边都为int型,所以值为1,并不精确所以要变成4.0/3

 次方也能用pow函数

#include <stdio.h>
#include <math.h>

int main()
{
	int num = (int)pow(2, 6);
	printf("num = %d\n", num);
	return 0;
}

pow的返回值为double类型,强制类型转换一下。

 

#include <stdio.h>

int main()
{
    int score1 = 0;
    int score2 = 0;
    int score3 = 0;
    scanf("%d %d %d", &score1, &score2, &score3);
    printf("score1=%d,score2=%d,score3=%d\n", score1, score2, score3);
    return 0;
}

如果还有多组输入,那么怎么更加简便呢?

#include <stdio.h>

int main()
{
    int score[3] = {0};
    int i = 0;
    for(i=0; i<3; i++)
    {
        scanf("%d", &score[i]);
    }
    printf("score1=%d,score2=%d,score3=%d\n", score[0], score[1], score[2]);
    return 0;
}

 数组从0开始索引。

#include <stdio.h>

int main()
{
    int i = 0;
    for(i=10000; i<=99999; i++)
    {
        int j = 0;
        int sum = 0;
        for(j=10; j<=10000; j*=10)
        {
            sum += (i%j) * (i/j);
        }
        if(sum == i)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

 注意:sum += (i%j) * (i/j);

i%和i/的是变动的值,不是10和其它固定的值。

#include <stdio.h>

int main()
{
    unsigned a = 0;
    unsigned b = 0;
    scanf("%d %d", &a, &b);
    int sum = (a%100 + b%100) % 100;
    printf("%d\n",sum);
    return 0;
}

 只保留数的后两位,那么a 和 b,直接a%100,b%100,如果结果大于等于100,就相加再%100。不需要判断。写成(a+b)%100也是对的。

#include <stdio.h>

int main()
{
    double f = 0.0;
    scanf("%lf", &f);
    printf("%d\n", (int)f%10);
    return 0;
}
#include <stdio.h>

int main()
{
    int d = 0;
    scanf("%d", &d);
    printf("%d\n", d%10);
    return 0;
}

#include <stdio.h>

int main()
{
    int age = 0;
    scanf("%d", &age);
    long seconds = 3.156e7 * age;
    printf("%ld\n", seconds);
    return 0;
}

3.156e7是一个很大的整数,要用long类型,随之变成%ld。

e是exponent(指数)的缩写,即10的多少次。

long long类型是%lld.

 

#include <stdio.h>

int main()
{
    int seconds = 0;
    int h = 0;
    int m = 0;
    int s = 0;
    scanf("%d", &seconds);
    h = seconds / 60 / 60;
    m = seconds / 60 % 60;
    s = seconds % 60;
    printf("%d %d %d\n", h, m, s);
    return 0;
}

 

#include <stdio.h>

int main()
{
    int i = 0;
    double score = 0.0;
    double sum = 0.0;
    for(i=0; i<3; i++)
    {
        scanf("%lf", &score);
        sum += score;
    }
    printf("%.2lf %.2lf\n", sum, sum/3);
}

别忘了double类型是%lf,和小数点的要求。

 

#include <stdio.h>

int main()
{
    int n = 0;
    int h = 0;
    int m = 0;
    while(scanf("%d %d %d", &n, &h, &m) != EOF)
    {
        if(m % h)
        {
            printf("%d\n", n-m/h-1);
        }
        else
        {
            printf("%d\n", n-m/h);
        }
    }
    return 0;
}

假设只给了一分钟,总共有8瓶,那么一分钟已经打开了一瓶,所以还剩下7瓶。

也就是说还有可能在喝的途中。

 

参考:有趣的问题,C语言中的十六进制数字为什么以前缀0x开头呢?

        0是为了告诉编译器它是个数字,然后还有0在前面没有影响。

        十六进制的前缀 0x 或者 0X 中的 0 是用于告诉编译器这是一个数字,这有一点点历史渊源在里面,也有一些好处。而 x 则可以认为是任意选择的符号(hexcimal)了。 

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 0;
    scanf("%x %o", &a, &b);
    printf("%d\n", a+b);
    return 0;
}

 %x十六进制的数据控制格式

%o八进制的数据控制格式

#include <stdio.h>

int main()
{
    double money = 0.0;
    int month = 0;
    int day = 0;
    int flag = 0;
    scanf("%lf %d %d %d", &money, &month, &day, &flag);
    if(month == 11 && day == 11)
    {
        money *= 0.7;
    }
    else if(month == 12 && day == 12)
    {
        money *= 0.8;
    }
    money -= flag*50.0;
    if(money < 0.0)
    {
        money = 0.0;
    }
    printf("%.2lf\n", money);
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    int arr[40] = {0};
    int i = 0;
    scanf("%d", &n);
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for(i=0; i<n-1; i++)
    {
        int j = 0;
        for(j=0; j<n-1-i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    for(i=n-1; i>=n-5; i--)
    {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

 二法,可以使用C语言的库函数qsort(quick sort)

#include <stdio.h>
#include <stdlib.h>

int cmp_int(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[40] = {0};
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    qsort(arr, n, sizeof(arr[0]), cmp_int);
    for(i=n-1; i>=n-5; i--)
    {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

注意:1)函数定义一定要写返回值int。

2)关于空指针为什么要用const,一是防止自己误修改了不能修改的对象的值,二是使代码重用时可以确定哪些对象不可以修改。

3)函数默认是升序,降序就e2在前。

 关于函数gets(字符串),中的s是string的首字母,为字符串的意思,即输入一串字符。

#include <stdio.h>

int main()
{
    char buf[100] = {0};
    gets(buf);
    int i = 0;
    int count_a = 0;
    int count_b = 0;
    while(buf[i] != '0')
    {
        if(buf[i] == 'A')
        {
            count_a++;
        }
        else if(buf[i] == 'B')
        {
            count_b++;
        }
        i++;
    }
    if(count_a > count_b)
    {
        putchar('A');
    }
    else if(count_a < count_b)
    {
        putchar('B');
    }
    else
    {
        putchar('E');
    }
    return 0;
}

#include <stdio.h>

int main()
{
    char buf[100] = {0};
    gets(buf);
    int i = 0;
    int flag = 0;
    while(buf[i] != '0')
    {
        if(buf[i] == 'A')
        {
            flag++;
        }
        else if(buf[i] == 'B')
        {
            flag--;
        }
        i++;
    }
    if(flag > 0)
    {
        putchar('A');
    }
    else if(flag < 0)
    {
        putchar('B');
    }
    else
    {
        putchar('E');
    }
    return 0;
}

用一个变量来计数。

#include <stdio.h>

int main()
{
    int ch = 0;
    int flag = 0;
    while(((ch = getchar()) != '0') && ch != EOF)
    {
        if(ch == 'A')
        {
            flag++;
        }
        else if(ch == 'B')
        {
            flag--;
        }
    }
    if(flag > 0)
    {
        printf("A\n");
    }
    else if(flag < 0)
    {
        printf("B\n");
    }
    else
    {
        printf("E\n");
    }
    return 0;
}

 getchar()一个一个字符读取,所以要加上!=EOF,来避免死循环。

#include <stdio.h>

int main()
{
    int num = 0;
    while(~scanf("%d", &num))
    {
        if(num >= 140)
        {
            printf("Genius\n");
        }
    }
    return 0;
}

 ~为按位取反操作符。

当scanf函数发生错误时返回-1.

而整数在内存中存储的是补码。

原因1)在原码和反码中+0和-0的表示不相同。

2)补码可以使减法变成加法,不需要额外的硬件电路。

#include <stdio.h>

int main()
{
    int s1 = 0;
    int s2 = 0;
    int s3 = 0;
    while(scanf("%d %d %d", &s1, &s2, &s3) != EOF)
    {
        int max = s1 > s2 ? s1 : s2;
        max = max > s3 ? max : s3;
        printf("%d\n", max);
    }
    return 0;
}

 s1和s2先比,得出较大值再与s3比,比s3大则为最大值,否则s3最大。

#include <stdio.h>

int main()
{
    int num[3] = {0};
    while(scanf("%d%d%d", &num[0], &num[1], &num[2]) != EOF)
    {
        int max = num[0];
        int i = 0;
        for(i=1; i<3; i++)
        {
            if(num[i] > max)
            {
                max = num[i];
            }
        }
        printf("%d\n", max);
    }
    return 0;
}

 这种写法就相当于打擂台,假设0是李小龙,其他是班上的学生,那么一个学生也打不过他,所以要先选个学号为1的学生。

#include <stdio.h>

int main()
{
    int ch = 0;
    while((ch = getchar()) != EOF)
    {
        if(ch=='A' || ch=='a' || ch=='E' || ch=='e' || ch=='I' || ch=='i' || ch=='O' || ch=='o' || ch=='U' || ch=='u') 
        {
            printf("Vowel\n");
        }
        else
            printf("Consonant\n");
        getchar();
    }
    return 0;
}

参考:C语言返回类型为int,C语言中getchar()的返回类型为什么是int详解_Youlink L的博客-CSDN博客

EOF值是多少?_百度知道

关于((ch = getchar()) != EOF),ch声明为整型的问题_talent_CYJ-CSDN博客

注意1) 各种数据类型能表示的数值范围由编译器决定。char类型在有些编译器中定义的范围为0~255,另外一些编译器中定义的范围为-128~127。当编译器中定义的范围为0~255时,用char接收getchar()返回值时就会出错。

        将int改为char后能在我的电脑上正常编译,时由于我的编译器中定义的范围为-128~127,当用char接收时会隐式的转化为char类型。

        即使编译器总定义的范围为-128~127,程序也有可能出错。虽然常见字符到127位就结束了。但是ASCII表中分配到的时256。128~256为拓展字符,如常用的欧元符号等均在内。

        综上:getchar()返回的内容用更大范围区间的int型接收,才能使程序更加稳健。

2)关于EOF,在while循环中以EOF作为文件结束标志。ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。 

3)详解while((ch = getchar()) != EOF)_a312568的博客-CSDN博客

4) 关于为什么是(ch = getchar()) != EOF,原因是如果是ch = getchar() != EOF,由于!=的优先级高于=,那么先判断getchar() != EOF,返回0或1,再赋值给ch。

#include <stdio.h>

int main()
{
    int ch = 0;
    char vowel[] = "AaEeIiOoUu";
    while((ch = getchar()) != EOF)
    {
        int i = 0;
        for(i=0; i<10; i++)
        {
            if(vowel[i] == ch)
            {
                printf("Vowel\n");
                break;
            }
        }
        if(i == 10)
        {
            printf("Consonant\n");
        }
        getchar();
    }
    return 0;
}

        由于getchar()是缓冲输入,所以要按下Enter键后才会打印,而按下Enter后,‘\0’会存入缓冲区中,等待下一次的输出,所以我们要再写一个getchar()将不必要的读走。

        还可以用库函数strchr,cat->coalition,chr并非一个单词,而是search char的结合,好像wintel是windows和intel的结合一样。

        strchr(字符串,字符),包含头文件string.h.

        strchr用来判断在字符串当中有没有这个字符,如果有返回所在的地址,没有则返回NULL。

#include <stdio.h>
#include <string.h>

int main()
{
    int ch = 0;
    char vowel[] = "AaEeIiOoUu";
    while((ch = getchar()) != EOF)
    {
        if(strchr(vowel, ch))
        {
            printf("Vowel\n");
        }
        else
        {
            printf("Consonant\n");
        }
        getchar();
    }
    return 0;
}
#include <stdio.h>
#include <string.h>

int main()
{
    int ch = 0;
    char vowel[] = "AaEeIiOoUu";
    while(scanf("%c", &ch) != EOF)
    {
        if(strchr(vowel, ch))
        {
            printf("Vowel\n");
        }
        else
        {
            printf("Consonant\n");
        }
        getchar();
    }
    return 0;
}
#include <stdio.h>
#include <string.h>

int main()
{
    int ch = 0;
    char vowel[] = "AaEeIiOoUu";
    while(scanf(" %c", &ch) != EOF)
    {
        if(strchr(vowel, ch))
        {
            printf("Vowel\n");
        }
        else
        {
            printf("Consonant\n");
        }
    }
    return 0;
}

scanf("空格%c", &ch)在%c前加个空格,会消化掉前面所有的看不见的字符,然后读取一个字符。

#include <stdio.h>
#include <string.h>

int main()
{
    int ch = 0;
    char vowel[] = "AaEeIiOoUu";
    while(scanf("%c\n", &ch) != EOF)
    {
        if(strchr(vowel, ch))
        {
            printf("Vowel\n");
        }
        else
        {
            printf("Consonant\n");
        }
    }
    return 0;
}

在%c后面放一个\n,会消化掉这个\n字符。

#include <stdio.h>

int main()
{
    int ch = 0;
    while(scanf(" %c", &ch) != EOF)
    {
        if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
        {
            printf("%c is an alphabet.\n", ch);
        }
        else
        {
            printf("%c is not an alphabet.\n", ch);
        }
    }
    return 0;
}

注意:printf这个函数,写了%c,后面要对就相应的内容。非常傻的错误 0.0

#include <stdio.h>
#include <ctype.h>

int main()
{
    int ch = 0;
    while(scanf(" %c", &ch) != EOF)
    {
        if(isalpha(ch))
        {
            printf("%c is an alphabet.\n", ch);
        }
        else
        {
            printf("%c is not an alphabet.\n", ch);
        }
    }
    return 0;
}

还可以用函数isalpha(alphabet就是字母表的意思),要包含头文件ctype.h,就是C语言中的类型的意思。

 

#include <stdio.h>
#include <ctype.h>

int main()
{
    int ch = 0;
    while(scanf("%c\n", &ch) != EOF)
    {
        if(isupper(ch))
        {
            printf("%c\n", ch+32);
        }
        else if(islower(ch))
        {
            printf("%c\n", ch-32);
        }
    }
    return 0;
}

有isupper判断是否为大写字母,而islower判断是否为小写字母。

#include <stdio.h>
#include <ctype.h>

int main()
{
    int ch = 0;
    while(scanf("%c\n", &ch) != EOF)
    {
        if(isupper(ch))
        {
            printf("%c\n", tolower(ch));
        }
        else if(islower(ch))
        {
            printf("%c\n", toupper(ch));
        }
    }
    return 0;
}

还可以用tolower()和toupper()来转换大小写哦~

不要忘记包含头文件ctype.h哟!

一定要细心点,嗯。 

#include <stdio.h>

int main()
{
    int t = 0;
    while(scanf("%d", &t) != EOF)
    {
        if(t > 0)
        {
            printf("1\n");
        }
        else if(t == 0)
        {
            printf("0.5\n");
        }
        else
        {
            printf("0\n");
        }
    }

    return 0;
}

 这个不需要处理换行,因为scanf是%d的形式,所以不会读取字符型。

 

#include <stdio.h>

int main()
{
    int weight = 0;
    int height = 0;
    while(~scanf("%d %d", &weight, &height))
    {
        double BMI = weight / ((height/100.0)*(height/100.0));
        if(BMI < 18.5)
        {
            printf("Underweight\n");
        }
        else if(BMI <= 23.9)
        {
            printf("Normal\n");
        }
        else if(BMI <= 27.9)
        {
            printf("Overweight\n");
        }
        else
        {
            printf("Obese\n");
        }
    }
    return 0;
}

注意:height/100时会丢失精度所以要变成浮点型->height/100.0

 

这个三角形的符号是判别式(discriminant);

#include <stdio.h>
#include <math.h>

int main()
{
    double a = 0.0;
    double b = 0.0;
    double c = 0.0;
    while(~scanf("%lf %lf %lf", &a, &b, &c))
    {
        if(a == 0.0)
            printf("Not quadratic equation\n");
        else
        {
            double d = b*b - 4*a*c;
            if(d == 0.0)
            {
                printf("x1=x2=%.2lf\n", -b/(2*a));
            }
            else if(d>0.0)
            {
                printf("x1=%.2lf;x2=%.2lf\n", (-b-sqrt(d))/(2*a), (-b+sqrt(d))/(2*a));
            }
            else
            {
                printf("x1=%.2lf-%.2lfi;x2=%.2lf+%.2lfi\n", -b/(2*a), sqrt(-d)/(2*a), -b/(2*a), sqrt(-d)/(2*a));
            }
        }
    }
    
    return 0;
}

关于double为什么要和0.0不是0,是因为0.0是double型的,而0是int型。

 

 我的代码

#include <stdio.h>

int main()
{
    int year = 0;
    int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31,30,31};
    int mon = 0;
    while(~scanf("%d %d", &year, &mon))
    {
        if(((year%400==0) || (year%4==0&&year%100!=0)) && mon==2)
            printf("%d\n", month[2]+1);
        else
            printf("%d\n", month[mon]);
    }
    return 0;
}

#include <stdio.h>

int main()
{
    double n1 = 0.0;
    double n2 = 0.0;
    char ch = 0;
    while(~scanf("%lf %c %lf", &n1, &ch, &n2))
    {
        if(ch == '+')
        {
            printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1+n2);
        }
        else if(ch == '-')
        {
            printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1-n2);
        }
        else if(ch == '*')
        {
            printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1*n2);
        }
        else if(ch == '/')
        {
            if(n2 == 0.0)
            {
                printf("Wrong!Division by zero!\n");
            }
            else
            {
                printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1/n2);
            }
        }
        else
        {
            printf("Invalid operation!\n");
        }
    }
    return 0;
}
#include <stdio.h>

int main()
{
    double n1 = 0.0;
    double n2 = 0.0;
    char ch = 0;
    while(~scanf("%lf %c %lf", &n1, &ch, &n2))
    {
        switch(ch)
        {
            case '+':
                printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1+n2);
            break;
            case '-':
                printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1-n2);
            break;
            case '*':
                printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1*n2);
            break;
            case '/':
                if(n2 == 0.0)
                    printf("Wrong!Division by zero!\n");
                else
                    printf("%.4lf%c%.4lf=%.4lf\n", n1, ch, n2, n1/n2);
            break;
            default:
                printf("Invalid operation!\n");
            break;
        }
    }
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    while(~scanf("%d", &n))
    {
        int i = 0;
        for(i=0; i<n; i++)
        {
            int j = 0;
            for(j=0; j<n; j++)
            {
                if(i+j<n-1)
                    printf("  ");
                else
                    printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

可以找规律!

 

#include <stdio.h>

int main()
{
    int n = 0;
    while(~scanf("%d", &n))
    {
        int i = 0;
        for(i=0; i<n; i++)
        {
            int j = 0;
            for(j=0; j<i; j++)
            {
                printf(" ");
            }
            for(j=0; j<n-i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

注意:*的个数是会变的,所以是n-i,不是5-i。

 

 #include <stdio.h>

int main()
{
    int n = 0;
    while(~scanf("%d", &n))
    {
        int i = 0;
        for(i=0; i<n; i++)
        {
            int j = 0;
            for(j=0; j<n; j++)
            {
                if(i == j)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }
    return 0;
}

对角线解法

 我的

#include <stdio.h>

int main()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        int i = 0;
        for(i=0; i<n; i++)
        {
            int j = 0;
            if(i==0 || i==n-1)
            {
                for(j=0; j<n; j++)
                {
                    printf("* ");
                }
            }
            else
            {
                for(j=0; j<n; j++)
                {
                    if(j==0 || j==n-1)
                    {
                        printf("* ");
                    }
                    else
                    {
                        printf("  ");
                    }
                }
            }
            printf("\n");
        }
    }
    return 0;
}

简化

#include <stdio.h>

int main()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        int i = 0;
        for(i=0; i<n; i++)
        {
            int j = 0;
            for(j=0; j<n; j++)
            {
                if(i==0 || i==n-1)
                {
                    printf("* ");
                }
                else if(j==0 || j==n-1)
                {
                    printf("* ");
                }
                else
                {
                    printf("  ");
                }
            }
            printf("\n");
        }
    }
    return 0;
}

if(i==0 || i==n-1)
            {
                for(j=0; j<n; j++)
                {
                    printf("* ");
                }
            }

我是先判断i是否为满足条件的行,再打印。 

  for(j=0; j<n; j++)
            {
                if(i==0 || i==n-1)
                {
                    printf("* ");
                }

           }

这个是行不管哪一行,再进行判断。

#include <stdio.h>

int main()
{
    int n = 0;
    while(~scanf("%d", &n))
    {
        int i = 0;
        for(i=0; i<n; i++)
        {
            int j = 0;
            for(j=0; j<=i; j++)
            {
                if(j==0 || i==n-1 || i==j)
                {
                    printf("* ");
                }
                else
                {
                    printf("  ");
                }
            }
            printf("\n");
        }
        
    }
    return 0;
}

j<=i,因为是下三角。

#include <stdio.h>

int main()
{
    double arr[5] = {0.0};
    int i = 0;
    double sum = 0.0;
    for(i=0; i<5; i++)
    {
        scanf("%lf", &arr[i]);
        sum += arr[i];
    }
    printf("%.2lf\n", sum/5);
    return 0;
}

注意,算的是平均值,所以sum要除以5.

#include <stdio.h>

int main()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        int i = 0;
        for(i=1; i<=n; i++)
        {
            int j = 0;
            for(j=1; j<=i; j++)
            {
                printf("%d ", j);
            }
            printf("\n");
        }
    }
    return 0;
}

i从1开始可以不用+1.

#include <stdio.h>

int main()
{
    int score = 0;
    int i = 0;
    int sum = 0;
    int max = 0;
    int min = 100;
    for(i=0; i<7; i++)
    {
        scanf("%d", &score);
        sum += score;
        if(score > max)
            max = score;
        if(score < min)
            min = score;
    }
    printf("%.2lf\n", (sum-max-min) / 5.0);
    return 0;
}

 先无脑加,再减去max和min。

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[51] = {0};
    int i = 0;
    int m = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &m);
    for(i=n-1; i>=0; i--)
    {
        if(m < arr[i])
        {
            arr[i+1] = arr[i];
        }
        else
        {
            arr[i+1] = m;
            break;
        }
    }
    if(i == -1)
    {
        arr[0] = m;
    }
    for(i=0; i<n+1; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

 首先要注意,输入的顺序问题,不可盲目添加。

for(i=n-1; i>=0; i--)
    {
        if(m < arr[i])
        {
            arr[i+1] = arr[i];
        }
        else
        {
            arr[i+1] = m;
            break;
        }
    }
    if(i == -1)
    {
        arr[0] = m;
    }

 要考虑边界值。

 

#include <stdio.h>

int main()
{
    int n = 0;
    int arr[101] = {0};
    while(~scanf("%d", &n))
    {
        int i = 0;
        for(i=2; i<=n; i++)
        {
            arr[i] = i;
        }
        for(i=2; i<=n; i++)
        {
            int j = 0;
            for(j=i+1; j<=n; j++)
            {
                if(arr[j] % i == 0)
                {
                    arr[j] = 0;
                }
            }
        }
        int count = 0;
        for(i=2; i<=n; i++)
        {
            if(arr[i] != 0)
                printf("%d ", arr[i]);
            else
                count++;
        }
        printf("\n%d\n", count);
    }
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    int arr[101] = {0};
    while(~scanf("%d", &n))
    {
        int i = 0;
        for(i=2; i<=n; i++)
        {
            arr[i] = i;
        }
        int count = 0;
        for(i=2; i<=n; i++)
        {
            int j = 0;
            for(j=2; j<i; j++)
            {
                if(i % j == 0)
                {
                    count++;
                    break;
                }
            }
            if(j == i)
                printf("%d ", i);
        }
        
        printf("\n%d\n", count);
    }
    return 0;
}

试除法 

 #include <stdio.h>

int main()
{
    int m = 0;
    int n = 0;
    int i = 0;
    scanf("%d %d", &m, &n);
    int arr1[100][100];
    int arr2[100][100];
    int j = 0;
    int count = 0;
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d", &arr1[i][j]);
        }
    }
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d", &arr2[i][j]);
        }
    }
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            if(arr1[i][j] == arr2[i][j])
            {
                count++;
            }
        }
    }
    printf("%.2f\n", 100.0*count/(m*n));
    return 0;
}

注意百分比。

#include <stdio.h>

int main()
{
    char name[100] = {0};
    char pass[100] = {0};
    while(scanf("%s %s", &name, &pass) != EOF)
    {
        if(strcmp(name, "admin") == 0 && strcmp(pass, "admin") == 0)
        {
            printf("Login Success!\n");
        }
        else
        {
            printf("Login Fail!\n");
        }
    }
    return 0;
}

用字符串,比较时用strcmp,包含头文件string.h

#include <stdio.h>

int main()
{
    int i = 0;
    int count = 0;
    for(i=1; i<=2019; i++)
    {
        int t = i;
        while(t)
        {
            if(t%10 == 9)
            {
                count++;
                break;
            }
            t /= 10;
        }
    }
    printf("%d\n", count);
    return 0;
}

要用t来暂存i,避免改变i的值,当t%10时不会改变t的值,而t/=10会将最后一位丢掉,从而实现一位一位进行比较。

#include <stdio.h>

int main()
{
    int N = 0;
    scanf("%d", &N);
    int i = 0;
    int odd = 0;
    for(i=1; i<=N; i++)
    {
        if(i % 2)
        {
            odd++;
        }
    }
    printf("%d %d\n", odd, N-odd);
    return 0;
}

 奇数英文为odd,共有N个数,不是奇数就为偶数,得出奇数个数,N-奇数的个数即为偶数。

#include <stdio.h>

int main()
{
    int N = 0;
    scanf("%d", &N);
    if(N % 2)
    {
        printf("%d %d\n", N/2+1, N/2);
    }
    else
    {
        printf("%d %d\n", N/2, N/2);
    }
    return 0;
}

只有偶数个数时奇数偶数个数相等。否则奇数多1个。

 

#include <stdio.h>

int main()
{
    int num = 0;
    int i = 0;
    int positive = 0;
    for(i=0; i<10; i++)
    {
        scanf("%d", &num);
        if(num > 0)
            positive++;
    }
    printf("positive:%d\nnegative:%d\n", positive, 10-positive);
    return 0;
}

注意正数是>0的,0不是正数。

#include <stdio.h>

int main()
{
    int N = 0;
    scanf("%d", &N);
    int arr[50] = {0};
    int i = 0;
    int flag1 = 0;
    int flag2 = 0;
    for(i=0; i<N; i++)
    {
        scanf("%d", &arr[i]);
        if(i > 0)
        {
            if(arr[i] > arr[i-1])
            {
                flag1 = 1;
            }
            else
            {
                flag2 = 1;
            }
        }
    }
    if(flag1 + flag2 == 1)
    {
        printf("sorted\n");
    }
    else
    {
        printf("unsorted\n");
    }
    
    return 0;
}

用两个标记。

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[50] = {0};
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int delete = 0;
    scanf("%d", &delete);
    int j = 0;
    for(i=0; i<n; i++)
    {
        if(arr[i] != delete)
        {
            arr[j++] = arr[i];
        }
    }
    for(i=0; i<j; i++)
        printf("%d ", arr[i]);
}

 i 遍历整个数组,如果不是要删除的数,则重新放加arr数组,如果是删除的则不放进去。

 

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[1000] = {0};
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for(i=0; i<n; i++)
    {
        int j = 0;
        for(j=i+1; j<n; j++)
        {
            if(arr[i] == arr[j])
            {
                int k = 0;
                for(k=j; k<n-1; k++)
                {
                    arr[k] = arr[k+1];
                }
                n--;
                j--;
            }
        }
    }
    for(i=0; i<n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr1[100] = {0};
    int arr2[100] = {0};
    int arr3[200] = {0};
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    for(i=0; i<m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    i = 0;
    int j = 0;
    int k = 0;
    while(i<n && j<m)
    {
        if(arr1[i] < arr2[j])
        {
            arr3[k++] = arr1[i++];
        }
        else
        {
            arr3[k++] = arr2[j++];
        }
    }
    if(i == n)
    {
        for(; j<m; j++)
        {
            arr3[k++] = arr2[j];
        }
    }
    else
    {
        for(; i<n; i++)
        {
            arr3[k++] = arr1[i];
        }
    }
    for(i=0; i<k; i++)
    {
        printf("%d ", arr3[i]);
    }
    return 0;
}

注意:1)数组输入的个数

2)用i时要记得重新给到0,不然值为m

3)while循环要保证两个数组不要越界,当有一个或两个数组读到尾时才退出

4)两个数组都是升序,所以比一下数组的第一个元素,就能知道谁是最小的一个元素

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr[10][10] = {0};
    int i = 0;
    int j = 0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

#include <stdio.h>

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

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int num = 0;
    for(i=1; i<=n*m; i++)
    {
        scanf("%d", &num);
        printf("%d ", num);
        if(i % m == 0)
        {
            printf("\n");
        }
    }
    
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    int num = 0;
    int max = 0;
    int x = 0;
    int y = 0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d", &num);
            if(num > max)
            {
                max = num;
                x = i;
                y = j;
            }
        }
    }
    printf("%d %d\n", x+1, y+1);
    return 0;
}

 

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    int arr1[9][9] = {0};
    int arr2[9][9] = {0};
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d", &arr1[i][j]);
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d", &arr2[i][j]);
        }
    }
    int flag = 0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            if(arr1[i][j] != arr2[i][j])
            {
                printf("No\n");
                return 0;
            }
        }
    }
    printf("Yes\n");
    return 0;
}

printf("No\n");
                return 0;

这个return 0表式main函数执行完毕,不再执行任何语句。

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int j = 0;
    int arr[10][10] = {0};
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            if(i > j)
            {
                if(arr[i][j] != 0)
                {
                    printf("NO\n");
                    return 0;
                }
            }
        }
    }
    printf("YES\n");
    return 0;
}

 观察0处都是i>j的。

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int j = 0;
    int arr[10][10] = {0};
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d", &arr[i][j]);
            if(i > j)
            {
                if(arr[i][j] != 0)
                {
                    printf("NO\n");
                    return 0;
                }
            }
        }
    }
    printf("YES\n");
    return 0;
}

简化

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    int arr[10][10] = {0};
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("%d ", arr[j][i]);
        }
        printf("\n");
    }
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    int arr[10][10] = {0};
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    int k = 0;
    scanf("%d", &k);
    char t = 0;
    int a = 0;
    int b = 0;
    for(i=0; i<k; i++)
    {
        scanf(" %c %d %d", &t, &a, &b);
        if(t == 'r')
        {
            for(j=0; j<m; j++)
            {
                int tmp = arr[a-1][j];
                arr[a-1][j] = arr[b-1][j];
                arr[b-1][j] = tmp;
            }
        }
        else if(t == 'c')
        {
            for(j=0; j<n; j++)
            {
                int tmp = arr[j][a-1];
                arr[j][a-1] = arr[j][b-1];
                arr[j][b-1] = tmp;
            }
        }
        
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");    
    }
    
    return 0;
}

 注意字符不要把回车读入。

我的

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[30][30] = {0};
    for(i=0; i<n; i++)
    {
        arr[i][0] = 1;
        arr[i][i] = 1;
    }
    int j = 0;
    for(i=2; i<n; i++)
    {
        for(j=1; j<i; j++)
        {
            arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<=i; j++)
        {
            printf("%5d", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[30][30] = {0};
    int j = 0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<=i; j++)
        {
            if(j == 0 || i == j)
            {
                arr[i][j] = 1;
            }
            if(i>=2 && j>=1)
            {
                arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
            }
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<=i; j++)
        {
            printf("%5d", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

#include <stdio.h>

int main()
{
    char arr[3][3] = {0};
    int i = 0;
    int j = 0;
    char flag = 'O';
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            scanf(" %c", &arr[i][j]);
        }
    }
    for(i=0; i<3; i++)
    {
        if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != 'O')
        {
            flag = arr[i][0];
            break;
        }
        if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != 'O')
        {
            flag = arr[0][i];
            break;
        }
    }
    if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != 'O')
    {
        flag = arr[2][2];
    }
    if(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != 'O')
    {
        flag = arr[0][2];
    }
    if(flag == 'K')
    {
        printf("KiKi wins!\n");
    }
    else if(flag == 'B')
    {
        printf("BoBo wins!\n");
    }
    else
    {
        printf("No winner!\n");
    }
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    int arr[40] = {0};
    scanf("%d", &n);
    int i = 0;
    while(n)
    {
        arr[i] = n % 6;
        i++;
        n /= 6;
    }
    for(i--; i>=0; i--)
    {
        printf("%d", arr[i]);
    }
    return 0;
}

 

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    long sum = 0;
    for(i=1; i<=n; i++)
    {
        sum += i;
    }
    printf("%ld\n", sum);
    return 0;
}

 长整形的输出格式为%ld,切记!

#include <stdio.h>

int main()
{
    long n = 0;
    scanf("%d", &n);
    int i = 0;
    long sum = 0;
    sum = n * (1 + n) / 2;
    printf("%ld\n", sum);
    return 0;
}

用数学公式可以使其算法更加迅速,但切记n的值为int类型时,在进行计算时会溢出! 

#include <stdio.h>

int main()
{
    int h = 0;
    int m = 0;
    int k = 0;
    scanf("%d:%d %d", &h, &m, &k);
    h = (h+(m+k)/60) % 24;
    m = (m+k) % 60;
    printf("%02d:%02d\n", h, m);
    return 0;
}

 先将原来的分钟数和要睡的分钟数加再一起,/60后即为小时数,取余则为分钟数,注意原来的小时也要加上去。

不满位数前面要加什么直接写在d 的前面。

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", n/12*4+2);
    return 0;
}

注意上楼还要2分钟。

当小于12时n/12=0,也满足,不用另外考虑。

#include <stdio.h>

int main()
{
    long long n = 0;
    long long m = 0;
    scanf("%lld %lld", &n, &m);
    long long tmp = 0;
    long long n2 = n;
    long long m2 = m;
    while(tmp = n % m)
    {
        n = m;
        m = tmp;
    }
    long long max = m;
    long long min = n2*m2 / max;
    printf("%lld\n", min+max);
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int sum = 0;
    while(n)
    {
        if(n%10%2)
        {
            sum += pow(10, i);
        }
        i++;
        n /= 10;
    }
    printf("%d\n", sum);
    return 0;
    
}

#include <stdio.h>

int f(int n)
{
    if(n<=2)
    {
        return n;
    }
    else
    {
        return f(n-1) + f(n-2);
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = f(n);
    printf("%d\n", ret);
    
    return 0;
}

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[100001] = {0};
    int tmp = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &tmp);
        arr[tmp] = tmp;
    }
    for(i=0; i<n; i++)
    {
        if(arr[i] != 0)
        {
            printf("%d ", arr[i]);
        }
    }
    return 0;
}

 利用数组下标升序的特性,并且还可以去重!

#include <stdio.h>

int main()
{
    char arr[8000] = {0};
    scanf("%s", arr);
    char* p = arr;
    long long c = 0;
    long long ch = 0;
    long long chn = 0;
    while(*p)
    {
        if(*p == 'C')
        {
            c++;
        }
        else if(*p == 'H')
        {
            ch += c;
        }
        else if(*p == 'N')
        {
            chn += ch;
        }
        p++;
    }
    printf("%lld\n", chn);
    return 0;
}

这边直接用指针,定义字符型的指针变量p,进行*解引用操作,到\0时退出。

 

#include <stdio.h>

int main()
{
    int arr[4] = {0};
    int i = 0;
    for(i=0; i<4; i++)
    {
        scanf("%d", &arr[i]);
    }
    int max = arr[0];
    for(i=1; i<4; i++)
    {
        if(arr[i] > max)
        {
            max = arr[i];
        }
    }
    printf("%d\n", max);
    return 0;
}

打擂台题目,注意可以直接用数组写!

#include <stdio.h>

int main()
{
    int score = 0;
    scanf("%d", &score);
    if(score >= 90 && score <= 100)
        printf("A\n");
    else if(score >= 80 && score <= 89)
        printf("B\n");
    else if(score >= 70 && score <= 79)
        printf("C\n");
    else if(score >= 60 && score <= 69)
        printf("D\n");
    else if(score <= 59 && score >= 0)
        printf("E\n");
    else
        printf("F\n");
    return 0;
}

#include <stdio.h>

int max3(int a, int b, int c)
{
    int max = a > b ? a : b;
    max = max > c ? max : c;
    return max;
}

int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
    scanf("%d %d %d", &a, &b, &c);
    float m = (float)max3(a+b, b, c) / (max3(a, b+c, c) + max3(a, b, b+c));
    printf("%.2f\n", m);
    
    return 0;
}

#include <stdio.h>

int main()
{
    printf("printf(\"Hello world!\\n\");\n");
    printf("cout << \"Hello world!\" << endl;\n");
    return 0;
}

注意""的配对,不要就用\,还有\n在不具有划行要求时用转义字符。

 

#include <stdio.h>

int is_primer(int n)
{
    int i = 2;
    for(i=2; i<n; i++)
    {
        if(n % i == 0)
        {
            return 0;
        }
    }
    return 1;
}

int main()
{
    int i = 0;
    int count = 0;
    for(i=100; i<=999; i++)
    {
        if(is_primer(i))
        {
            count++;
        }
    }
    printf("%d\n", count);
    return 0;
}

 暴力求解 

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[1000] = {0};
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int j = 0;
    for(i=0; i<n-1; i++)
    {
        for(j=0; j<n-1-i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
    for(i=0; i<n-1; i++)
    {
        if(arr[i] == arr[i+1])
        {
            for(j=i; j<n-1; j++)
            {
                arr[j] = arr[j+1];
            }
            n--;
            i--;
        }
    }
    for(i=0; i<n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

巧妙法

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int num = 0;
    int i = 0;
    int arr[1001] = { 0 };
    for (i = 0; i < n; i++)
    {
        scanf("%d", &num);
        arr[num] = num;
    }
    for (i = 0; i <= 1000; i++)
    {
        if (arr[i] != 0)
        {
            printf("%d ", arr[i]);
        }
    }
    return 0;
}

注意i是要<=1000的,要把数组中的所有元素都遍历一遍,如果是n的话,输入的数字就很可能放在数组下标大的位置上。

 

 

方框1中得有数字和下一个数字的地址,所以要分成两部分。

 方框1还得知道起始地址!

 有两部分内容,所以要用结构体~

 

 链表结点的定义

注意这里我“故意”留下了个错误。

在定义结构体时没有加分号!

没学过数据结构,暂放!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值