备注:转载于 http://blog.youkuaiyun.com/ychtt/article/details/6774184
4.删除字符串中所有给定的子串
问题描述:
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
【输入】 str:输入的被操作字符串
sub_str:需要查找并删除的特定子字符串
【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果
【返回】 删除的子字符串的个数
- #include <stdio.h>
- #include <string.h>
- #include "string"
- int delete_sub_str(const char *str, const char *sub_str, char *result_str)
- {
- int count = 0;
- int k=0;
- int n=strlen(str);
- for (int i=0;i<n;i++)
- {
- while (str[i]!=sub_str[0]&&str[i]!='\0')
- {
- result_str[k++]=str[i];
- i++;
- }
- int j=0;
- int temp=i;
- while (str[i]==sub_str[j]&&str[i]!='\0'&&sub_str[j]!='\0')
- {
- i++;
- j++;
- }
- if (sub_str[j]=='\0')
- {
- count++;
- }
- else
- {
- while (temp<i)
- {
- result_str[k++]=str[temp];
- temp++;
- }
- }
- i--;
- }
- result_str[k]='\0';
- return count;
- }
- int main()
- {
- char *str = "aadde";
- char *sub = "ad";
- char res[50] ="";
- int count = delete_sub_str(str, sub, res);
- printf("子字符串的个数是:%d\n", count);
- printf("删除子字符串后:%s\n", res);
- return 0;
- }
5. 高精度整数加法
问题描述:
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊
的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:
9876543210 + 1234567890 = ?
让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。
-9876543210 + (-1234567890) = ?
让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。
要求编程实现上述高精度的十进制加法。
要求实现函数:
void add (const char *num1, const char *num2, char *result)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'
num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'
【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:
I、 当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;
II、 输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;
III、 要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
- #include "string.h"
- #include "iostream"
- using namespace std;
- void reverse(char *str)
- {
- int i=0;
- int len=strlen(str);
- int temp=0;
- while (i<(len+1)/2)
- {
- temp=str[i];
- str[i]=str[len-1-i];
- str[len-1-i]=temp;
- i++;
- }
- }
- void sub (const char *num1, const char *num2, char *result) //num1-num2
- {
- int num1len=strlen(num1)-1;
- int num2len=strlen(num2)-1;
- int t1=0;
- int t2=0;
- if (num1[0]=='-')
- t1=1;
- else
- t2=1;
- int k=0;
- int t=0;
- int *subnum1=new int[num1len+1]; 借位
- memset(subnum1,0,(num1len+1)*sizeof(int));
- while (num1len>=t1&&num2len>=t2)
- {
- if (num1[num1len]+subnum1[num1len]<num2[num2len])
- {
- int q=num1len-1;
- while (num1[q]=='0')
- {
- subnum1[q]=9; //借位
- q--;
- }
- subnum1[q]-=1;
- result[k++]=(num1[num1len]-'0')+subnum1[num1len]+10-(num2[num2len]-'0')+'0';
- }
- else
- result[k++]=(num1[num1len]-'0')+subnum1[num1len]-(num2[num2len]-'0')+'0';
- num1len--;
- num2len--;
- }
- while (num1len>=t1)
- {
- result[k++]=num1[num1len]+subnum1[num1len];
- num1len--;
- }
- k--;
- while (result[k]-'0'==0)
- {
- k--;
- }
- k++;
- if (num1[0]=='-')
- result[k++]=num1[0];
- result[k]='\0';
- }
- void add (const char *num1, const char *num2, char *result)
- {
- int num1len=strlen(num1)-1;
- int num2len=strlen(num2)-1;
- int t=0; //进位
- int k=0;
- if (num1[0]=='-'&&num2[0]=='-'||(num1[0]!='-'&&num2[0]!='-')) //作加法运算
- {
- int t1=num1len;
- int t2=num2len;
- int t11=0;
- if (num1[0]=='-'&&num2[0]=='-')
- t11=1;
- while (t1>=t11&&t2>=t11)
- {
- result[k++]=((num1[t1]-'0')+(num2[t2]-'0')+t)%10+'0';
- t=((num1[t1]-'0')+(num2[t2]-'0')+t)/10;
- t1--;
- t2--;
- }
- while (t2>=t11)
- {
- result[k++]=((num2[t2]-'0')+t)%10+'0';
- t=((num2[t2]-'0')+t)/10;
- t2--;
- }
- while (t1>=t11)
- {
- result[k++]=((num1[t1]-'0')+t)%10+'0';
- t=((num1[t1]-'0')+t)/10;
- t1--;
- }
- if (t!=0)
- result[k++]=t+'0';
- if (num1[0]=='-'&&num2[0]=='-')
- {
- result[k++]='-';
- }
- result[k]='\0';
- reverse(result);
- }
- else
- {
- if (num1[0]=='-')
- {
- if (num1len==num2len+1)
- {
- int j=0;
- while (j<num1len)
- {
- if (num1[j+1]>num2[j])
- {
- sub(num1,num2, result);
- reverse(result);
- break;
- }
- else if(num1[j+1]<num2[j])
- {
- sub(num2,num1, result);
- reverse(result);
- break;
- }
- else
- j++;
- }
- }
- else if(num1len>num2len+1)
- {
- sub(num1,num2, result);
- reverse(result);
- }
- else if(num1len<num2len+1)
- {
- sub(num2,num1, result);
- reverse(result);
- }
- }
- else if (num2[0]=='-')
- {
- if (num1len+1==num2len)
- {
- int j=0;
- while (j<num2len)
- {
- if (num1[j]>num2[j+1])
- {
- sub(num1,num2, result);
- reverse(result);
- break;
- }
- else if(num1[j+1]<num2[j])
- {
- sub(num2,num1, result);
- reverse(result);
- break;
- }
- else
- j++;
- }
- }
- else if(num1len+1>num2len)
- {
- sub(num1,num2, result);
- reverse(result);
- }
- else if(num1len+1<num2len)
- {
- sub(num2,num1, result);
- reverse(result);
- }
- }
- }
- }
- int main()
- {
- char *a = "-10000";
- char *b = "33";
- char res[200];
- add(a, b, res);
- printf("%s\n", res);
- return 0;
- }
6.数组比较
问题描述:
比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等
元素的个数
比如:
数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0
数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3
要求实现函数:
int array_compare(int len1, int array1[], int len2, int array2[])
【输入】 int len1:输入被比较数组1的元素个数;
int array1[]:输入被比较数组1;
int len2:输入被比较数组2的元素个数;
int array2[]:输入被比较数组2;
【输出】 无
【返回】 不相等元素的个数,类型为int
示例
1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5
函数返回:0
2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6
函数返回:3
- #include <stdio.h>
- #include <string.h>
- #include "string"
- #include "assert.h"
- int array_compare(int len1, int array1[], int len2, int array2[])
- {
- assert(array1!=NULL&&array1!=NULL);
- int count=0;
- while (len1!=0&&len2!=0)
- {
- if (array1[len1-1]!=array2[len2-1])
- {
- count++;
- }
- len1--;
- len2--;
- }
- return count;
- }
- int main()
- {
- int array1[] = {1,3,5};
- int len1 = 3;
- int array2[] = {77,21,1,3,5};
- int len2 = 5;
- printf("%d",array_compare(len1, array1,len2, array2));
- int array3[] = {1,3,5};
- len1 = 3;
- int array4[] = {77,21,1,3,5,7};
- len2 = 6;
- printf("%d",array_compare(len1, array3,len2, array4));
- }