OJ平台练习

例1 阶乘尾部0的个数

问题描述

给定非负整数n,计算n的阶乘尾部0的个数。

输入

输入数据有若干行,每行上有一个非负整数n,对应一种情形。

输出

对于每一种情形,直接输出结果、换行。

输入样例

8

16

30

1000

输出样例

1

3

7

249

代码示例

#include <cstdio>

int zeroCount(int n) {
    int count = 0, div = 5; //因子5,120=24*5,几个5末尾就几个0
    while (div <= n) {
        count += n / div;
        div *= 5;     // 因子会变化,比如25=5*5会含有两个5,所以要多加因子25的个数,以此类推要加因子5*5*5的个数,5*5*5*5的个数,......
    }
    return count;
}
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {     
        printf("%d\n", zeroCount(n));
    }
}

例2 同构数

问题描述

给定一个十进制正整数,判断其是否为同构数。所谓同构数是这样的一些数,它出现在其平方数的右边,例如:5是出现在右边的数,25是出现在右边的数,所以5和25都是同构数。

输入

输入数据有若干行。每行上有一个正整数。

输出

对于每一个数,输出Y(表示是同构数)或N(表示不是同构数。

输入样例

5

15

25

输出样例

Y

N

Y

代码示例

//同构数 5^=25,5是右边的数,25是出现在25^2=625右边的数
//我们发现 5=25%10, 25=625%100, 即 num=(它的平方)%(10^它的长)
#include<cstdio>
#include<math.h>
int main()
{
    int num, temp;//暂存num
    int length;
    int square;
    while(scanf("%d",&num) != EOF) {
        length = 0;
        square = num * num;
        temp = num;
        while (temp != 0) {
            temp = temp / 10;
            length++;//num有几位
        }
        int sq; //求10的乘方
        sq = pow(10, length);
        if (num == square % sq)
            printf("Y\n");
        else
            printf("N\n");
    }
}

例3 同构字符串

给定两个字符串 st ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add" 输出:true

示例 2:

输入:s = "foo", t = "bar" 输出:false

代码示例:

//同构字符串
#include <cstdio>
#include <string>
#include <map>
//map的find()方法返回值是一个迭代器。
//count()方法返回值是一个整数,1表示有这个元素,0表示没有这个元素。
#include <algorithm>
#include <iostream>

using namespace std;
int main(){
    char buf1[50],buf2[50];
    map<char,char> s1to2;
    map<char,char> s2to1;
    scanf("%s%s",buf1,buf2);
    string s1 = buf1;
    string s2 = buf2;
    int len = s1.size();
    int i;
    for (i = 0; i < len; ++i) {
        char x = s1[i], y = s2[i];
        //有这个键,但是它对应的值不对
        if ((s1to2.count(x) && s1to2[x] != y) || (s2to1.count(y) && s2to1[y] != x)) {
            cout << "false"<< endl;
            break;
        }
        //没有这个键,互相存键值对
        s1to2[x] = y;
        s2to1[y] = x;
    }
    //存完了也对比完了
    if(i == len) {
        cout << "true" << endl;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~許諾~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值