C程序(1)

来源:互联网 发布:java实现杨辉三角 编辑:程序博客网 时间:2024/05/19 18:17

【问题描述】普通时钟都有时针和分针,在任意时刻时针和分针都有一个夹角,并且假设时针和分针都是连续移动的。现已知当前的时刻,试求出该时刻时针和分针的夹角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命名。

#include <stdio.h>
main(){ int hour, min; float dHour, dMin, degreeA;
 scanf("%d:%d", &hour, &min);
 /*get dHour*/ if (hour >= 0 && hour <= 23) {  /*convert to 12 hour*/  hour = (hour >= 12)? (hour - 12):(hour); } else {  exit(0); } dHour = hour * (360.0 / 12.0) + min * (30.0 / 60.0);
 /*get dMin*/ if (min >= 0 && min <= 59) {  dMin = min * (360.0 / 60.0); }
 /*get degreeA*/ degreeA = dHour - dMin;
 /*convert to positive 180 degree*/ degreeA = (degreeA >= 0)? degreeA:(0.0-degreeA); degreeA = (degreeA > 180)? (360.0 - degreeA):degreeA;
 printf("%.3f/n", degreeA);}

区间

【问题描述】给定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。【输入样例】55 61 410 106 98 10【输出样例】1 45 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;  } }}

 

原创粉丝点击