C语言/C++常见习题问答集锦(四十八) 之字符替换与整数拆分
2023-09-14 09:01:32 时间
C语言/C++常见习题问答集锦(四十八) 之字符替换与整数拆分
程序之美
1、字符替换:编写一个函数strchange,其原型为:
char *strchange(char * str, char cl1, char cl2);
参与str为字符串的起始位置,c1为要在字符串中查找的字符,c2为要替换成的字符;函数的功能是:在字符串str中查找所有等于c1的字符,将其替换为c2中的字符,函数的返回值是替换后的字符串的起始位置(注:不能将函数中定义的字符数组的起始地址作为函数的返回值)。
在主函数中输入一个字符串和要查找和替换为的字符(注意:%c格式不是scanf函数的第一个格式符时要注意分割符对其输入的影响),调用strchange函数后在主函数中输出替换后的字符串。
#include <stdio.h>
char *strchange(char * str, char c1,char c2);
void main() {
printf("输入字符串:");
char str[255];
scanf("%s", str);
char c1, c2;
printf("输入欲替换的字符:");
getchar();
scanf("%c",&c1);
printf("输入被替换为字符:");
getchar();
c2 = getchar();
char *s = strchange(str, c1, c2);
printf("%s", s);
free(s);
scanf("%s", str);
}
char *strchange(char * str, char c1, char c2) {
int len=0;
for (; str[len]; len++);
if (len == 0)
{
char *s = (char*)malloc(sizeof(char));
s[0]=0;
return s;
}
char *s = (char*)malloc(sizeof(char)*(len + 1));
for (int i = 0; i < len; i++)
{
if (str[i] == c1)
s[i] = c2;
else
{
s[i]=str[i];
}
}
s[len] = 0;
return s;
}
2、对于任意一个正整数n,总是可以找出正整数看k1、k2…,使得这些数想加刚好等于n,而且每个数都不超过指定数m。
问:对于给定的n,请找出共有多少中这样的求和式
注意;
设a,b不相等,则认为a+b与b+a是不同的求和式;
n=n也是一种求和式
例如:
n=4,m=2。
4=1+1+1+1
4=1+1+2
4=1+2+1
4=2+1+1
4=2+2
C语言版:
#include <stdio.h>
int cnt=0;
void comb(int a[],int m,int k,int s)
{
int i,j,t;
for(i=m;i>=k;i--)
{
a[k]=i;
if(k>1)
comb(a,i-1,k-1,s);
else
{
for(t=0,j=a[0];j>0;j--)
t=t+a[j];
if(t==s)
{
cnt++;
printf("%d=", s);
for(j=a[0];j>1;j--)
printf("%d+", a[j]);
printf("%d\n", a[1]);
}
}
}
}
int main()
{
int a[100],s,m,i;
while (1)
{
scanf("%d %d", &s, &m);
if (s == 0)
{
break;
}
cnt=0;
for (i=1;i<=m;i++)
{
a[0]=i;
comb(a,m,i,s);
}
printf("%d\n", cnt);
}
return 0;
}
运行结果:
C++版:
#include <iostream>
using namespace std;
int cnt=0;
void comb(int a[],int m,int k,int s)
{
int i,j,t;
for(i=m;i>=k;i--)
{
a[k]=i;
if(k>1)
comb(a,i-1,k-1,s);
else
{
for(t=0,j=a[0];j>0;j--)
t=t+a[j];
if(t==s)
{
cnt++; cout<<s<<"=";
for(j=a[0];j>1;j--)
cout<<a[j]<<"+";
cout<<a[1]<<endl;
}
}
}
}
int main()
{
int a[100],s,m,i;
while (cin>>s>>m && s!=0)
{
cnt=0;
for (i=1;i<=m;i++)
{
a[0]=i;
comb(a,m,i,s);
}
cout<<cnt<<endl;
}
return 0;
}
运行结果:
相关文章
- C++创建线程_C语言网络编程创建线程
- 多线程C语言_多线程c++
- c++中cstring头文件_C语言中头文件的来源
- C++基础入门_C语言入门基础
- C语言和C++的区别和联系
- c++ 分苹果_接苹果问题C语言
- Cu002FC++ 中的 atol()、atoll() 和 atof() 函数
- C++字符串加密_c++字符串连接函数
- 【C++】高精度算法讲解
- 【C++修炼之路】20.手撕红黑树
- C++ 循环
- C++ array获取(访问)元素
- c++const引用与非const引用介绍
- C++读写.mat文件的方法
- C++实现:螺旋矩阵的实例代码
- 浅析C++中结构体的定义、初始化和引用
- C++流操作之fstream用法介绍
- C++explicit关键字的应用方法详细讲解