OJ

目录

最大公约数和最小公倍数

字符串的倒序

绝对素数

密码翻译

分离字符串

递归实现字符串的翻转

打印9*9乘法表

写出这个数

字符个数

swust oj希尔排序算法实现

统计利用二叉树存储的森林中树的棵数swust oj

邻接矩阵到邻接表swust oj


最大公约数和最小公倍数

#include<stdio.h>
int main() 
{
    int m,n,min,max;
    scanf("%d %d",&m,&n);
    for(max=(m>n?m:n);max>0;max--)
    {
        if(m%max==0&&n%max==0)
        {
                min=m*n/max;//最大公约数与最小公倍数的乘积=两数的乘积
                printf("%d %d\n",max,min);
                break;
        }
    }
    return 0;
}

字符串的倒序

设计函数,实现字符串的倒序输出。

 

#include<stdio.h>
#include<string.h>
int main()
{
    char a[100];
    int n,i;
    while(scanf("%s",&a)!=EOF)
    {
        for(i=strlen(a)-1;i>=0;i--)
        {
              printf("%c",a[i]);
        }
        printf("\n");
    }
    return 0;
 }

样例输入

Tomorrow
Yesterday
Today
Tomorrowisantherday!
Debug\ee.exe
ee-MicrosoftVisualC++-[ee.cpp]

样例输出

worromoT
yadretseY
yadoT
!yadrehtnasiworromoT
exe.ee\gubeD
]ppc.ee[-++ClausiVtfosorciM-ee

绝对素数

如果一个自然数是素数,且它的数字位置翻转后仍为素数(翻转指:157->751),则称为绝对素数。试求出所有的三位绝对素数。

 

#include<stdio.h>
int main( )
{
    int i,j,k,m;
    for(i=101;i<1000;i++)
    {
        for(j=2;j<i;j++)
        {
            if(i%j==0) break;
        }
        if(j==i)
        {
            int g,s,b;
            b=i/100;
            s=(i-b*100)/10;
            g=i%10;
            m=g*100+s*10+b;
            for(k=2;k<m;k++)
            {
                if(m%k==0) break;
            }
            if(k==m) printf("%d\n",i);
        }
    }
    return 0;
}

思路:数为n,素数的判断就是从2到n-1,i%j==0,if j==i,那么就是素数,求翻转数,就是/%运算求出各位数字再×回去

密码翻译

#include<stdio.h>
#include<string.h>
int main()
{
    char a[100];
    int len,i; 
    while(scanf("%s",a)!=EOF)
    {
        len=strlen(a);
        for(i=0;i<len;i++)
        {
            if(a[i]>='A'&&a[i]<'Z'||a[i]>='a'&&a[i]<'z')
            {
                a[i]+=1;
            }
            else if(a[i]=='z'||a[i]=='Z') a[i]-=25;
            printf("%c",a[i]);
        }
        printf("\r\n");
    }
}

对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。

样例输入

Hello!Howareyou!

样例输出

Ifmmp!Ipxbsfzpv!

分离字符串

#include<stdio.h>
#include<string.h>
int main()
{
    char a[200],b[200],c[200],d[200];
    int m,n,k,len,i;
    while(scanf("%s",a)!=EOF)
    {
        m=0,n=0,k=0;
           len=strlen(a);
           for(i=0;i<len;i++)
           {
        if(a[i]>='A'&&a[i]<='Z'||a[i]>='a'&&a[i]<='z')
        {
            b[m++]=a[i];
        }
        else if(a[i]>='0'&&a[i]<='9')
        {
            c[n++]=a[i];
        }
        else
            d[k++]=a[i];
        }
        for(i=0;i<m;i++)printf("%c",b[i]);printf("\n");
        for(i=0;i<n;i++)printf("%c",c[i]);printf("\n");
        for(i=0;i<k;i++)printf("%c",d[i]);printf("\n");
    }
}

输出

分离字符串中的数字、字母、特殊字(分离的时候字符顺序不要变).
输出为三行:第一行为字母,第二行为数字,第三行为特殊字符.

样例输入

c5430-456cm9203,’36.g64x4/546[45v];;v5642/;;432

样例输出

ccmgxvv
5430456920336644546455642432
-,’./[];;/;;

递归实现字符串的翻转

#include<stdio.h>
void fanzhuan();
int main()
{
    printf("输入一个字符串:"); 
    fanzhuan();
    return 0;
}
void fanzhuan()
{
    char c;
    scanf("%c",&c);
    if(c!='\n')
    {
        fanzhuan();
        printf("%c",c);
    }
}

打印9*9乘法表

#include<stdio.h>
int main()
{
    int i=0,j=0;
    for(i=1;i<=9;i++) //i控制行,j控制列
    {
       for(j=1;j<=i;j++)
       {
           printf("%d*%d=%d\t",j,i,i*j);
       }
       printf("\n");
    }
}

1x1=1  

1x2=2    2x2=4    

1x3=3    2x3=6    3x3=9    

1x4=4    2x4=8    3x4=12    4x4=16

 1x5=5    2x5=10    3x5=15    4x5=20    5x5=25  

 1x6=6    2x6=12    3x6=18    4x6=24    5x6=30    6x6=36  

 1x7=7    2x7=14    3x7=21    4x7=28    5x7=35    6x7=42    7x7=49    

 1x8=8    2x8=16    3x8=24    4x8=32    5x8=40    6x8=48    7x8=56    8x8=64    

 1x9=9    2x9=18    3x9=27    4x9=36    5x9=45    6x9=54    7x9=63    8x9=72    9x9=81    

写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10​100​​。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

1 3 5

#include<iostream>
using namespace std;
void int_pinyin(int a)
{
    switch(a)
    {
        case 0:cout<<"ling";break;
        case 1:cout<<"yi";break;
        case 2:cout<<"er";break;
        case 3:cout<<"san";break;
        case 4:cout<<"si";break;
        case 5:cout<<"wu";break;
        case 6:cout<<"liu";break;
        case 7:cout<<"qi";break;
        case 8:cout<<"ba";break;
        case 9:cout<<"jiu";break;
    }
}
int main()
{
    char a[100];
    cin>>a;
    int sum=0,i=0;
    while(a[i]!='\0')
    {
        sum+=a[i]-'0';
        i++;
    }
    int b[10],j=0;
    if(sum==0)
    {
        int_pinyin(0);
        return 0;
    }
    while(sum!=0)
    {
        b[j]=sum%10;
        sum/=10;
        j++;
    }
    for(int i=j-1;i>0;i--)
    {
        int_pinyin(b[i]);
        cout<<" ";
    }
    int_pinyin(b[0]);
    return 0;
}

字符个数

#include<stdio.h>
#include<string.h>
int main()
{
    char a[100];
    int ying=0,shu=0,kong=0,qt=0,i;
    scanf("%[^\n]",a); 
    int len=strlen(a);
    for(i=0;i<len;i++)
    {
        if(a[i]>='A'&&a[i]<='Z'||a[i]>='a'&&a[i]<='z')    ying++;
        else if(a[i]>='0'&&a[i]<='9')shu++;
        else if(a[i]==' ')kong++;
        else qt++;
    }
    printf("%d %d %d %d\n",ying,shu,kong,qt);
    return 0;
}

 

1.scanf()读取匹配format(格式)字符串的输入. 当读取到一个控制字符, 它把值放置到下一个变量. 空白(tabs, 空格等等)会跳过. 非空白字符和输入匹配, 然后丢弃. 如果是一个在%符号和控制符间的数量, 那么只有指定数量的字符转换到变量中. 如果scanf()遇到一个字符集(用%[]控制字符表示), 那么在括号中的任意字符都会读取到变量中. scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF. 

2.例如经常需要读入一行字符串,而这串字符里面可能有空格、制表符等空白字符,如果直接用%s是不可以的,于是有些人就想到用gets(),当然这也是一种选择,但是懂C的人基本上都知道gets()是一个很危险的函数,而且很难控制,特别是与scanf()交替使用时前者的劣势更是一览无余,所以gets()一般是不推荐用的,其实用%[^\n]就可以很好的解决这个问题了,^表示"非",即读入其后面的字符就结束读入。

 

swust oj希尔排序算法实现

 

编程实现希尔排序算法,按照非递减排序,测试数据为整数。

输入

第一行是待排序数据元素的个数n;
第二行是待排序的数据元素。

输出

一趟希尔排序后的结果。

样例输入

10
50 36 41 19 23 4 20 18 12 22

样例输出

4 20 18 12 22 50 36 41 19 23

 

 

  #include<bits/stdc++.h>//距离为d的倍数的元素在一个组 
using namespace std;
void Shell(int a[],int n)//减少增量的排序法 
{
    int i,j,d,tmp;
    d=n/2;//增量置初值 
    while(d>0)
    {
        for(i=d;i<n;i++)//对所有组采用直接插入排序 
        {
            tmp=a[i];//相隔d个位置一组采用直接插入排序 
            j=i-d;
            while(j>=0&&tmp<a[j])
            {
                a[j+d]=a[j];
                j-=d;
            }
            a[j+d]=tmp;
        }
        d/=2;//减小增量 
        break;//一趟 
    }
}
int main()
{
    int n;
    int a[100];
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    Shell(a,n);
    for(int i=0;i<n;i++)cout<<a[i]<<" ";
    return 0;
}

统计利用二叉树存储的森林中树的棵数swust oj

 

普通树及其构成的森林均可转换成相应的二叉树,反之亦然。故而可以根据相应的转换方法去统计某一二叉树对应的森林中树的棵数。相应的二叉树可利用先序递归遍历算法创建。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后再统计该二叉树对应的森林中树的棵数。需要注意输入数据序列中的"#"字符和非"#"字符的序列及个数关系,这会最终决定创建的二叉树的形态(序列里面允许无效字符但需要正确处理)。

输入

输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。

输出

输出该用例对应的二叉树表示的森林中树的棵数。

样例输入

A#B#CD###
ABC####
AB##C##
ABCD###EF##G##H##
A##B##

样例输出

3
1
2
2
1

代码如下

 

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct Lnode{
    char data;
    struct Lnode *l,*r; 
}BTnode;
int x=1;
void init(BTnode *&b)
{
    char ch;
    cin>>ch;
    if(ch=='#')b=NULL;
    else{
        b=(BTnode *)malloc(sizeof(BTnode));
        b->data=ch;
        init(b->l);
        init(b->r);
    }
 } 
 void getTree(BTnode *&b)
 {
     if(b)
     {
        if(b->r!=NULL)x++;//判断右结点,有右结点就有一棵树。
         if(b->l!=NULL)getTree(b->l);
         if(b->r!=NULL)getTree(b->r);
     }
 }
 int main()
 {
     BTnode *b;
     init(b);
     getTree(b);
     cout<<x;
     return 0;
 }

邻接矩阵到邻接表swust oj

#include<iostream>
using namespace std;
int main()
{
    int n,a[100][100];
    int i,j;
    cin>>n;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            cin>>a[i][j];
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(a[i][j]==1)
                cout<<j;
        }
        cout<<endl;
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值