DAY-04

来源:互联网 发布:简单pdf解密软件 编辑:程序博客网 时间:2024/05/18 13:11

找规律的题

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

#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 1000000long 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 1000000long 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);}