C程序(1)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值