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);}
阅读全文
0 0
- day-04
- Day-04
- DAY-04
- Nacues day by day 04
- day-04-02
- IOS_study day 04
- 04-day-补充知识点
- Day 04 GenericServlet
- Day 04-2 HttpServlet
- day
- day\\\
- day 04 考不完的试
- JAVA SE — Day 04
- day day day upupupup
- java study 04day-数组排序
- java study 04day--进制转换
- java study 04day--二维数组
- php the second day 2013.07.04
- spring入门
- 安卓调试stetho抛开繁琐配置——三步搞定
- localStorage的设置和取值Demo
- Python基础学习记录
- Git之(二)基础命令
- DAY-04
- STM32L151 usart2 串口2 程序
- SAR变化检测的性能指标(kappa系数)——简化版
- 全国各地区怎么注册公司????
- 分类与回归树(CART)- 机器学习ML
- 学习WPF的第一步
- 【Vuforia官方文档】在Unity中动态改变模型的显示
- ZSTACK协调器掉电重新组网无法加入网络的解决
- 人工智能时代来临,看未来的司法如何运行?