一、然后是几点
1、题目描述:
有时候人们用四位数字表示一个时间,比如 1106
表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530
;0 点 30 分表示为 030
。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530
;0 点 30 分表示为 030
。流逝的分钟数可能超过 60,也可能是负数。
输出格式:
输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
2、代码呈现:
#include <stdio.h>
int main () {
int N,M,h,m,r;
scanf("%d %d", &N, &M);
h = N/100; // 这里N/100赋值给h,h就是从0点开始经过的时间的小时部分
m = N%100; // 这里N%100赋值给m,m就是从0点开始经过的时间的分钟部分
m += M;
if (m >=60) { // 如果加上流逝的分钟数后,分钟数大于等于60,则需要进位。
h += m/60;
m %= 60;
}
else if (m < 0) { // 如果加上流逝的分钟数后,分钟数小于0,则需要借位。
m = -m; // 先给m取反,方便计算。
r = (m-1)/60+1; // 当m属于[1,60],借1位; m属于[61,119]借2位, 所以有这样的公式
h -= r;
m = 60*r-m;
}
printf("%d%.2d", h%24, m);
return 0;
}
二、计算火车运行时间
1、题目描述:
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
输入格式:
输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
输出格式:
在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。
2、代码呈现:
#include <stdio.h>
int main(void) {
int a1,a2,hh,mm;
scanf("%d %d",&a1,&a2);
hh=a2/100-a1/100;
mm=a2%100-a1%100;
if(mm<0){
mm=mm+60;
hh=hh-1;
}
printf("%02d:%02d",hh,mm);/*%d就是普通的输出了
%2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格
%02d,和%2d差不多,只不过左边补0
%.2d没见过,但从执行效果来看,和%02d一样*/
return 0;
}
三、兔子繁衍问题
1、题目描述:
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
2、代码呈现:
// 1 1 2 3 5 8 13
// 0 0 +1 +1 +2 +3 +5
#include<stdio.h>
int main()
{
int N;
int a = 1;
int b = 1;
int x = 2;
int t = 2;
scanf("%d", &N);
if (N == 1)
printf("1");
else
while (x <= N)
{
x = a + b;
a = b;
b = x;
t++;
if (x >= N)
{
printf("%d", t);
break;
}
}
}
四、素因子分解
1、题目描述:
给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1⋅p2k2⋯pmkm。
输入格式:
输入long int范围内的正整数 N。
输出格式:
按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km
,其中pi
为素因子并要求由小到大输出,指数ki
为pi
的个数;当ki
为1即因子pi
只有一个时不输出ki
。
2、代码呈现:
#include <stdio.h>
#include <math.h>
int Isprime(int x) {
for (int i = 2; i <= sqrt(x); i++)
if (x % i == 0)
return 0;
return 1;
}
int arr[10000];
//桶的思想,arr每个元素都初始化为0,下标表示该数字,数组数值大于一的部分为对应下标数字取的次数
int main() {
long int n;
scanf("%ld", &n);
if (n == 0 || n == 1) //一定要对0与1特殊处理,我找了半天没想到是这里缺了
{
printf("%d=%d", n,n);
return 0; }
for (long int i = 2; i <= 10000; i++) {//建议i<=10000即可就够用了,不要写<=n,因为n太大数组会越界,发生段错误
if (Isprime(i))
arr[i]++;//将下标是素数的元素数值变为1
}
long int k = n;
//找质因子,详细分析见文章末
for (int i = 2; k != 1; i++)
if (arr[i]) { //i是素数
while (k % i == 0) {
k /= i;
arr[i]++;
}
}
int flag = 0;//是否为第一个数的标记,是为0不输出*,不是则输出*
printf("%ld=", n);
for (int i = 2; i <= 10000; i++) {
if (arr[i] > 1) {
if (flag)
printf("*");
else
flag = 1;
if (arr[i] > 2)
printf("%d^%d", i, arr[i] - 1);
else
printf("%d", i);//因为只有1次时输出中无^,所以分开写
}
}
return 0;
}