字符统计&大数乘法&数组排序

题目1:求字符在字符串中出现的次数

void func(const char *str,char *res);

输入:str是输入字符串,结果保存在res中

如输入"AAABBCCD"输出"A3B2C2D1"

/**
*求字符在字符串中出现的次数
*/

#include <iostream>
using namespace std;

void func(const char *str, char *res)
{
    const char *p=str;  //p必须是const char*,因为const char*指向的内容不能被char*指向
    char *r=res;
    int c[26]={0};
    while(*p!='\0')
    {
        c[*p-'A']++;
        p++;
    }

    for(int i=0;i<26;i++)
    {
        if(c[i])
        {
            *r=i+'A';
            r++;
            *r=c[i]+'0';    //这里r指向的是字符数组,所以c[i]必须转化为char型
            r++;
        }
    }
    *r='\0';
}

int main()
{
    const char *c1="AAABBCCD";
    char *res=new char[104];
    func(c1,res);
    cout<<res<<endl;
    return 0;
}

总结:在这里关于c[*p-'A']是ASCII码的计算

字符 ASCII

NULL 0

..................

0 48

...................

9 57

...................

A 65

....................

Z 90

....................

a 97

....................

z 122



题目2:大数乘法

求两个100位以内的大数字符串乘积,结果保存在一个字符串中

void func(const *char num1,const *char num2,int m,int n,*char res);

输入:num1,num2为输入大数字符串,m,n为大数位数

函数功能:结果保存在res中


UP主的思路:假设被乘数num1=324有3位,,乘数num2=26有2位,模仿多位数相乘的步骤,所写出乘法算式如下,在int数组中左边是低位,右边是高位

(ps:char转化为int型只需要char字符-‘0’即可)

423

* 62

——————

中间的计算过程需要建立一个2*(3+2)的多维数组记录计算过程,则出现如下的矩阵,位移位用0补足


数组位| 0,1234

int数值| 0,8460

+24,12,1800

________________________

24,202260


进位运算

for(k=0;k<m+n;k++)
    {
        if(r[k]>9)
        {
            int flag=r[k]/10;
            r[k+1]+=flag;
            r[k]=r[k]%10;
        }
    }


进位后结果: 42480

该结果就是相乘后的成绩8424,然后再将该int数组翻转使数值左边是高位,右边是低位,符合一般的数学常识,最后将数值转化为字符串输出即可。


完整代码如下:

/**
*大数乘法
*/
#include <iostream>
#include <string>
using namespace std;
void itos(int r[],int len,char *res);
void func(const char *num1,const char *num2,int m,int n,char *res)
{
    const char *n1=num1;
    const char *n2=num2;
    int a[n][m+n];
    for(int i=0;i<n;i++)
        for(int j=0;j<m+n;j++)
            a[i][j]=0;
    int k=0;                //做乘法运算时偏移的位数
    for(int i=n-1;i>=0;i--)    //i对应于n2的位数
    {
        for(int j=m-1,q=k;j>=0;j--,q++)    //j对应于n1的位数
        {

            a[i][q]=(n1[j]-'0')*(n2[i]-'0');
            //cout<<a[i][j]<<' ';
        }
        k++;
    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m+n;j++)
            cout<<a[i][j]<<' ';
        cout<<'\n';
    }

    cout<<'\n'<<endl;
    int r[m+n];
    for(int i=0;i<m+n;i++)
        r[i]=0;

    int q=0;
    for(int i=0;i<m+n;i++)
    {
        for(int j=0;j<n;j++)
        {
            r[q]+=a[j][i];
        }
        cout<<r[q]<<' ';
        q++;

    }
    cout<<endl;
    for(k=0;k<m+n;k++)
    {
        if(r[k]>9)
        {
            int flag=r[k]/10;
            r[k+1]+=flag;
            r[k]=r[k]%10;
        }
    }
    for(int p=0;p<m+n;p++)
        cout<<r[p]<<' ';

    cout<<"\n-----------分割线,以上为测试输出------------\n"<<endl;
    itos(r,m+n,res);


}
//实现功能:把int型数组翻转并转化为字符串
void itos(int r[],int len,char *res)
{
    int temp;
    //翻转乘积的Int数组
    for(int i=0,j=len-1;i<j;i++,j--)
    {
        temp=r[j];
        r[j]=r[i];
        r[i]=temp;
    }

    //转化为字符串
    int p,q;
    for(p=0,q=0;p<len;p++)
    {
        if(r[p])    //忽略高位的0
        {
            res[q]=r[p]+'0';
            q++;
        }
    }
    res[q]='\0';
}


int main()
{
    const char *n1="324";
    const char *n2="26";
    const int m=3,n=2;
    char *res=new char[m+n+1];
    func(n1,n2,m,n,res);
    cout<<res<<endl;
    return 0;
}



UP主在编写过程中思路持续凌乱,代码缺乏可读性,希望读者可以给与更好的方法~~~


题目3:

int a[nSize],其中隐藏着若干0,其余非0整数,写一个函数int func(int* a, int nSize),使A0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)

#include <iostream>

using namespace std;

int func(int *a,int nSize)
{
    int i=0,j=nSize-1;
    int temp;
    while(i<j)
    {
        while(a[i])
        {
            i++;
        }
        while(!a[j])
        {
            j--;
        }
        if(!a[i]&&a[j]&&i<j)
        {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            i++;
            j--;
        }
    }
    int mFlag,k,m;
    for(k=0;a[k];k++)
    {
        mFlag=k;
        for(m=k+1;a[m];m++)
        {
            if(a[m]<a[mFlag])
                mFlag=m;
        }
        temp=a[mFlag];
        a[mFlag]=a[k];
        a[k]=temp;
    }
    return m;
}

int main()
{
    const int nSize=10;
    int a[nSize]={0,2,3,4,0,6,0,0,1,5};
    int k=func(a,nSize);
    for(int i=0;i<nSize;i++)
    {
        cout<<a[i]<<' ';

    }
    cout<<'\n'<<k<<'\n';

    cout << "Hello world!" << endl;
    return 0;
}



【欢迎读者交流批评指正~】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值