学习日记(小阳人的倔强)12/26

今天是个好日子,奖励自己几个题目吧(头好痛)。

在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了...

    这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。

    变换的过程如下:

    第一步. 把字符串6个一组折叠起来,比如wangximing则变为:
    wangxi
    ming

    第二步. 把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:
    228 202 220 206 120 105

    第三步. 再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: 228 => 2+2+8=12 => 1+2=3

    上面的数字缩位后变为:344836, 这就是程序最终的输出结果!

    要求程序从标准输入接收数据,在标准输出上输出结果。

这个不难就是思路要清晰,把它分几个步骤来做

1将字符串改写成的一串数字存入一个数组中

2再写一个函数将数组的数进行处理

3最后将这个数组输出即可

注意!!数组每次用完要初始化不然会在上一次使用的基础上再次使用,那就错了

还有给数组赋值时6个一循环要看清自己写的是啥别漏了(血与泪的教训)

#include<stdio.h>
#include<string.h>
int f(char a[],int b[]){
int i=0;
int h=strlen(a);
for(int z=0;z<h;z++){
    b[i]=b[i]+a[z];
    if(i==5)
        i=0;
    else
    i++;

}
return 0;
}
int F(int b[]){
for(int y=0;y<6;y++){

    if(b[y]>9){
            int sum=0;
            int k=0;
    while(b[y]>0){
            sum=sum+b[y]%10;
            b[y]=b[y]/10;
            k++;
    }
    b[y]=sum;
    y--;

    }
    else
        continue;
}
return 0;
}
int main(){
int n;
char a[100];
int b[6]={0};
scanf("%d",&n);
getchar();
for(int l=0;l<n;l++){
    scanf("%s",a);
    f(a,b);
    F(b);
   for(int z=0;z<6;z++){
    printf("%d",b[z]);
   }
   printf("\n");
   for(int u=0;u<6;u++)
     b[u]=0;
}
return 0;
}

一位智将才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。 输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。

我看到有不少人写了所以我就来看看,没想到这莫简单,刚开始我咋没看到啊

无脑平推,用我这个方法,我觉得可能数的话可能会更快,哈不在意细节啦

#include<stdio.h>
int main(){
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF){
    for(int y=8;y<=100;y++){
        if(y%3==a)
            if(y%5==b)
        if(y%7==c){
               printf("%d\n",y);
        }
    }
}

return 0;
}

小璐有一群笔友,有一天他们跟小璐约定好去互相寄邮件,每个人只能寄一封邮件,也只能收一封信,寄给这些笔友或者是小璐,小璐也要寄,当然了不能自己寄给自己,那么小璐想知道有多少种不同的寄邮件方式,对于这等问题,小璐早就知道了答案,所以他要来考考你,那么就交给你了。

这题有点烦规律想了那莫久,最后还去网上查了才明白

b[0]=1;

i=0;表示有两个人小璐加一个其他人

b[i]=b[i-1]*(i+2)(算上小璐的总人数)+m;(i为奇数的时候m=-1为偶数的时候为1)

有了规律就好办了呀

注意了啊,我不知到用递归会不会时间超限,所以不推荐使用

然后记得用long long 不然太大了装不下

#include<stdio.h>
#include<string.h>
int main()
{
long long k,x,h[20];
int m=-1;
h[0]=1;
for(int l=1;l<20;l++){
    h[l]=h[l-1]*(l+2)+m;
    m=-m;
}

while(scanf("%lld",&k)!=EOF){
 for(int i=0;i<k;i++){
    scanf("%lld",&x);
    printf("%lld\n",h[x-1]);
 }

}
    return 0;
}

有n个实数,实数的范围在0---100之间,通过average函数求这n个实数去掉最大最小值后的平均值

要求:n及n个实数在主函数中输入,结果保留2位小数

简单题奖励自己

分几个步骤来

1中规中矩的多组输入

2写一个函数定义一个数组 来输入k个数

3在函数内定义max,min ,l,p,用for来查找最大和最小

4定义一个sum=0如果h!=最大或最小的下标则加上最后输出sun*1.0/k-2

注意了啊 千万别用值来判断是否为最大或最小当输入数组的值有相同的且相同为最大最小的时候就会出错,所以用下标最稳啦。

#include<stdio.h>
void f(int x){
int b[1000];
for(int k=0;k<x;k++){
    scanf("%d",&b[k]);
}
int max=b[0],min=b[1],l=0,p=1;
for(int y=0;y<x;y++){
    if(b[y]>max){
        max=b[y];
        l=y;
    }
    if(b[y]<min){
        min=b[y];
        p=y;
    }
}
int sum=0;
for(int h=0;h<x;h++){
    if(h!=l&&h!=p)
    sum=sum+b[h];
}
printf("%0.2f\n",sum*1.0/(x-2));

}
int main(){
int x;
while(scanf("%d",&x)!=EOF){
f(x);
}
return 0;
}

实验室的学长学姐要去聚餐,聚餐就要喝酒,可是偏偏大家的酒量都不行,喝一杯就醉。现在大家一起玩个游戏,桌上围坐着2n个人。其中n个人是学长,另外n 个人是学姐。如果从第一个人开始数数,数到第m个人,则让他喝一杯酒,然后他就醉了;然后从喝醉的人之后开始数数,再让数到的第m个人喝酒……依此方法不 断让围坐在桌上的人喝酒。不过,问题来了,学长可以喝醉,但是学姐不能喝醉,所以预先应如何安排这些学长与学姐的座位,能使得在让n个人喝醉之后,桌上围 坐的没醉的n个人全是学姐。

多组数据,每组数据输入:学长和学姐的人数分别为n(n<=3000)、以及m表示数到第m个人就倒下(m<=1000);

对于每一组数据,输出2n个大写字母,‘G’表示学姐,‘B’表示学长,50个字母为一行,不允许出现空白字符。每组测试数据后输出一个空行。

em阿这呀学长全醉了这也不好办呀,我的提议是学长醉一半学姐醉一半,不然咋回家呀。

题目基本思路是填充,先把学长全部填进去,然后把学姐放进去

1先搞个多组输入输入有多少个学姐和第m个人要喝醉写个函数把有多少个学姐和第m个人要和醉传过去

2在函数里面定义一个char类型的数组给这个数组进行初始化

3定义一个l和一个i,l是数数当还没被填的座位数了m个就填一个学长i是我们只要填一半的学长剩下一半是学姐啦所以当i=x时退出循环

4给学姐们填进去只要b[u]的值为初始化的值就说明这空没填那就把学姐放进去

5打印全部打印出来因为50个要换一行要是从b[0]开始不好搞,所以从最开始我就没要b[0]

而是1到2*x这太对了这样就可以对50取余为0就打印一个换行

注意!!对数组的初始化一定要的不char数组的初始化没有int 那莫放便,还有i和l是一定要的对于填过的要跳过不可以一个坑里放了一次学长然后再放一次,记得打印一次数组要打印两个换行符

#include<stdio.h>
void intput(char b[],int x){
for(int g=1;g<=2*x;g++)
    b[g]='a';
}
void f(int x,int m){
char b[7000];
intput(b,x);
int i=0,l=0;
for(int y=1;y<=2*x;y++){
    if(b[y]=='a')
       l++;
    if(l==m){
        b[y]='B';
        l=0;
        i++;
    }
if(y==2*x)
    y=0;
if(i==x)
    break;

}
for(int u=1;u<=2*x;u++){
    if(b[u]=='a')
        b[u]='G';
}
for(int z=1;z<=2*x;z++){
    printf("%c",b[z]);
    if(z%50==0)
        printf("\n");
}

}
int main(){
int x,m;
while(scanf("%d%d",&x,&m)!=EOF){
f(x,m);
printf("\n\n");
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值