以十进制显示数字,使用%d;以八进制 显示数字,使用%o;以十六进制显示数字,使用%x。另外,要显示各进制数的前缀0、0x和0X,必须使用%#o、%#x、%#X。 ——《C Primier Plus》第六版
#include
int main()
{
printf("%#o %#0X", 1234, 1234);
return 0;
}
反向输出四位数
#include
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d", n % 10);
n /= 10;
}
printf("\n");
return 0;
}
关于字符@!~,但是计算机中存储的是二进制,所以要给这些字符编码比如A:65,a:97。这些数字叫ASCII码。
#include
int main()
{
int ch = 0;
ch = getchar();
putchar(ch);
return 0;
}
此处ch为整型,输入一个字符时,将ASCII码赋值到ch中,如A就是65,然后putchar会将ASCII码转化成对应的字符输出。
#include
int main()
{
int ch = 0;
ch = getchar();
putchar(ch+32);
return 0;
}
A:65 a:97,差32,所以大小写转化只需要多加32.
#include
int main()
{
int ch = 0;
while(ch = getchar())
{
putchar(ch + 32);
}
return 0;
}
比如输入A,A此时在输入缓冲区中,但是没有送给getchar,还要加上回车才能给它,即A\n。
A变成a后,因为循环又从输入缓冲区中看到了\n(10),加上32为'*'。
是不是不舒服。
#include
int main()
{
int ch = 0;
while(ch = getchar())
{
putchar(ch + 32);
getchar();
}
return 0;
}
只需要再加个getchar()把\n吃掉就好了!
不过,这个循环会让你一直输入,是个无底洞。
#include
int main()
{
int ch = 0;
while((ch = getchar()) != EOF)
{
putchar(ch + 32);
getchar();
}
return 0;
}
getchar函数在文件读取错误或者文件结束时,返回EOF(End of file),通常放在文件的末尾。
#include
int main()
{
int ch = 0;
while((ch = getchar()) != EOF)
{
printf("%c\n", ch+32);
getchar();
}
return 0;
}
%15d的效果是靠着右边的墙排排站。
#include
int main()
{
printf("%#X\n", 0xABCDEF);
return 0;
}
十六进制为%X或%x,#用于显示前导的0X或0x.
printf函数返回的是:打印在屏幕上的字符的个数。
#include
int main()
{
int ret = printf("hehe");
printf("%d\n", ret);
return 0;
}
#include
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
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类型中。
双精度的有效数字为53位,那么最后的数怎么办呢?待处理部分有没有达到前一位的一半,达到就进位,没达到就舍去。也就是说0舍1入。
然后再将二进制数转换为十进制,十进制就会有误差。
#include
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
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
2)getchar函数一次只能获取一个字符,当输入H回车时就会有两个字符,即H和\n,所以要在下面再加上一个getchar()把换行吃掉,一定要注意!不要忘了隐身的,孤独的换行符。
3)getchar函数的返回值为整型!
#include
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;
}
一行行来处理,让问题变得简单。
代码块为大括号的位置。
#include
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
放到char类型的一维数组中好处理,注意长度的计算,一维数组是没有‘\0’的,字符串才有,所以照常计算,sizeof(arr)为1*个数/1 = 个数。
#include
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
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
printf("%d\n", 1<
#include
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
int main()
{
char ch = 0;
scanf("%c", &ch);
printf("%d\n", ch);
return 0;
}
注:字符的输入有两种
1)scanf("%c", &ch);、、不要忘记前面是%c
2)ch = getchar();
#include
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
#include
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
#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;
}
次方也能用pow函数
#include
#include
int main()
{
int num = (int)pow(2, 6);
printf("num = %d\n", num);
return 0;
}
pow的返回值为double类型,强制类型转换一下。
#include
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
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
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
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
int main()
{
double f = 0.0;
scanf("%lf", &f);
printf("%d\n", (int)f%10);
return 0;
}
#include
int main()
{
int d = 0;
scanf("%d", &d);
printf("%d\n", d%10);
return 0;
}
#include
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
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
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
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
int main()
{
int a = 0;
int b = 0;
scanf("%x %o", &a, &b);
printf("%d\n", a+b);
return 0;
}
%x十六进制的数据控制格式
%o八进制的数据控制格式
#include
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
int main()
{
int n = 0;
int arr[40] = {0};
int i = 0;
scanf("%d", &n);
for(i=0; i 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
#include
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-5; i--)
{
printf("%d ", arr[i]);
}
return 0;
}
注意:1)函数定义一定要写返回值int。
2)关于空指针为什么要用const,一是防止自己误修改了不能修改的对象的值,二是使代码重用时可以确定哪些对象不可以修改。
3)函数默认是升序,降序就e2在前。
关于函数gets(字符串),中的s是string的首字母,为字符串的意思,即输入一串字符。
#include
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
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
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
int main()
{
int num = 0;
while(~scanf("%d", &num))
{
if(num >= 140)
{
printf("Genius\n");
}
}
return 0;
}
~为按位取反操作符。
当scanf函数发生错误时返回-1.
而整数在内存中存储的是补码。
原因1)在原码和反码中+0和-0的表示不相同。
2)补码可以使减法变成加法,不需要额外的硬件电路。
#include
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
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
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
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
#include
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
#include
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
#include
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
#include
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
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
#include
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
#include
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
#include
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
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
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
#include
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
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
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
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
int main()
{
int n = 0;
while(~scanf("%d", &n))
{
int i = 0;
for(i=0; i
可以找规律!
#include
int main()
{
int n = 0;
while(~scanf("%d", &n))
{
int i = 0;
for(i=0; i
注意:*的个数是会变的,所以是n-i,不是5-i。
#include
int main()
{
int n = 0;
while(~scanf("%d", &n))
{
int i = 0;
for(i=0; i
对角线解法
我的
#include
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
for(i=0; i
简化
#include
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
for(i=0; i
if(i==0 || i==n-1)
{
for(j=0; j{
printf("* ");
}
}
我是先判断i是否为满足条件的行,再打印。
for(j=0; j
{
if(i==0 || i==n-1)
{
printf("* ");
}}
这个是行不管哪一行,再进行判断。
#include
int main()
{
int n = 0;
while(~scanf("%d", &n))
{
int i = 0;
for(i=0; i
j<=i,因为是下三角。
#include
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
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
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
int main()
{
int n = 0;
scanf("%d", &n);
int arr[51] = {0};
int i = 0;
int m = 0;
for(i=0; 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
首先要注意,输入的顺序问题,不可盲目添加。
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
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
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
试除法
#include
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
注意百分比。
#include
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
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
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
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
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
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 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
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50] = {0};
int i = 0;
for(i=0; i
i 遍历整个数组,如果不是要删除的数,则重新放加arr数组,如果是删除的则不放进去。
#include
int main()
{
int n = 0;
scanf("%d", &n);
int arr[1000] = {0};
int i = 0;
for(i=0; i
#include
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
注意:1)数组输入的个数
2)用i时要记得重新给到0,不然值为m
3)while循环要保证两个数组不要越界,当有一个或两个数组读到尾时才退出
4)两个数组都是升序,所以比一下数组的第一个元素,就能知道谁是最小的一个元素
#include
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
#include
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
#include
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
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 max)
{
max = num;
x = i;
y = j;
}
}
}
printf("%d %d\n", x+1, y+1);
return 0;
}
#include
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
printf("No\n");
return 0;
这个return 0表式main函数执行完毕,不再执行任何语句。
#include
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int j = 0;
int arr[10][10] = {0};
for(i=0; i j)
{
if(arr[i][j] != 0)
{
printf("NO\n");
return 0;
}
}
}
}
printf("YES\n");
return 0;
}
观察0处都是i>j的。
#include
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int j = 0;
int arr[10][10] = {0};
for(i=0; i j)
{
if(arr[i][j] != 0)
{
printf("NO\n");
return 0;
}
}
}
}
printf("YES\n");
return 0;
}
简化
#include
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
#include
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
注意字符不要把回车读入。
我的
#include
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int arr[30][30] = {0};
for(i=0; i
#include
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int arr[30][30] = {0};
int j = 0;
for(i=0; i=2 && j>=1)
{
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
for(i=0; i
#include
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
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
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
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
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
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", n/12*4+2);
return 0;
}
注意上楼还要2分钟。
当小于12时n/12=0,也满足,不用另外考虑。
#include
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
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
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
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int arr[100001] = {0};
int tmp = 0;
for(i=0; i
利用数组下标升序的特性,并且还可以去重!
#include
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
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
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
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
int main()
{
printf("printf(\"Hello world!\\n\");\n");
printf("cout << \"Hello world!\" << endl;\n");
return 0;
}
注意""的配对,不要就用\,还有\n在不具有划行要求时用转义字符。
#include
int is_primer(int n)
{
int i = 2;
for(i=2; i
暴力求解
#include
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int arr[1000] = {0};
for(i=0; i arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for(i=0; i
巧妙法
#include
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还得知道起始地址!
链表结点的定义
注意这里我“故意”留下了个错误。
在定义结构体时没有加分号!
没学过数据结构,暂放!