Instantly share code, notes, and snippets.
-
Star
(0)
0
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save JaHIY/2289293 to your computer and use it in GitHub Desktop.
C:A big homework of C language lesson
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<stdio.h> | |
#include<math.h> | |
void clearbuffer(void) { | |
int z; | |
while ((z = getchar()) != '\n' && z != EOF); | |
} | |
long int narcissistic_number(long int x) { | |
long int a, sum=0, t=x; | |
while (x != 0) { | |
a = x%10; | |
sum += a*a*a; | |
x /= 10; | |
} | |
if (t == sum) return 0; | |
else return -1; | |
} | |
int lower_char(int c) { | |
if (c >= 65 && c <= 90) | |
return c + 32; | |
else if (c == 10) return 10; | |
else return -1; | |
} | |
long int prime(long int x) { | |
long int i; | |
for(i=2; i <= sqrt((double)x); i++) { | |
if (x%i == 0) return -1; | |
} | |
return 0; | |
} | |
long int gcd(long int x, long int y) { | |
long int r; | |
if (y > x) { | |
x ^= y; | |
y ^= x; | |
x ^= y; | |
} | |
r = x%y; | |
while (r != 0) { | |
x = y; | |
y = r; | |
r = x%y; | |
} | |
return y; | |
} | |
long int max(long int x, long int y, long int z) { | |
if (x >= y && x >= z) return x; | |
else if (y >= x && y >= z) return y; | |
else return z; | |
} | |
long int factorial(long int x) { | |
long int s = 1; | |
for (; x > 0; x--) { | |
s *= x; | |
} | |
return s; | |
} | |
long int times_five(long int x, long int y) { | |
long int a, i=0; | |
while (x != 0) { | |
a = x%10; | |
if (y == a) i++; | |
x /= 10; | |
} | |
return i; | |
} | |
long int judge_add_mult(long int x) { | |
long int s=0, m=1, a; | |
while (x != 0) { | |
a = x%10; | |
s += a; | |
m *= a; | |
x /= 10; | |
} | |
if (s == m) return 0; | |
else return -1; | |
} | |
void triangle(long int x) { | |
long int i, j; | |
for (i=0; i<x; i++) { | |
for (j=0; j<10+x-i; j++) printf(" "); | |
for (j=0; j<2*i-1; j++) printf("*"); | |
printf("\n"); | |
} | |
} | |
int main(void) { | |
char c; | |
long int x, y, z; | |
int err, h; | |
printf("本程序可以完成某些数学计算:\n" | |
"******************************************************\n" | |
"* 1 判断一个数是否为水仙花数 *\n" | |
"* 2 判断一个数是否为素数 *\n" | |
"* 3 求两个数的最大公约数 *\n" | |
"* 4 求三个数的最大值 *\n" | |
"* 5 求一个数的阶乘 *\n" | |
"* 6 输出一个5位数中某数字出现的次数 *\n" | |
"* 7 判断一个数的各个位上数字之和与数字之积是否相等 *\n" | |
"* 8 打印输出n行三角形 *\n" | |
"* 9 将输入的n个大写字母转换成小写字母 *\n" | |
"* 0 退出 *\n" | |
"******************************************************\n"); | |
do { | |
printf("请按菜单进行选择(0-9):\n"); | |
scanf("%c", &c); | |
if (c == '\n') continue; | |
clearbuffer(); | |
if (c < '0' || c > '9') { | |
printf("Error:无此菜单项,请重新输入!\n"); | |
continue; | |
} else if (c == '0') { | |
do { | |
printf("你确定退出吗?(Y/n)\n"); | |
scanf("%c", &c); | |
} while (!(c == 'y' || c == 'Y' || c == 'N' || c == 'n' || c == '\n')); | |
if (c == 'y' || c == 'Y' || c == '\n') { | |
printf("欢迎再次使用,Byebye!\n"); | |
if (c == '\n') break; | |
} | |
else if (c == 'n' || c == 'N') { | |
clearbuffer(); | |
continue; | |
} | |
} else { | |
do { | |
err = 0; | |
switch(c) { | |
case '3': | |
printf("请输入两个正整数:\n"); | |
scanf("%ld%ld", &x, &y); | |
clearbuffer(); | |
if (x > 0 && y > 0) { | |
z = gcd(x, y); | |
printf("%ld和%ld的最大公约数为%ld\n", x, y, z); | |
} else { | |
printf("Error:输入的数必须为正整数!\n"); | |
} | |
break; | |
case '4': | |
printf("请输入三个整数:\n"); | |
scanf("%ld%ld%ld", &x, &y, &z); | |
clearbuffer(); | |
x = max(x, y, z); | |
printf("最大值为%ld\n", x); | |
break; | |
case '6': | |
printf("请输入一个五位整数:\n"); | |
scanf("%5ld", &x); | |
clearbuffer(); | |
printf("请输入指定的数字:\n"); | |
scanf("%1ld", &y); | |
clearbuffer(); | |
z = times_five(x, y); | |
printf("数字%ld在%ld出现的次数为%ld次。\n", y, x, z); | |
break; | |
case '9': | |
printf("请输入大写字母(直接按 Enter 返回主菜单):\n"); | |
for (y=1; (h = getchar()) != '\n'; y++) { | |
if ((h >= 65 && h <= 90) || h == 10) { | |
h = lower_char(h); | |
putchar(h); | |
} else { | |
clearbuffer(); | |
printf("\nError:第%ld个字符输入有误,请重新输入!", y); | |
err = 1; | |
break; | |
} | |
} | |
if (y > 1 || h != 10) printf("\n"); | |
break; | |
default: | |
printf("请输入一个整数:\n"); | |
scanf("%ld", &x); | |
clearbuffer(); | |
switch(c) { | |
case '1': | |
if (x > 0) { | |
y = narcissistic_number(x); | |
if (y == 0) printf("%ld是水仙花数。\n", x); | |
else printf("%ld不是水仙花数。\n", x); | |
} | |
else { | |
printf("Error:输入的数必须为正整数!\n"); | |
err = 1; | |
} | |
break; | |
case '2': | |
if (x > 1) { | |
y = prime(x); | |
if (y == 0) printf("%ld是素数。\n", x); | |
else printf("%ld不是素数。\n", x); | |
} else { | |
printf("Error:输入的整数必须大于1!\n"); | |
err = 1; | |
} | |
break; | |
case '5': | |
if (x >= 0) { | |
y = factorial(x); | |
printf("%ld!=%ld\n", x, y); | |
} else { | |
printf("Error:输入的数必须为非负整数!\n"); | |
err = 1; | |
} | |
break; | |
case '7': | |
if (x > 0) { | |
y = judge_add_mult(x); | |
if (y == 0) printf("%ld的各个位上数字之和与数字之积相等。\n", x); | |
else printf("%ld的各个位上数字之和与数字之积不相等。\n", x); | |
} else { | |
printf("Error:输入的数必须为正整数!\n"); | |
err = 1; | |
} | |
break; | |
case '8': | |
if (x > 2) | |
triangle(x); | |
else { | |
printf ("Error:输入的整数必须大于2,否则无法生成三角形!\n"); | |
err = 1; | |
} | |
break; | |
} | |
break; | |
} | |
} while (err == 1); | |
} | |
} while (!(c == 'y' || c == 'Y')); | |
printf("按回车键退出..."); | |
getchar(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment