zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言/C++常见习题问答集锦(四十八) 之字符替换与整数拆分

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;
}

运行结果:
在这里插入图片描述