算法学习--Day6
题目描述
输入描述:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出描述:
可能有多组测试数据,对于每组数据,
输出a+b的值。
输入
2 6
10000000000000000000 10000000000000000000000000000000
输出
8
10000000000010000000000000000000
#include "stdio.h"
#include "iostream"
#include "string.h"
using namespace std; struct bigInteger{
int digit[];
//to save the numbers
int size;
//to save the array's size
void init(){
for (int i = ; i < ; ++i) {
digit[i] = ;
}
size = ;
}
//this is an init function. void set(char str[]){ //to put a string into our array.
init();
int L = strlen(str);
int ans=;
int times=;
int c=;
//we use the c to multiple 1、10、.....100000....
for (int i = L -; i >= ; i--) {
ans+=(str[i]-'')*c;
times++;
c*=;
if(times== || i==){
//i=0 to avoid the final array not being saved.
digit[size++] = ans;
times = ;
c = ;
ans = ;
}
}
} bigInteger operator + (const bigInteger &A) const {
bigInteger ret;
ret.init();
int nextMove = ; for (int i = ; i <size|| i<A.size ; ++i) {
int tmp = digit[i]+ A.digit[i] +nextMove;
nextMove = tmp /;
ret.digit[ret.size++] = tmp%;
}
if(nextMove!=){
ret.digit[ret.size++] = nextMove;
}
return ret;
}; void output(){
for (int i = size-; i >= ; i--) {
if(i!=size-) printf("%04d",digit[i]);
else{
printf("%d",digit[i]);
} }
cout<<endl;
}
}a,b,c; int main(){
char str1[],str2[];
while (scanf("%s%s",str1,str2)!=EOF){
a.set(str1);
b.set(str2);
c = a+b;
c.output(); } return ;
}
以前写密码学设计的时候就一直听说有高精度的设计,今天终于也实现了一把高精度的加法。因为从前没有接触过,所以也把思想放这里,方便以后查阅。
高精度的算法实现的思想大致为:
①创建一个结构体,在结构体中定义数组,将很大的数分成几个部分装到这个数组中。
②之后重构运算符,将两个数字一一对应的部分相加,并考虑进位的情况。
③定义输入、输出函数,将字符串数组输入并处理到结构体的数组中。
不过结构体中的细节要考虑一些,毕竟算法比较严谨。
之后我将近期写的部分代码放上来。
题目描述
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
输入
120
输出
5
#include "stdio.h"
#include "iostream"
using namespace std;
int prime[];
int flag[];
int f=;
int init(){
for (int i = ; i < ; ++i) {
flag[i] = ;
}
for (int j = ; j < ; ++j) {
if(flag[j]==) continue;
prime[f++] = j;
for (int i = j*j; i < ; i+=j) {
flag[i] = ;
}
}
return ;
} int main(){
init();
int n;
while (scanf("%d",&n)!=EOF){
int primeCup[];
int perCount[];
int count=;
for (int i = ; i < f; ++i) {
if(n%prime[i] == ){
primeCup[count] = prime[i];
perCount[count] = ;
while (n % prime[i] == ){
perCount[count]++;
n/=prime[i];
}
count++;
if(n==) break;
} }
if(n!=){
primeCup[count] = n;
perCount[count++] = ;
}
int ans=;
for (int j = ; j < count; ++j) {
ans+=perCount[j];
}
cout<<ans<<endl;
} return ;
}
题目描述
输入描述:
k≤10000
输出描述:
The k-th prime number.
输入
3
7
输出
5
17
//Prime Number #include "stdio.h"
#include "iostream"
#include "math.h"
using namespace std;
int prime[];
int f=;
int init(){
int flag[];
for (int i = ; i < ; ++i) {
flag[i]=;
}
for (int j = ; j <= ; ++j) {
if(flag[j]==) continue;
else{
prime[f++] = j;
for (int i = j*j; i <= ; i+=j) {
flag[i] = ;
}
}
}
return ;
}
int main(){
init();
int n ;
while (scanf("%d",&n)!=EOF){
cout<<prime[n-]<<endl;
}
return ;
}
这是素数的处理方法,使用预处理先行处理之后就很方便得到了。
题目描述
输入描述:
测试数据有多组,每组输入两个正整数。
输出描述:
对于每组输入,请输出其最大公约数。
输入
49 14
输出
7
//最大公约数
#include "stdio.h"
#include "iostream"
using namespace std;
int init(int a, int b){
if(b==){ return a;}
else{
return init(b,a%b);
}
} int main(){
int a,b;
while (scanf("%d%d",&a,&b)!=EOF){
a>=b?cout<<init(a,b)<<endl:cout<<init(b,a)<<endl;
}
}
题目描述
输入描述:
输入包括一个整数N(0<=N<=100000)。
输出描述:
可能有多组测试数据,对于每组数据,
输出N的八进制表示数。
输入
7
8
9
输出
7
10
11
//八进制 #include "stdio.h"
#include "iostream"
using namespace std; int main(){
int n;
while (scanf("%d",&n)!=EOF){
int ans=,flag=;
int fin[]; while (n!=){
ans=n%;
n/=;
fin[flag++]=ans;
}
for (int i = flag-; i >= ; i--) {
cout<<fin[i];
}
cout<<endl;
}
}
这是进制转换类型的题目,这种题目比较基础,但是考的也挺多。
所以下面我放上去通用的题目,输入任意进制 转化为任意进制。
例如:15 Aab3 7
将15进制转换为7进制并输出。
//数值转换 #include "iostream"
#include "string.h"
#include "stdio.h"
using namespace std; int main(){
int n,m;
char input[];
while (scanf("%d%s%d",&n,input,&m)!=EOF){
int length = strlen(input);
int first=;
int ans = ;
for (int i = length-; i >=; i--) {
int x;
if(input[i]>=''&&input[i]<='') {
x = input[i] - '';
}
if(input[i]>='a'&&input[i]<='z'){
x = input[i] - 'a' +;
}
if(input[i]>='A'&&input[i]<='Z'){
x = input[i] - 'A'+;
}
ans+=x*first;
first=first*n; }
char output[];
int flag=;
do{
int y =ans % m;
if (y>=) {output[flag] = (y-)+'A';} else {output[flag] = y+'';} flag ++;
ans/=m;
}while (ans);
for (int j = flag-; j >= ; j--) {
cout<<output[j];
}
cout<<endl;
}
}
题目描述
输入描述:
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
输出描述:
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
输入
8 1300 48
2 1 7
0
输出
2504
1000
//
// Created by 陈平 on 2018/4/22.
//又一板 A+B
#include "stdio.h"
#include "iostream"
#include "math.h"
using namespace std;
long long a,b;
int mFunction(int m, long long a){
int con[];
int flag = ; while (a!=){
con[flag] = a%m;
a/=m;
flag++;
}
for (int i = flag-; i >= ; i--) {
cout<<con[i];
}
cout<<endl;
return ;
}
int main(){
int m;
while (scanf("%d",&m)!=EOF&&m!=){
scanf("%lld%lld",&a,&b);
long long fin = a+b;
if (a==&b==) cout<<<<endl;
else mFunction(m,fin); }
return ;
}
算法学习--Day6的更多相关文章
- DSP算法学习-过采样技术
DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...
- 算法学习之C语言基础
算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- PCA算法学习(Matlab实现)
PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的. 实现数据降维的步骤: 1.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ...
随机推荐
- Arrays.sort(a) 自定义排序
Arrays.sort(a) 自定义排序,(需实现接口:Comparable) package com.hd; import java.util.Arrays; class Person imple ...
- iOS开发- OpenGL ES屏幕截图
之前写过一个常规的屏幕截图:http://blog.csdn.net/hitwhylz/article/details/17189351 可是发现这个办法对于OpenGL 无用. 获取到的数据为空. ...
- SpringBoot-(4)-Filter的使用
一,Filter Filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到 ...
- jquery DataTables表格插件的使用(网页数据表格化及分页显示)
DataTables - 非常强大的 jQuery 表格插件,可变宽页码浏览,现场过滤. 多列排序,自动探测数据类型,智能列宽,可从几乎任何数据源获取数据. 那么在Bootstrap下如何使用Data ...
- undefined reference to '__android_log_print'解决方案
1:在源程序中添加头文件 #include <cutils/log.h> 2:在Android.mk中添加 LOCAL_SHARED_LIBRARIES := \ libutils \ l ...
- SDUT OJ 2088 refresh的停车场
refresh的停车场 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 refresh最近发了一笔横财,开了一家停车场.由于土地 ...
- UVA11551 Experienced Endeavour —— 矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-11551 题意: 给定一列数,每个数对应一个变换,变换为原先数列一些位置相加起来的和,问r次变换后的序列是多少 题解: 构造矩 ...
- MySQL学习笔记(二)——检索数据与过滤数据
检索数据和过滤数据也就是平时用到最多的增删改查里面的查了. 一.数据检索 检索单个列: select column from table; 检索多个列: select colunm1,colu ...
- servlet过滤器Filter(理论篇)
为了减少servlet容器在服务器端对信息的判断量,产生了servlet过滤器. servlet过滤器是在java servlet规范2.3中定义的,他能够对servlet容器的请求和响应对象进行检查 ...
- SQL server 备份/恢复/压缩 进度查询
第一步,用 sp_who2 查出备份的sid(或在窗口中的连接属性中看) exec sp_who2 第二步,用以下查询获得运行情况(看 percent_complete列) SELECT sessio ...