zoukankan      html  css  js  c++  java
  • 算法学习--Day6

    题目描述

    实现一个加法器,使其能够输出a+b的值。

    输入描述:

    输入包括两个数a和b,其中a和b的位数不超过1000位。

    输出描述:

    可能有多组测试数据,对于每组数据,
    输出a+b的值。
    示例1

    输入

    2 6
    10000000000000000000 10000000000000000000000000000000
    

    输出

    8
    10000000000010000000000000000000

    
    #include "stdio.h"
    #include "iostream"
    #include "string.h"
    using namespace std;
    
    
    struct bigInteger{
        int digit[1000];
    //to save the numbers
        int size;
        //to save the array's size
        void init(){
            for (int i = 0; i <1000 ; ++i) {
                digit[i] = 0;
            }
            size = 0;
        }
        //this is an init function.
    
        void set(char str[]){  //to put a string into our array.
            init();
            int L = strlen(str);
            int ans=0;
            int times=0;
            int c=1;
            //we use the c to multiple 1、10、.....100000....
            for (int i = L -1; i >=0 ; i--) {
                ans+=(str[i]-'0')*c;
                times++;
                c*=10;
                if(times==4 || i==0){
                    //i=0 to avoid the final array not being saved.
                    digit[size++] = ans;
                    times = 0;
                    c = 1;
                    ans = 0;
                }
            }
        }
    
        bigInteger operator + (const bigInteger &A) const {
            bigInteger ret;
            ret.init();
            int nextMove = 0;
    
            for (int i = 0; i <size|| i<A.size ; ++i) {
                int tmp = digit[i]+ A.digit[i] +nextMove;
                nextMove = tmp /10000;
                ret.digit[ret.size++] = tmp%10000;
            }
            if(nextMove!=0){
                ret.digit[ret.size++] = nextMove;
            }
            return ret;
        };
    
        void output(){
            for (int i = size-1; i >=0 ; i--) {
                if(i!=size-1) printf("%04d",digit[i]);
                else{
                    printf("%d",digit[i]);
                }
    
            }
            cout<<endl;
        }
    }a,b,c;
    
    int main(){
        char str1[1001],str2[1001];
        while (scanf("%s%s",str1,str2)!=EOF){
            a.set(str1);
            b.set(str2);
            c = a+b;
            c.output();
    
    
        }
    
        return 0;
    }

    以前写密码学设计的时候就一直听说有高精度的设计,今天终于也实现了一把高精度的加法。因为从前没有接触过,所以也把思想放这里,方便以后查阅。

    高精度的算法实现的思想大致为:

    ①创建一个结构体,在结构体中定义数组,将很大的数分成几个部分装到这个数组中。

    ②之后重构运算符,将两个数字一一对应的部分相加,并考虑进位的情况。

    ③定义输入、输出函数,将字符串数组输入并处理到结构体的数组中。

    不过结构体中的细节要考虑一些,毕竟算法比较严谨。

    之后我将近期写的部分代码放上来。

    题目描述

    求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。

    输入描述:

    可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。

    输出描述:

    对于每组数据,输出N的质因数的个数。
    示例1

    输入

    120
    

    输出

    5

    
    #include "stdio.h"
    #include "iostream"
    using namespace std;
    int prime[100000];
    int flag[100000];
    int f=0;
    int init(){
        for (int i = 0; i < 100000; ++i) {
            flag[i] = 1;
        }
        for (int j = 2; j < 10000; ++j) {
            if(flag[j]==0) continue;
            prime[f++] = j;
            for (int i = j*j; i < 10000; i+=j) {
                flag[i] = 0;
            }
        }
        return 0;
    }
    
    int main(){
        init();
        int n;
        while (scanf("%d",&n)!=EOF){
            int primeCup[100];
            int perCount[100];
            int count=0;
            for (int i = 0; i < f; ++i) {
                if(n%prime[i] == 0){
                    primeCup[count] = prime[i];
                    perCount[count] = 0;
                    while (n % prime[i] == 0){
                        perCount[count]++;
                        n/=prime[i];
                    }
                    count++;
                    if(n==1) break;
                }
    
            }
            if(n!=1){
                primeCup[count] = n;
                perCount[count++] = 1;
            }
    int ans=0;
            for (int j = 0; j < count; ++j) {
                ans+=perCount[j];
            }
            cout<<ans<<endl;
        }
    
    
        return 0;
    }

    题目描述

    Output the k-th prime number.

    输入描述:

    k≤10000

    输出描述:

    The k-th prime number.
    示例1

    输入

    3
    7
    

    输出

    5
    17

    //Prime Number
    
    #include "stdio.h"
    #include "iostream"
    #include "math.h"
    using namespace std;
    int prime[100000];
    int f=0;
    int init(){
        int flag[100000];
        for (int i = 0; i <100000 ; ++i) {
            flag[i]=1;
        }
        for (int j = 2; j <=100000 ; ++j) {
            if(flag[j]==0) continue;
            else{
                prime[f++] = j;
                for (int i = j*j; i <= 100000; i+=j) {
                    flag[i] = 0;
                }
            }
        }
        return 0;
    }
    int main(){
        init();
        int n ;
        while (scanf("%d",&n)!=EOF){
            cout<<prime[n-1]<<endl;
        }
        return 0;
    }

    这是素数的处理方法,使用预处理先行处理之后就很方便得到了。

    题目描述

    输入两个正整数,求其最大公约数。

    输入描述:

    测试数据有多组,每组输入两个正整数。

    输出描述:

    对于每组输入,请输出其最大公约数。
    示例1

    输入

    49 14
    

    输出

    7
    //最大公约数
    #include "stdio.h"
    #include "iostream"
    using namespace std;
    int init(int a, int b){
        if(b==0){ 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的八进制表示数。
    示例1

    输入

    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=0,flag=0;
            int fin[100];
    
            while (n!=0){
                ans=n%8;
                n/=8;
                fin[flag++]=ans;
            }
            for (int i = flag-1; i >=0 ; 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[100];
        while (scanf("%d%s%d",&n,input,&m)!=EOF){
            int length = strlen(input);
            int first=1;
            int ans = 0;
            for (int i = length-1; i >=0; i--) {
                int x;
                if(input[i]>='0'&&input[i]<='9') {
                    x = input[i] - '0';
                }
                if(input[i]>='a'&&input[i]<='z'){
                    x = input[i] - 'a' +10;
                }
                if(input[i]>='A'&&input[i]<='Z'){
                    x = input[i] - 'A'+10;
                }
                ans+=x*first;
                first=first*n;
    
            }
            char output[100];
            int flag=0;
            do{
                int y =ans % m;
                if (y>=10) {output[flag] = (y-10)+'A';}
    
                else {output[flag] = y+'0';}
    
                flag ++;
                ans/=m;
            }while (ans);
            for (int j = flag-1; j >=0 ; j--) {
                cout<<output[j];
            }
            cout<<endl;
        }
    }

    题目描述

    输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。

    输入描述:

    输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
    当m为0时输入结束。

    输出描述:

    输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
    示例1

    输入

    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[100];
        int flag = 0;
    
        while (a!=0){
            con[flag] = a%m;
            a/=m;
            flag++;
        }
        for (int i = flag-1; i >=0 ; i--) {
            cout<<con[i];
        }
        cout<<endl;
        return 0;
    }
    int main(){
    int m;
        while (scanf("%d",&m)!=EOF&&m!=0){
            scanf("%lld%lld",&a,&b);
            long long fin = a+b;
            if (a==0&b==0) cout<<0<<endl;
            else mFunction(m,fin);
    
        }
        return 0;
    }
  • 相关阅读:
    计算机编码总结
    将TOMCAT设置成为NT服务
    java 操作oracle 序号器相关
    java事件机制
    c# Semaphore(信号量)
    C#中异步和多线程的区别
    c#多线程调用有参数的方法
    解决TCP网络传输“粘包”问题
    高性能socket设计实现
    c# Buffer学习笔记
  • 原文地址:https://www.cnblogs.com/Pinging/p/8947111.html
Copyright © 2011-2022 走看看