递归--练习17(3)

1.素数回文

题目描述

现在给出一个素数,这个素数满足两点:

1、 只由1-9组成,并且每个数只出现一次,如13,23,1289。

2、 位数从高到低为递减或递增,如2459,87631。

请你判断一下,这个素数的回文数是否为素数(13的回文数是131,127的回文数是12721)。

输入描述:

输入只有1行。第1行输入一个整数t,保证t为素数。数据保证:9<t<109

输出描述:

输出一行字符串,如果t的回文数仍是素数,则输出“prime”,否则输出"noprime"。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
long long huiwen(long long num)
{
  if(num<2)
  {return 0;}
  if(num==2||num==3)
  {return 1;}
  for(long long i=2; i*i<=num;i++)
  {
      if(num%i==0)
      {return 0;}
  }
  return 1;
}
int main()
{
  string s,s1,s2,s3;
  cin>>s1;
  s2=s1;
  reverse(s1.begin(),s1.end());
  s3=s2+s1;
  for(int i=0;i<=s3.size()-1;i++)
  {
	if(i!=s2.size()-1)
	{
	  s+=s3[i];
	}
  }
  long long num=stoll(s);
  if(huiwen(num)==0)
  {cout<<"noprime"<<endl;}
  else
  {cout<<"prime"<<endl;}
}

本题思路:将一个数变成字符串,进行处理后转化回整数,并重新判断其是否为素数

注意:123要变成12321,而不是123321,将s1倒置后要将中间重复部分删去。

2.字母组串

题目描述

由 A,B,C 这3个字母就可以组成许多串。 比如:”A”,”AB”,”ABC”,”ABA”,”AACBB” …。现在,小明正在思考一个问题: 如果每个字母的个数有限定,能组成多少个已知长度的串呢?

输入描述:

四个整数a,b,c,n(0 ≤ a, b, c, n ≤ 10),空格分隔,分别表示a个A,b个B,c个C 字母,长度为n的串。

输出描述:

一个整数,能组成多少个不同长度为n的串。

#include <iostream>
using namespace std;
int zfc(int a,int b,int c,int n)
{
    if(n==0)
    {
        return 1;
    }
    int sum=0;
    if(a>0)
    {
        sum+=zfc(a-1,b,c,n-1);
    }
        if(b>0)
    {
        sum+=zfc(a,b-1,c,n-1);
    }
        if(c>0)
    {
        sum+=zfc(a,b,c-1,n-1);
    }
    return sum;
}
int main()
{
    int a,b,c,n;
    cin>>a>>b>>c>>n;
    cout<<zfc(a,b,c,n);
}

3.十进制转R进制

题目描述

kiki有一个十进制数,他想转成r进制,请你编程帮他实现。

输入描述:

两个整数,空格间隔,分别表示十进制整数n ( 1 ≤ n ≤ 109 )和r(1 ≤ r ≤ 16)进制

输出描述:

对应的r进制

#include <iostream>
#include <string>
using namespace std;
string jz(int x,int n)
{
    string std="0123456789ABCDEF";
    string fin=" ";
    while(x>0)
    {
        int re=x%n;
        fin=std[re]+fin;
        x/=n;
    }
    return fin;
}
int main()
{
    int x,n;
    cin>>x>>n;
    string fin=jz(x,n);
    cout<<fin;;
}

4.分解因数

题目描述

给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * ... * an,并且1 < a1 <= a2 <= a3 <= ... <= an,问这样的分解的种数有多少。注意到a = a也是一种分解。

输入描述:

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 < a < 32768)

输出描述:

输出为n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数。

#include <iostream>
using namespace std;
void find(int star,int m,int &sum)
{
    int i;
    for (i=star; i<=m; i++)
    {
        if(m%i==0 && i<=m/i)
        {
            sum++;
            find(i,m/i,sum);
        }
        if(i>m/i) break;
    }
}
int main()
{
    int m,n,i;
    cin>>n;          //循环n次
    for(i=1;i<=n;i++)
    {
        int sum=1;
        cin>>m;      //输入一个数m
        find(2,m,sum);
        cout<<sum<<endl;
    }
    return 0;
}

全部评论

相关推荐

09-01 21:40
已编辑
同济大学 Java
点赞 评论 收藏
分享
09-13 08:41
服装/纺织设计
那一天的Java_J...:你第一次参加面试吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务