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,1,2,3,4
int数值| 0,8,4,6,0
+24,12,18,0,0
________________________
24,20,22,60
进位运算
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),使A把0移至后面,非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;
}
【欢迎读者交流批评指正~】