12.29学习总结

刷题进度:+8

问题 H: 密码锁问题(JSU-ZJJ)

题目描述

一个微调密码锁是这样的一种锁,这种锁你仅能转动密码盘。这是一种常见的密码盘,通过仅在允许的组中改变这些密码盘以微调某个值。

设想一行有D个编号的密码盘,每个密码盘顺序有0到9共九个数字。这类似于密码箱的组合锁。

下面是一系列B按钮,每个按钮标记有D位数字。例如,D可能是4标记就是1000 1200 1002 0111.按标记为1000的按钮,则仅转动第一个转盘一次,而其他转盘不动,而按按钮1002则转第一个转盘一次,转第四个转盘两次,剩下的不动。每个盘按循环的方式转动,即如果转到9,再转一次,就又转回0.

你的任务是模仿这样一个上锁的微调密码锁,给出最终的各密码盘的读数。

输入

输入的每个测试数据的第一行包含有D个数字(至多10个),表示密码盘的起始位置。接下来的每一行有一排有标记的按钮,表示下一次会按的按钮。

输出

对每个测试用例用一行输出最终各密码盘的读数。

样例输入 复制
0001
1003
0206
0034
1111
1003
样例输出 复制
3348
#include <stdio.h>
#include <string.h>
int main()
{
    char s[10];
    int n,i,j;
    while((scanf("%s",s))!=EOF){//s是起始标志
    for(i=0;i<5;i++)
    {
        scanf("%d",&n);//1003...
    for(j=3;n>0;j--)
        {
            s[j]=s[j]+n%10;
            if(s[j]>57)s[j]=s[j]-10;//如果转到9,再转一次,就又转回0.
            n=n/10;
        }    }
    printf("%s\n",s);
}}

问题 N: 小叶子的黑白观

题目描述

众所周知,实验室的小叶子长的很黑,但是,他自己却总是喜欢颠倒黑白,总喜欢把黑的说成白的(比如 他自己,O(∩_∩)O哈哈~)。这不,有一天,他又开始了他的颠倒之路了。他拿出了两个数,试图颠倒这两个数。规则如下:如果这两个数的反转的和等于两个数和的反转,例如: 12和34。12的反转是21,34的反转是43,21+43=64,而12+34=46,46的反转为64。两个经过反转的数相等,那么他就颠倒失败了,否则他就成功了!!

输入

第一行一个正整数表示测试数据的个数n。

只有n行,每行两个正整数a和b(0<=a,b<=10000)。

输出

如果这两个数的反转的和等于两个数和的反转则输出a+b的值,否则输出小叶子颠倒成功。

样例输入 复制
2
12 34
99 1
样例输出 复制
46
小叶子颠倒成功
提示

可以写一个反转函数

#include <stdio.h>
int wei(int a){
    int j=1;
    while(a>9){
        a=a/10;
        j++;    
    }return j;
}
int dian(int a){
    int j=wei(a),k=j;
    int t[10]={0},b=0;
    while(j--){
        t[j]=a%10;
        a/=10;
    }
    for(j=k-1;j>=0;j--){b=b*10+t[j];}    
    return b;//反转函数
}
int main()
{
    int a,b,c,d,n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d",&a,&b);
        int sum=0,aum=0;
        aum=a+b;
        c=dian(a); d=dian(b);
        sum=c+d;
        if(dian(aum)==sum)printf("%d\n",aum);
        else printf("小叶子颠倒成功\n");
    }
    return 0;
}

问题 F: 数数字

题目描述

问题很简单有个1到n的数列,数一下其中能够被2,3,5整除的数字的个数。例如当n = 6 ,的时候有 2,3,4,5 , 6.这5个数满足条件,所以我们应该输出5,是不是很简单?

输入

多组输入到文件尾,每组输入一个n (n < 1e9 )

输出

输出对应的个数

样例输入 复制
1
2
6
样例输出 复制
0
1
5
#include<stdio.h>
int main()
{
    int n,sum;
    while((scanf("%d",&n))!=EOF)
    {
        sum=0;
        int a,b,c,d,e,f,k;
        a=n/2;b=n/3;c=n/5;//n/t是在1-n中能整除t的个数
        d=n/6;e=n/10;f=n/15;
        k=n/30;
        sum=a+b+c-d-e-f+k;//容斥定理:abc所含的元素=a集合含的元素+b集合含的元素+c集合含的元素-ac共同元素-ab共同元素-bc共同元素+abc共同含有的元素。
        printf("%d\n",sum);
        }
        
        return 0;
    }
    

问题 B: 将对应字母交叉

题目描述

输入2个字符串,将对应字母交叉组成第三个字符串,最后输入第三个字符串。例如输入的2个字符串分别是“abcd”和“1234”,则合并后的字符串是“a1b2c3d4”。若2个字符串的长度不等,则其中的一个字符串多余的部分放在结果字符串的尾部,如2个字符串分别是“banana”和“12”,则合并后的字符串是“b1a2nana”

要求:第一个字符串的第一个字母总是结果串的第一个字母。

输入

如输入:

abcd

1234

输出

输出:

a1b2c3d4

样例输入 复制
abcd
1234
样例输出 复制
a1b2c3d4
#include<stdio.h>
#include<string.h>

int main()
{
    char a[100],b[100];
    scanf("%[^\n]%*c",a);
    scanf("%[^\n]%*c",b);
    int k=strlen(a);
    int t=strlen(b);
    int i,j,n;
    n=(k<t?k:t);
    for(i=0;i<n;i++)
    {
        printf("%c",a[i]);//字符串长度相同直接输出
        printf("%c",b[i]);//不同,先输出跟短字符串长度相同的部分    
    }
    if(k<t){for(;i<t;i++){printf("%c",b[i]);} }//谁长输出谁的后半截
    if(k>t){for(;i<k;i++){printf("%c",a[i]);} }
    
    return 0;
}

问题 D: 按给出的指定位置排序

题目描述

设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置m开始的n个数按逆序重新排列并输出新的完整数列。

输入

输入:

0 1 2 3 4 5 6 7 8 9

m:4

n:6

输出

输出:

0 1 2 3 9 8 7 6 5 4

样例输入 复制
0 1 2 3 4 5 6 7 8 9
m:4
n:6
样例输出 复制
0 1 2 3 9 8 7 6 5 4
#include<stdio.h>
#include<math.h>             
int main() {
    int a[10]={0};
    int m=0,n=0;
    for(int i=0;i<10;i++)
    {
        scanf("%d",&a[i]);getchar();
    }    scanf("m:%d",&m);getchar();
        scanf("n:%d",&n);
        
    for(int t=0;t<m;t++)
    {
        printf("%d ",a[t]);
    }
    for(int j=m+n-1;j>m-1;j--)
    {
        printf("%d ",a[j]);
    }
    if(m+n!=10)for(int z=m+n;z<10;z++)
    printf("%d ",a[z]);
}            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值