ACM练习2

4.1实验问题(1936

您已经设计了一种新的加密技术,通过在其字符之间插入一个聪明的方式随机生成的字符串来编码消息。由于悬而未决的专利问题,我们不会详细讨论如何生成字符串并将其插入到原始消息中。然而,为了验证你的方法,有必要编写一个程序来检查消息是否真的在最后一个字符串中被编码。 

给定两个字符串st,必须确定s是否是t的子序列,也就是说,如果可以从t中移除字符,以使其余字符的并置为s

1. 需求分析

判断一个字符串里面是否包含另一个字符串,字符顺序得相同不能打乱

(1)    输入的形式和输入值的范围:输入两个字符串s,t 输入值范围两个字符串大小长度不会超过100000

(2)    输出形式:Yes 或者No

(3)    程序所达到的功能:判断s是否是t的子序列

(4)    测试数据:输入sequence subsequence 输出Yes

2. 调试分析

设计程序时看好输出的格式 之前我输出YES NO 都错了 原来是输出Yes No

3. 用户使用说明

输入的两个字符串比较短的字符串在前面输入 比较长的字符串在后面输入  两个字符串输入 有空格隔开 输入完毕之后按回车 进行判断s是否是t的子字符串了.

5.测试结果

4. 附录

#include<stdio.h>

#include<string.h>

#define N 100000

int main()

{

    int i,j,s1,s2;

    char s[N],t[N];

    while(scanf("%s%s",s,t)!=EOF)

    {

       s1=strlen(s);//计算两个字符串的长度

       s2=strlen(t);

       for(i=j=0;j<s2;j++)

           if(s[i]==t[j]) //如果按顺序的字符相同 则i++,不相同着j++,而i不++

              i++;

       if(s1==i)//如果i的长度等于s1的长度 则已经寻找完毕

           printf("Yes\n");

       else

           printf("No\n");

 

    }

    return 0;

}

 

5.1问题描述(1519)

通过对整数的数字进行求和来找到正整数的数字根。如果结果值是单个数字,那么这个数字就是数字根。如果结果值包含两个或多个数字,则将这些数字相加并重复该过程。只要有必要获得一个数字,就可以继续使用。 

例如,考虑正整数24.24相加产生6的值。由于6是单个数字,因此624的数字根。现在考虑正整数39.39相加12.由于12不是一位数字,所以必须重复这个过程。添加123,一个数字,也是39的数字根。

1.  需求分析

寻找2位数以上的数字根

(1) 输入的形式和输入值的范围:输入char型数组 输入值范围 0<n<1000

(2)  输出形式:输出整型数据

(3)  程序所能达到的功能:找一个数的数字根

(4)  测试数据:输入 24 39 0 输出 6 3

2.  概要设计

将多位数 分成每个独立的数然后相加 如果相加 还不是单位数 那么继续分成独立的数 再进行相加

3.  调试分析

如果用int数组会显示答案错误 用char型数组就能正确  上网查了一下资料 用int 有可能会溢出 而char 不会溢出 所以这个类型适合

4.  用户使用说明

输入多位数 如果想结束输入就输入0即可

5.  测试结果

6.  附录

#include<stdio.h>

intmain()

{

    char A[1000];

    int sum,i;

    while(scanf("%s",A),A[0]!='0')

    {

       sum=0;

       for(i=0;A[i];i++)

           sum+=A[i]-'0';//减去尾项

       while(sum>9)//sum是大于9 就继续循环

           sum=sum/10+sum%10;//十位数的数加上个位数的数

       printf("%d\n",sum);

    }

    return 0;

}

 

6.1问题描述(2301

超级星期日几乎是在这里。为了打发时间等待半场广告和衣柜故障,当地的黑客组织了一场赌博游戏。成员们把赌注押在两个最终得分的总数上,或者两个分数之间的绝对差上。给定每种赌注的中奖号码,你能推断出最终比分吗?

1.  需求分析

给出最终得分 和两个分数之间的绝对差推断出 两个队伍的分数

(1)  输入的形式和输入值的范围:输入3个整型 先输入n 代表输入多少次 再输入s d 分别代表两个分数总和 d代表 两个分数绝对差 输入两个队伍的分数

(2)  输出的形式:两个队伍的分数

(3)  程序所能达到的功能:得出两个队伍的分数如果不能得出 输入impossible

(4)  测试数据:

输入:2

40 20

20 40

输出: 30 10

       Impossible

2.  概要设计

注意省题  s 代表两个分数总和 d代表两个分数之差的绝对值 所以s必须大于d 并且 s d必须是偶数 因为两个队伍分数 是s和d的一半 两个队伍的分数 不可能有小数点 所以if(s<d||(s-d)%2||(s+d)%2)用来判断可不可能得出分数

3. 用户使用说明

输入的第一行包含n,即测试用例的数量 再输入s(两个分数总和),d(两个分数之差的绝对值)直到输入n次之后结束

4.  测试结果

5. 附录

#include<stdio.h>

int main()

{

    intn,s,d;

    scanf("%d",&n);

    while(n--)

    {

       scanf("%d%d",&s,&d);

       if(s<d||(s-d)%2||(s+d)%2)//不符合这两个条件的任意一个就没有答案

printf("\nimpossible\n");

       else

       {

           inta=(s+d)/2; //a b 各位队伍分数

           intb=(s-d)/2;

           printf("\n%d%d\n",a,b);

       }

     

    }

    return0;

 

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值