刷题进度:+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]);
}