1月5日学习记录

文章包含一系列编程问题,涉及字符串的数字和英文表示、格点计算、数的反转验证以及ICPC比赛中的气球分配策略。还讨论了如何根据学生的能力值最大化管理效率,以及如何交叉组合字符串。同时指出了一些编程陷阱,如不必要的循环和类型错误。
摘要由CSDN通过智能技术生成

小叶子学英文:

小叶子现有一个非负整数n,它的任务是计算 n 的各位数的和 , 并且按英语输出总和中的每一个数字。

昨天的问题,忘记写0的情况。。。。

#include <stdio.h>
#include <string.h>

char str[1000000];
int arr[100000];
int SUM[100000];
int main()
{
    gets(str);
    long long int len = strlen(str);
    long long int sum = 0;
    for(int i = 0; i < len; i++)
    {
        arr[i] = str[i];
    }
    for(int i = 0; i < len; i++)
    {
        sum += arr[i] - '0';
    }
    long long int i = 0;
    long long int flag = 0;
    // printf("%d\n",sum);
    if(sum == 0)
    {
        printf("zero ");
    }
    while(sum > 0)
    {
        SUM[++i] = sum % 10;
        sum /= 10;
        flag++;
    }
    while(flag != 0)
    {
        i = flag;
        if(SUM[i] == 9)
        printf("nine ");
        if(SUM[i] == 8)
        printf("eight ");
        if(SUM[i] == 7)
        printf("seven ");
        if(SUM[i] == 6)
        printf("six ");
        if(SUM[i] == 5)
        printf("five ");
        if(SUM[i] == 4)
        printf("four ");
        if(SUM[i] == 3)
        printf("three ");
        if(SUM[i] == 2)
        printf("two ");
        if(SUM[i] == 1)
        printf("one ");
        if(SUM[i] == 0)
        printf("zero ");
        flag--;
    }
    return 0;
}

无聊的眺爷:

最近眺爷无聊的玩起了数格点的游戏,现给定平面上的两个格点 p1 = (x1,y1) 和 p2 = (x2,y2), 他想找出线段p1p2上除p1和p2以外一共有几个格点?但他总是数错, 你能写个程序帮帮他吗?

写着题首先得弄清楚格点是啥,重点在于格点是整数点,然后用辗转相除求大公约数就ok。

#include <stdio.h>

int main()
{
    int x1,y1,x2,y2;
    int temp1,temp2;
    scanf("%d %d",&x1,&y1);
    scanf("%d %d",&x2,&y2);
    if(x1 > x2)
    {
        temp1 = x1 - x2;
    }else{
        temp1 = x2 - x1;
    }
    if(y1 > y2)
    {
        temp2 = y1- y2;
    }else{
        temp2 = y2 - y1;
    }
    while(temp2)
    {
        int t = temp1%temp2;
        temp1 = temp2;
        temp2 = t;
    }
    if(temp1 > 0)
    {
        printf("%d\n",temp1 - 1);
    }else{
        printf("0\n");
    }
    return 0;
}

小叶子的黑白观:

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

这题写一个反转函数然后注意两个数之间的关系就能求解。

#include <stdio.h>

int turn(int a)
{
    int b,c = 0;
    while(a > 0)
    {
        b =a % 10;
        c = c * 10 + b;
        a /= 10;
    }
    return c;
}

int main()
{
    int n;
    scanf("%d",&n);
    int i;
    int a,b,sum1,sum2;
    for(i = 0; i < n; i++)
    {
        scanf("%d %d",&a,&b);
        sum1 = turn(a+b);
        sum2 = turn(a) + turn(b);
        if(sum1 == sum2)
        {
            printf("%d\n",a+b);
        }else{
            printf("小叶子颠倒成功\n");
        }
    }
    return 0;
}

ICPC Fighting!

在ICPC比赛中,气球的分配方式如下。

每当一个团队解决了一个问题,该团队就得到一个气球。
第一个解决一个问题的队伍可以得到一个额外的气球。
一场比赛有26个问题,标记为A,B,C,...,Z。你会得到比赛中已解决的问题的顺序,用字符串s表示,其中第i个字符表示问题s[i]已经被某个团队解决。没有团队会两次解决同一个问题。
确定各队收到的气球总数。请注意,有些问题可能没有被任何一个团队所解决。

写这题最主要注意的是反复出现的字母,第二次出现的话只能加一分。

#include <stdio.h>
#include <string.h>

char str[50];
int main(){
    int t;
    int n;
    scanf("%d", &t);
    while(t--){
        scanf("%d%s", &n, str);
        int score = 0; 
        int word[26]={0};
        for(int i=0; i<n; i++){
            if(!word[str[i]-'A']) {
                score += 2;
                word[str[i]-'A']=1;
            }else
            score++;
        }
        printf("%d\n", score);
    }
    return 0;
}

我爱学习:

现在有n个学生,每个学生都有一个能力值ai,为了方便管理,决定将n个学生分成k组(每个小组里至少要有一个人)。

 如果一个小组有一个能力在该小组极其突出的学生,这个小组就比较容易管理。
这个小组的管理方便度f(i)=第i个小组能力值最大的-第i个小组能力值最小的, 
即f(i)=max(aj∈team i)-min(aj∈team i), 现在想知道f(1)+f(2)+........f(k)的最大值。

看懂题目,这题就是来水的。。。

#include <stdio.h>

int arr[10000];
int sum[10000];
int main()
{
    int n,t;
    int i;
    int max,min;
    while(~scanf("%d",&n))
    {
        max = 0;
        min = 10000;
        scanf("%d",&t);
        for(i = 0; i < n; i++)
        {
            scanf("%d",&arr[i]);
        }
        for(int j = 0; j < t; j++)
        {
            for(i = 0; i < n; i++)
                {   
                    if(max < arr[i])
                        {
                            max = arr[i];
                        }
                    if(min > arr[i])
                        {
                            min = arr[i];
                        }
                }
            printf("%d\n",max - min);
        }
    }
    return 0;
}

交上去才发现自己好像多写了个没有必要的循环。。。但是题目已经过了就没改。

将对应字母交叉:

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

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

搞了半天才发现这个题目自己有个数组写成了整型数组,难怪没有输出。写代码的时候一定要注意不要被习惯带偏。

#include <stdio.h>


char s1[100],s2[100];
char s3[200];
int main()
{
    scanf("%s",s1);
    // getchar();
    scanf("%s",s2);
    int i,j;
    for(i=0,j=0; s1[i]!='\0' && s2[i]!='\0'; i++)
    {
        s3[j++] = s1[i];
        s3[j++] = s2[i];
    }
    while(s1[i]!='\0')
    s3[j++] = s1[i++];
    while(s2[i]!='\0')
    s3[j++] = s2[i++];
    s3[j]='\0';
    printf("%s",s3);
    return 0;
}

最大和最小:给定两个整数 n 和 m,要求 m个整数的和为n,m个整数的乘积最大。
满足条件的整数序列可能有多种,请你输出一个字典序最小的满足条件的序列。

输入:第一行输入两个整数 n和m (1 <= n <= 1e9), (1 <= m <= n <= 1e6)。

输出:输出m个用空格隔开的整数表示字典序最小的一种方案数。

样例输入

7 3

样例输出

2 2 3

其实题目看上去难,只要明白最大和最小值的差值为0或1时这题就很好写出来了。

#include <stdio.h>

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int i = 0;
    int temp = m;
    int count = 0;
    while(1)
    {
        printf("%d ",n/m);
        n -= n/m;
        m--;
        count++;
        if(temp == count)
        {
            break;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值