• 大数相乘的一种实现


        基本步骤:输入字符串—>转化为int数组—>数组相乘。

    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    
    //将字符转换为int
    int chartoint(char a){
    return a-'0';
    }
    
    //将int转换为字符
    /* char inttochar(int i){
    return i+'0';
    }  */
    
    void stoi(char s[],int len,int out_int[]){
    for(int k=0;k<len;k++){
    if(chartoint(s[k])>=0&&chartoint(s[k])<=9){
    out_int[k] = chartoint(s[k]);
    }
    else {
    //输入的字符不是数字时退出程序。
    printf("error!");
    exit(1);
    }
    }
    }
    
    void  mul(int a[],int b[],int len_a,int len_b,int result[])
    {
    for(int i=0;i<len_a;i++){
      for(int j=0;j<len_b;j++){
        result[len_a+len_b-1-i-j]+=a[len_a-1-i]*b[len_b-1-j];
      }  
    }
    for(int i=0;i<len_a+len_b-1;i++){
      result[len_a+len_b-2-i] += result[len_a+len_b-1-i]/10;
      result[len_a+len_b-1-i] %=10;
    }
    }
    
    void print_res(int res[],int len){
    res[0]==0?:printf("%d",res[0]);
    for(int i=1;i<len;i++){
    printf("%d",res[i]);
    }
    printf("
    ");
    }
    
    void main(){
    char * a;
    char * b;
    printf("input a:");
    scanf("%s",a);
    printf("input b:");
    scanf("%s",b); 
    
    DWORD dwStart = GetTickCount();
    
    int len_a = strlen(a);
    int len_b = strlen(b);
    
    int *a_int = (int *)calloc(len_a,sizeof(int));
    int *b_int = (int *)calloc(len_b,sizeof(int));
    int *result = (int *)calloc(len_a+len_b,sizeof(int));
    
    stoi(a,len_a,a_int);
    stoi(b,len_b,b_int);
    
    mul(a_int,b_int,len_a,len_b,result);
    printf("a*b=");
    print_res(result,len_a+len_b);
    
    free(result);
    free(a_int);
    free(b_int);
    result = NULL;
    a_int = NULL;
    b_int = NULL; 
    
    DWORD dwEnd = GetTickCount();
    printf("time used:%d ms",dwEnd-dwStart);
    }

        这里只是提供了一种实现。当然还有更好的算法,比如利用FFT计算大数的乘积,在此暂不探讨。

  • 相关阅读:
    图解Python 【第八篇】:网络编程-进程、线程和协程
    TCP协议三次握手、四次挥手过程
    OSI七层模型与TCP/IP五层模型
    TCP/IP协议分为哪四层,具体作用是什么。
    app测试中,ios和android的区别
    APP在用户设备发生crash,应该怎么修复
    Android四层架构
    安卓四大组件、六大布局、五大存储
    测试工程师准备找工作,需要准备什么?
    接口测试响应码解析
  • 原文地址:https://www.cnblogs.com/buptpatriot/p/3243786.html
Copyright © 2020-2023  润新知