Skip to content

Instantly share code, notes, and snippets.

@JaHIY
Created April 3, 2012 04:24
Show Gist options
  • Save JaHIY/2289293 to your computer and use it in GitHub Desktop.
Save JaHIY/2289293 to your computer and use it in GitHub Desktop.
C:A big homework of C language lesson
#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