DAY-04

找规律的题

仔细观察并找到规律
代码如下:



#include <stdio.h>
#include <inttypes.h>

int32_t GetLetterNum(int32_t i) {
    static int32_t LN20[20] = {
        0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3,
        6, 6, 8, 8, 7, 7, 9, 8, 8
    };
    static int32_t LN_shi[10] = {
        0, 0, 6, 6, 5, 5, 5, 7, 6, 6
    };
    int32_t temp;
    if (i < 20) {
        return LN20[i];
    } else if (i < 100) {
        return LN_shi[i / 10] + LN20[i % 10];
    } else if (i < 1000) {
        temp = GetLetterNum(i % 100);
        if (temp != 0) temp += 3;
        return temp + LN20[i / 100] + 7;
    } else if (i == 1000) {
        return 11;
    } else {
        return 0;
    }
    return 0;
}

int32_t main() {
    int32_t sum = 0;
    for (int32_t i = 1; i<= 1000; ++i) {
        sum += GetLetterNum(i);
    }
    printf("%d\n", sum);
    return 0;
}

循环数组解决大数问题

在解决这道题之前,我们不防先看看下面的大数加法,先建立起一个关于大数运算的框架;

#include<iostream>
#include<stdio.h>

using namespace std;


long f[3][1005] = {0};

int main()
{
    f[1][0] = f[1][1] = 1;
    f[2][1] = f[2][0] = 1;
    f[0][0] = 1;
    long  num = 2;
    while(f[num % 3][0] < 1000)
    {
       num++;
        for(long i = 1; i <= f[(num - 1) % 3][0]; i++)
        {
            f[num % 3][i] = f[(num - 1) % 3][i] + f[(num - 2) % 3][i];
        }
        f[num % 3][0] = f[(num - 1) % 3][0];
        for(long i = 1; i <= f[num % 3][0]; i++)
        {
            if(f[num % 3][i] < 10)
            continue;
            f[num % 3][i + 1] += f[num % 3][i] / 10;
            f[num % 3][i] %= 10;
            if(i == f[num % 3][0])
            f[num % 3][0]++;
        }
        cout << "lalala" << endl;

    }
    printf("%ld\n", num);

}

递归思想(动态规划雏形)

1.状态方程
2.便捷确定
3.编程实现

F(K, N) = F(K - 1, N) + F(K, N - W(K));

#include<iostream>
#include<stdio.h>
using namespace std;

int w(int x)
{
    static int a[9] = {0, 1, 2, 5, 10, 20, 50, 100, 200};
    return a[x];
}

int f(int k, int n)
{
    if(n == 1)
    return 1;
    if(n == 0)
    return 1;
    if(n < 0)
    return 0;
    if(k == 1)
    return 1;
    return f(k - 1, n) +f(k, n - w(k)); 
}


int main()
{
    printf("%d\n", f(8, 200));
}

大数加法

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

char s[55];
int a[60] = {0};


int main()
{
    while(~scanf("%s", s))
    {
        int len = strlen(s);
        for(int i = 0; i < len; i++)
        {
            a[len - i] += s[i] - '0';
        }
        if(a[0] < len)
        a[0] = len;
        for(int i = 1; i <= a[0]; i++ )
        {
            if(a[i] < 10)
            continue;
            a[i + 1] += a[i] / 10;
            a[i] %= 10;
            if(i == a[0])
            a[0]++;
        }
    }
    for(int i = a[0]; i >a[0] - 10; i-- )
    {
        printf("%d", a[i]);
    }
}

problem 32

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int s[1000000] = {0};

int is_value(int x, int y, int z)
{
    int a[10] = {0};

    while(x || y ||z)
    {
        a[x % 10] = 1;
        a[y % 10] = 1;
        a[z % 10] = 1;
        x /= 10; y /= 10; z /= 10;
    }

    int num = 0;
    for(int j = 1; j <= 9; j++)
    {
        if(a[j] == 0)
        num ++;
    }
    if(num == 0)
    return 1;
    else
    return 0;

}


int digit_num(int x, int y, int z)
{
    if(floor(log10(x)) + floor(log10(y)) + floor(log10(z)) + 3 > 9)
    return 0;
    else
    return 1;
}



int main()
{
   long long sum = 0;
    for(int i = 1; i <= 99; i++)
    {
        for(int j = 99; j <= 2000; j++)
        {
            if(is_value(i, j, i * j) && s[i * j] == 0 && digit_num(i, j, i * j))
            {

                sum += i * j;

                s[i * j] = 1;
                cout << i * j  << endl;
            }

        }
    }


    cout << is_value(39, 186, 7254) << endl;
    printf("%lld\n", sum);
}

除法转乘法

#include<iostream>
#include<stdio.h>
using namespace std;

int gcd(int a, int b)
{
    if(b == 0)
    return a;
    return gcd(b, a % b);
}

int is_same(int a, int b)
{
    if(a % 10 == b / 10 && a / 10 < b % 10)
    return 1;
    else
    return 0;
}




int is_value(int a, int b)
{
   int c = a / 10;
    int d = b % 10;
    if(a * d == b * c && is_same(a, b))
    return 1;
    else
    return 0;
}



int main()
{

    long long sum1 = 1, sum2 = 1, num = 0;
    int k1 = 1, k2 = 1;
    for(int i = 10; i < 100; i++)
    {
        if(i % 10 == 0)
        continue;
        for(int j = i + 1; j < 100; j++)
        {
            if(is_value(i, j))
            {
                sum1 *= i;
                sum2 *= j;
              //  printf("%d  %d\n", sum1, sum2);
              // k1 *= sum1 /  gcd(sum1, sum2);
               // k2 *=sum2 /  gcd(sum1, sum2);
               // printf("%d  %d\n", sum1, sum2);

                num++;
            }
        }
    }

    printf("%lld    %d\n", sum2 / gcd(sum1, sum2));
  //  printf("%d", gcd(6, 4));

}

problem 35

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

#define maxn_range 1000000
long long p[maxn_range] = {0};

bool is_prime(long long x)
{
    for(long long i = 2;i * i <= x; i++)
    {
        if(x % i == 0)
        return 0;
    }
    return 1;
}


int is_value(long long y)
{
    int m = floor(log10(y)) + 1;
    int n = 1;
    for(int i = 1; i < m; i++)
    n *= 10;
    while(m --)
    {
        y = y % n * 10 + y / n;
        if(!is_prime(y))
        return 0;
    }
    return 1;
}



int main()
{
   int num = 0;
    for(long long i = 2; i < maxn_range; i++)
    {
        if(!p[i])
        {
            p[++p[0]] = i;
            if(is_value(i))
            num++;
        }
        for(long long j = 1; j <= p[0]; j++)
        {
            if(i * p[j] > maxn_range)
            break;
            p[i * p[j]] = 1;
            if(i % p[j] == 0)
            break;
        }
    }
    printf("%d\n", num);
    int k;
    while(~scanf("%d", &k))
    printf("%d\n", is_value(k));
}

problem 37

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

#define maxn_range 1000000
long long prime[maxn_range] = {0};

int is_prime(long long x)
{
   if(x == 1)
    return 0;
    for(int i = 2; i * i <= x; i++)
    {
        if(x % i == 0)
        return 0;
    }
    return 1;
}

int is_value(long long n)
{
    int m = pow(10, floor(log10(n)));
    int m1 = m;
    while(m )
    {
        if(!is_prime(n / m))
        return 0;
        m /= 10;
    }
    while(m1)
    {
        if(!is_prime(n % m1))
        return 0;
        m1 /= 10;
    }
    return 1;
}


int main()
{
   long long sum = 0, num = 0;
    for(int i = 2; i < maxn_range; i++)
    {
        if(!prime[i])
        {
            prime[++prime[0]] = i;
            if(is_value(i) && i > 10 && num <= 11)
            {
                sum += i;
                num++;
                cout << i << endl;
            }
        }
        for(int j = 1; j <= prime[0]; j++)
        {
            if(i * prime[j] > maxn_range)
            break;
            prime[i * prime[j]] = 1;
            if(i % prime[j] == 0)
            break;
        }
    }
   int k;
   // scanf("%d", &k);
   // printf("%d\n", is_value(k));
    printf("%lld    %lld\n", sum, num);
}

二分法查找

二分法:

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;


long long is_pen(long long x)
{
    return x * (x * 3- 1) / 2; 
}


int is_value(long long n)
{
    long long head = 1, tail = n;
    long long mid = (head + tail) >> 1;
    long long t;
    while(head <= tail)
    {
        if(is_pen(mid) == n)
        return 1;
        if(is_pen(mid) < n)
        head = mid + 1;
        if(is_pen(mid) > n)
        tail = mid - 1;
        mid = (head + tail) >> 1;
    }
    return 0;
}


int main()
{
    long long k = 2;
    long long D = 99999999999;
    int n1;
   /* while(~scanf("%d", &n1))
    {
        printf("%d\n", is_value(n1));
    }*/
    while(is_pen(k) - is_pen(k - 1) < D)
    {
        long long num = k - 1;
       // cout << num << endl;
       // break;
        while(is_pen(k) - is_pen(num) < D)
        {
            if(is_value(is_pen(k) + is_pen(num)) && is_value(is_pen(k) - is_pen(num)))
            D = is_pen(k) - is_pen(num);
            num--;
           // cout << num  << endl;
           // break;
            if(num <= 0)
            break;
        }
       // break;
        k++;
    }
    printf("%lld\n", D);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值