目录
A 时间转换
题目描述
输入一个正整数(秒钟),请将其转换成为如下格式:
时:分:秒。
输入
单组输入,输入一个正整数表示总秒数。
输出
输出转换之后的时间。
样例输入 Copy
1245
样例输出 Copy
0:20:45
分析:举例:1245(也要考虑大于3600的时间)hour=1245/3600minute=(1245-60*hour)/60 或者是 minute=(1245%3600)/60second=(1245-60*hour)%60 或者是 second=(1245%3600)%60
代码实现:c语言
#include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d",&n); int hour=n/3600; int minute=n%3600/60; int second=n%3600%60; printf("%d:%d:%d",hour,minute,second); // : 为一般为英文 return 0; }
B 数字求和
题目描述
使用递归编写一个程序,计算一个正整数中所有数字之和。例如输入234,输出9。
输入
多组输入,每组输入一个正整数。
输出
输出结果,每个结果占一行。
样例输入 Copy
234
样例输出 Copy
9
分析:使用递归,返回的是一个正整数,举例:234 2+3+4=9那么递归分四步,直到 为0234/10 234%10;23/10 23%10;2/10 2%10;0/10=0,递归结束;
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; while(~scanf("%d",&n)){ // 多组输入 int z=digui(n); printf("%d",z); printf("\n"); } return 0; } int digui (int n){ if(n==0) return 0; return digui(n/10)+n%10; }
C 一二三
题目描述
你弟弟刚刚学会写英语的一(one)、二(two)和三(three)。他在纸上写了好些一二三,可惜有些字母写错 了。已知每个单词最多有一个字母写错了(单词长度肯定不会错),你能认出他写的啥吗?
输入
第一行为单词的个数(不超过 10)。以下每行为一个单词,单词长度正确,且最多有一个字母写错。所有 字母都是小写的。
输出
对于每组测试数据,输出一行,即该单词的阿拉伯数字。输入保证只有一种理解方式。
样例输入 Copy
3
owe
too
theee
样例输出 Copy
1
2
3
分析:只有三个单词 需要判别 :one two three读入字符串,先求出字符串的长度 if 是 5 则肯定是 输出 three否则 就只需要判别 one 和 two 了 看标红了的代码(标记 2)
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; char str[7]; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",str); solve(str); printf("\n"); } return 0; } void solve(char str[]){ int length=strlen(str); if(length==5) printf("3"); else{ if((str[0]=='t'&&str[1]=='w')||(str[0]=='t'&&str[2]=='o')||(str[1]=='w'&&str[2]=='o')) printf("2"); //标记 2 else printf("1"); } }
D 三家人
题目描述
有三户人家共拥有一作花园,每户人家的太太均需帮忙整理花园。A太太工作了 5天,B太太则工作了 4天,才将花园整理完毕。C 太太因为正身怀六甲无法加入她们的行列,便出了 90 元。请问这笔钱如何分给 A、B二位太太较为恰当?A应得多少元?
90/(5+4)*5=50元?如果这么想你就上当了!正确答案是 60元。如果没想通的话再想想吧。 下面回答一个一般性的问题:假定 A 太太工作了 x 天,B 太太工作了 y 天,C 太太出了 90 元,则 A太太应得多少元?输入保证二位太太均应得到非负整数元钱。
输入
输入第一行为数据组数T( T <=20)。每组数据仅一行,包含三个整数x ,y ,z(1<= x ,y <=10,1<= z <=1000)。
输出
对于每组数据,输出一个整数,即 A太太应得的金额(单位:元)。
样例输入 Copy
2
5 4 90
8 4 123
样例输出 Copy
60
123
分析:对于A,B,C 的值 肯定要是 double类型的, 设 x,y,z 分别为 A工作的天数,B工作的天数,以及 C给的钱虽然x,y是天数,但是对于之后的求值方便,所以 就是double类型 比如 (x+y)/3 可能是一个非整数先求 avg=(x+y)/3再求 A,B 多做的天数 (看代码 标记2)再求 A得到的钱 (看代码 标记3)
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ double x,y,z; int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%lf %lf %lf",&x,&y,&z); solve(x,y,z); } return 0; } void solve(double x,double y,double z){ double avg=(x+y)/3.0; double a,b; a=x-avg; //标记2 b=y-avg; //标记2 double m=a*z/(a+b); //标记3 printf("%.0lf\n",m); }
E 汽水瓶
题目描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
样例输入 Copy
3
10
81
0
样例输出 Copy
1
5
40
分析:这个题可以通过看规律做出来 我们先来列一波数据比如: 2 个空瓶子 可以 喝 1瓶 (先借一个空瓶凑成 3个空瓶,喝完之后 又还给你一个空瓶 ,恰好是 2个空瓶)再来分析一波数据: 前面是 空瓶数目, 后面是 喝的饮料数目1,02,13,14,25,26,37,38,49,410,5......有没有发现规律 设空瓶数目 为 n, 那么可以喝的饮料数就是 n/2
代码实现:c语言#include <stdlib.h> #include <stdio.h> int main (){ int n; while(~scanf("%d",&n)){ if(n==0) break; int x=solve(n); printf("%d\n",x); } return 0; } int solve (int n){ int x=n/2; return x; }
F 数字整除
题目描述
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。(标记2)
输出
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。
样例输入 Copy
34
201
2098765413
1717171717171717171717171717171717171717171717171718
0
样例输出 Copy
1
0
1
0
分析:终于碰见一个像样点的递归题了(请注意 不要看题目描述)因为这个数很大很大 已经超出 int 或者是 long long 类型的 取值范围所以要用字符数组来表示这一长串数字所以我们的求解思想就是 计算机 模拟 我们的手动的 除法算数运算比如:小学学习的除法运算1234/3 先看第一位 为 1 不够除,乘以10再加上第二位 变成 12 肯定够除 ,然后等等。现已知 除数是 17 ,请看代码实现
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ char a[100]; // 用来表示 我们的 被除数 while(~scanf("%s",a)){ if(strcmp(a,"0")==0) break; // 用来 对应 输入的标记2 (在上面) 如果为0 表示 输入结束 solve(a); } return 0; } void solve(char a[]){ int now=0; int length=strlen(a); for(int i=0;i<length;i++) //用 i 来表示 此时 被除数 的那一位的数 { if(now<17) { now=now*10+a[i]-'0'; // 不够除的时候 ,乘10 加下一位的数值, 下一位的数值是利用字符串之间的差值进行了表示。 } else { now=now%17; //够除的时候,求余 now=now*10+a[i]-'0';// 同时余数也进行乘10 ,加下一位 } } if(now%17==0) printf("1\n"); else printf("0\n"); }