例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 同构字符串
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 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;
}
}