《算法分析与设计》练习1

目录

A 时间转换

B 数字求和

C 一二三

D 三家人

E 汽水瓶

F 数字整除


A 时间转换

题目描述

输入一个正整数(秒钟),请将其转换成为如下格式:
时:分:秒。

输入

单组输入,输入一个正整数表示总秒数。

输出

输出转换之后的时间。

样例输入 Copy

1245

样例输出 Copy

0:20:45 
分析:举例:1245(也要考虑大于3600的时间)
         hour=1245/3600
         minute=(1245-60*hour)/60  或者是  minute=(1245%3600)/60
         second=(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 
          那么递归分四步,直到 为0
          234/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,0
                                        2,1
                                        3,1
                                        4,2
                                        5,2
                                        6,3
                                        7,3
                                        8,4
                                        9,4
                                      10,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");

}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值