【问题描述】普通时钟都有时针和分针,在任意时刻时针和分针都有一个夹角,并且假设时针和分针都是连续移动的。现已知当前的时刻,试求出该时刻时针和分针的夹角A(0≤A≤180)。注意:当分针处于0分和59分之间时,时针相对于该小时的起始位置也有一个偏移角度。【输入形式】从标准输入读取一个24小时制的时间。格式是以冒号(“:”)分隔的两个整数m(0≤m≤23)和n(0≤m≤59),其中m是小时,n是分钟。【输出形式】向标准输出打印结果。输出一个浮点数A,是时针和分针夹角的角度值。该浮点数保留3位小数值。【输入样例】8:10【输出样例】175.000【评分标准】输出结果与标准答案相差不超过0.005得满分,否则0分。【上传文件】上传C语言源程序,以clock.c命名。
区间
【问题描述】 给定n个闭区间[ai, bi](1 £ i £ n),这些区间的并可以表示为一些不相交的闭区间的并。要求在这些表示方式中找出包含不相交区间数目最少的方案。 【输入文件】 输入文件为当前目录下的prz.in。 该文件的第一行包含一个整数n(3 £ n £ 50000),为区间的数目。以下有n行,每行各包括两个空格分隔的整数ai 和 bi,表示一个区间[ai, bi](1 £ ai £ bi £ 1000000)。 【输出文件】 输出文件为当前目录下的prz.out。 该文件内容为计算出来的不相交的区间。每一行都是对一个区间的描述,包括两个用空格分开的整数,分别为区间的上下界。 输出时将各区间按照升序排列输出。这里说两个区间[a, b]和[c, d]是按照升序排列的的,是指a £ b < c £ d。 【输入样例】 5 5 6 1 4 10 10 6 9 8 10 【输出样例】 1 4 5 10 【运行时限】 5秒。 【上传文件】 上传c语言源程序为prz.c。
#include <stdio.h>
#define MAXNUM 5000
main() { FILE *fp; int num, i, j, temp; int a[MAXNUM] = {0}, b[MAXNUM] = {0}; fp = fopen("prz.in", "r"); if (fp != NULL) { fscanf(fp, "%d", &num); for (i = 0; i < num; i++) { fscanf(fp, "%d%d", &a[i], &b[i]); } } else { exit(0); } fclose(fp); for (i = 0; i < num; i++) { for (j = num - 1; j > i; j--) { if (a[j] < a[j-1]) { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; temp = b[j]; b[j] = b[j-1]; b[j-1] = temp; } } } /* i = 0; j = 1; fp = fopen("prz.out","w"); while(i<num){ while(b[i]>=a[j]&&j<num){ if(b[i]<b[j]) b[i]=b[j]; j++; } fprintf(fp,"%d %d/n",a[i],b[i]); i = j; j++; } fclose(fp);
*/ fp = fopen("prz.out", "w"); for (i = 0; i < num;) { for (j = 1; j < num && a[j] <= b[i]; j++) { if (b[i] < b[j]) { b[i] = b[j]; } } fprintf(fp, "%d %d/n", a[i], b[i]); i = j; j++; } fclose(fp);
}
兑换硬币
【问题描述】 写一个程序,从标准输入上读入一个正整数N(1 <= N <=1000),计算出N元人民币兑换成1分、2分和5分的硬币,有多少种可能的组合。将结果以整数的方式输出到标准输出上,占一行。 时间限制:1秒。 【输入样例】 1 【输出样例】 541 【上传文件】 上传c语言源程序,文件名为nickle.c。
#include <stdio.h>
main() { long int i, n; long int nNickle = 0; scanf("%d", &n); if (n >= 1 && n <= 1000) { n *= 100; } else { exit(0); } for (i = 0; i <= (n / 5); i++) { nNickle += ((n - 5*i) / 2) + 1; } printf("%d/n", nNickle); }
实数格式识别
【问题描述】 合法的实数书写格式分一般格式和科学格式。分别描述如下: 一般格式= [<符号>]<非负整数>[<.><数字串>] 科学格式= [<符号>]<非负整数>[<.><数字串>]<E> [<符号>]<整数> <符号> = +|- <数字串> = [0]*<非负整数> <非负整数>表示数学定义中大于等于零的整数 [0]*表示长度大于等于零的、仅由数字’0’构成的串 各项之间无分隔符。描述中由<>括起的内容说明该项的属性,[ ]括起的内容为可选的属性。例如,+2、-1.56为一般格式的实数,而6.2E-2、-9E8为科学格式的实数。 编程分析哪些数的书写是正确的,是用哪种方式书写的。 【样例输入1】 +1.23 【样例输出1】 Format1 【样例输入2】 -5.1.1 【样例输出2】 Wrong 【样例输入3】 -5.1E-2 【样例输出3】 Format2 【输入文件】 输入文件为当前目录下的real.in。 该文件包含一个字符串,以回车符结束,表示一个数据(无多余空格)。 【输出文件】 输出文件为当前目录下的real.out。 该文件有一行。如果输入数据的书写是非法的,输出Wrong;如果输入数据是用一般格式书写的,输出“Format1”;如果该数据是用科学格式书写的,输出“Format2”。输出的末尾均要以一个回车符作为结束。 【上传文件】 上传C语言源程序,以real.c命名。 #include <stdio.h>
#define FALSE 0 #define TRUE 1
/*parse substring Before 'E' */ int parseSubstringBeforeE(char *, int n);
/*parse Decimal substring Before 'E' */ int parseDecimalSubstring(char *, int n);
/*parse substring After 'E' */ int parseSubstringAfterE(char *, int n);
main() { FILE *fp; int i = 0; int length = 0; int eIsFound = FALSE; int formatMatch = FALSE; char str[32]; char *pStr;
fp = fopen("real.in", "r"); if (fp != NULL) fscanf(fp, "%s", str); else exit(0); fclose(fp); fp = fopen("real.out", "w"); for (pStr = str; *pStr; pStr++) length++; for (pStr = str; *pStr; pStr++) { if (*pStr == 'E') { eIsFound = TRUE; break; } i++; } if (eIsFound == FALSE) { formatMatch = parseSubstringBeforeE(str, length); if (formatMatch == FALSE) fprintf(fp, "Wrong/n"); else fprintf(fp, "Format1/n"); } else { formatMatch = parseSubstringBeforeE(str, i); if (formatMatch == FALSE) fprintf(fp, "Wrong/n"); else { formatMatch = FALSE; formatMatch = parseSubstringAfterE(pStr + 1, length - i - 1); if (formatMatch == FALSE) fprintf(fp, "Wrong/n"); else fprintf(fp, "Format2/n"); } } }
int parseSubstringBeforeE(char *str, int length) { int i = 0; char *pStr; int formatMatch = FALSE; pStr = str; while ((*pStr < '0' || *pStr > '9') && i < length) { pStr++; i++; } if (i >= length) return FALSE; if (i > 1) return FALSE; if (i == 1) if (str[0] != '-' && str[0] != '+') return FALSE; if (str[i] == '0' && str[i+1] != '.') return FALSE; while (*pStr >= '0' && *pStr <= '9' && i < length) { pStr++; i++; } if (i >= length) return TRUE; else return parseDecimalSubstring(pStr, length - i); }
int parseDecimalSubstring(char *str, int length) { int i = 1; char *pStr;
if (length == 1) return FALSE; if (str[0] != '.') return FALSE; pStr = str + 1; while (*pStr >= '0' && *pStr <= '9' && i < length) { pStr++; i++; } return (i >= length); }
int parseSubstringAfterE(char *str, int length) { int i = 0; char *pStr; pStr = str; if (length == 0) return FALSE; if (str[0] == '+' || str[0] == '-') { pStr++; i++; } if (str[i] == '0') return FALSE; while (*pStr >= '0' && *pStr <= '9' && i < length) { pStr++; i++; } return (i >= length); }
N!的分解
【问题描述】 将N!分解成素数幂的乘积。 【输入形式】 从标准输入读取一个整数N(1≤N≤30000)。 【输出形式】 结果打印到标准输出。为N!的素数幂的乘积分解式,分解式中的素数按从小到大输出。 【样例输入】 5 【样例输出】 2^3*3*5 【上传文件】 上传C语言源程序,以decompose.c命名。 #include <stdio.h>
void decompose(int n); int isPrime(int n);
int primeNum[30000]; int numOfPrimeNum[30000]; int j;
main() { int N, i; scanf("%d", &N); for (i = 0; i < N; i++) numOfPrimeNum[i] = 0; j = 0;
for (i = 2; i <= N; i++) { if (isPrime(i)) primeNum[j++] = i; } j = 0; for (i = 1; i <= N; i++) { decompose(i); } if (numOfPrimeNum[0] != 0) { if (numOfPrimeNum[0] == 1) printf("2*"); else printf("2^%d", numOfPrimeNum[0]); } for (i = 1; i <= j; i++) { if (numOfPrimeNum[i] != 0) { if (numOfPrimeNum[i] == 1) printf("*%d",primeNum[i]); else printf("*%d^%d", primeNum[i], numOfPrimeNum[i]); } } }
int isPrime(int num) {int i,tag=1; for(i=2;tag&&i<=num/2;i++) if(num%i==0)tag=0; return tag; }
void decompose(int n) { int i; for (i = 0; primeNum[i] <= n; i++) { if (n % primeNum[i] == 0) { numOfPrimeNum[i]++; n /= primeNum[i]; if (j < i) j = i; i = -1; continue; } } }