1月4日学习记录

文章描述了一位程序员在解决一系列编程问题时的思路和方法,包括数字拆分、打印金字塔、数组操作、斐波那契数列的递归实现以及字符串处理等。每个问题都给出了相应的代码实现,但面临一些错误和性能问题,如数组大小限制和循环优化。
摘要由CSDN通过智能技术生成

  今天一直在刷题目,但是头疼的是有几个题目oj一直过不去,也暂时先记录下来,怕自己找不到位置,几乎是知错了一个样例,但却死活没找出是哪个。。。

 数字拆分:

给定一组整数 l 和 r,(1 <= l <= r <= 100000), 再给定一个整数 t (0 <= t <= 9),求 [l, r] 之间的数的十进制表示中会出现多少个 t。

这题我开始是打算写一个函数去做,但是发现又麻烦而且还不好弄,于是直接暴力求解。

#include <stdio.h>

int divide(int n)
{
}

int main()
{
    int l,r,t;
    scanf("%d %d %d",&l,&r,&t);
    int i;
    int count = 0;
    int temp;
    int temp2;
    for(i = l; i <= r; i++)
    {
        if(i < 10)
        {
            if( i == t)
            {
                count++;
            }
        }else{
            temp = i;
            while(temp > 0)
            {
                temp2 = temp%10;
                temp /= 10;
                if(temp2 == t)
                {
                    count++;
                }
            }
        }
    }
    printf("%d",count);
    return 0;
}

打印金字塔:

输入n值,打印下列形状的金字塔,其中n代表金字塔的层数。

这题应该是直接写出来的。。。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d",&n);
    int i,j;
    for(i = 1; i <= n; i++)
    {
        for(j = i; j < n; j++)
        {
            printf("  ");
        }
        for(j = 1; j <= i; j++)
        {
            printf("%d",j);
            if(i != 1)
            {
                printf(" ");
            }
        }
        for(j = i - 1; j > 0; j--)
            {
                printf("%d",j);
                if(j != 1)
                {
                    printf(" ");
                }
            }
        printf("\n");
    }
    return 0;
}

按指定位置输出:

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

这题我开始一直想着用一个数组,把一个数组倒序输出就行,后来几次错误证实了这个想法的不可行性,于是便用了两个数组去储存,再将一个数组返向储存回原数组进行 输出。

#include <stdio.h>

int a[10],b[10];
int main()
{
    int i;
    char c1,c2,c;
    for(i = 0;i < 10; i++)
    {
        scanf("%d",&a[i]);
        b[i] = a[i];
    }
    getchar();
    int n,m;
    int j,k = 0;
    scanf("%c:%d",&c1,&m);
    getchar();
    scanf("%c:%d",&c2,&n);
    for(i = m,j = m + n - 1;k < n;i++,j--,k++)
    {
        a[i] = b[j];
    }
    for(i = 0; i < 10; i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

斐波那契数列:

编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的斐波那契数列。

这个斐波那契数列与一般的斐波那契不同,我开始只当做一个简单的数列,直接去求和,后来发现是挨个输出,尤其记住前面有个0;

#include <stdio.h>

void fib(int n)
{
    if(n == 0)
    {
        return ;
    }else{
        fib(n - 1);
        int a=1,b=1,temp;
        int i;
        printf("0");
        for(i = 1; i < n; ++i)
        {
            printf(" %d %d",a,b);
            temp = a + b;
            a = temp;
            b += temp;
        }
        printf("\n");
    }
}

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

小谭吃东西:

话说我们家小谭啊,他特别的好吃懒做,对于吃还很挑剔,有一天他得到了一堆的饮料,他就想要喝掉这些饮料,但是他喝饮料有个特殊的习惯,那就是不喜欢连续两次喝相同的饮料,小谭不知道是否存在一种喝饮料的顺序使得他能够喝完所有的饮料,所以他请你帮他写个程序来测一测。

#include <stdio.h>

int arr[100000];
int main()
{
    int n;
    double max = 0,min = 0;
    while(scanf("%d",&n)!=EOF)
    {
        int i;
        for(i = 0; i < n; i++)
        {
            scanf("%d",&arr[i]);
        }
        for(i = 0; i < n; i++)
        {
            if(max < arr[i])
            {
                max = arr[i];
            }
        }
        for(i = 0; i < n; i++)
        {
            min += arr[i];
        }
        min -= max;
        if((min + 1) >= max)
        printf("yes\n");
        else
        printf("no\n");
        max = 0;
        min = 0;
    }
    return 0;
}

小叶子学英文:

题目描述

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

由于数太大了所以只能用字符型数组去记录,但是有一组样例实在过不去我也找不出是哪一个。。。

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

char str[100000000];
int arr[10000000];
int SUM[10000000];
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);
    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;
}

在加上数组好像开大了时间就超限了。。。

将对应字母交叉:

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

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

这题目我也不知道到底错了哪里,不论是样例还是我自己随便输入的数据也没点问题,oj就是过不去。。。硬要找问题出来可能就是我只用了两个数组

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

char c1[20],c2[20];
 int main()
 {
    int i;
    gets(c1);
    gets(c2);
    int lenA = strlen(c1);
    int lenB = strlen(c2);
    for(i = 0;i < (lenA+lenB);i++)
    {
        printf("%c",c1[i]);
        printf("%c",c2[i]);
    }
    return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值