仔细观察并找到规律
代码如下:
#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]);
}
}
#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));
}
#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));
}
#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);
}