描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
输入
只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
输出
共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。
#include<cmath>//要用到其中求开方的函数sqrt()
#include<iostream>
#include<cstring>//要用到其中求字符串长度的函数size()
using namespace std;
bool prime(int n)
{if(n<2) return false;else{for (int i=2;i<int(sqrt(float(n)));i++)if(n%i==0) return false;}return true;
}
//判断质数
int main()
{int a[26],maxn=0,minn=1000;string s;int i;cin>>s;memset(a,0,sizeof(a));for (i=0;i<s.length();i++)a[s[i]-'a']+=1;for(i=0;i<26;i++){if(maxn<a[i])maxn=a[i];if(minn>a[i]&&a[i]!=0)minn=a[i];}if(prime(maxn-minn)==true)cout<<"Lucky Word"<<endl<<(maxn-minn)<<endl;elsecout<<"No Answer"<<endl<<0<<endl;system("pause");return 0;
}
知识1:判断质数改写while:
int prime(int x) //判断质数;1是质数 0不是质数{int j=2;if(x<2) return 0;while (j<int(sqrt(float(x)))) {if(x%j==0)return 0;j++;}return 1;}
知识2:判断字符出现个数
string s;
int t[26];
cin>>s;
n=s.size();
for (int i=0;i<n;i++)t[s[i]-'a']++;
知识点3:memset初始化
#include<stdio.h>
#include<string.h>int main(){char str[] = "beautiful earth";memset(str, '*', 6);printf("%s", str);
}Output:
******ful earth
上述代码把 str 的前六个字节用 * 填满,那么能不能用下面的方法把 arr 的前六个数字初始化成 1 呢?
int arr[15];
memset(arr, 1, 6); //错误代码
答:不可。
memset()
的用法是:
#include <string.h>
void *memset(void *s, int c, size_t n); //语法
memset()
函数把 s 指向的一块内存中每个字节的值设置为 c,内存的大小是 n 个 bytes
强调,第三个参数 n 决定了开辟的内存有多少个字节。
一个 char 占一个 byte,一个 int 占 4 个bytes。所以在上面的案例中, char 数组的初始化, 第三个参数填 6 就能初始化 6 个;如果要初始化一个 int 数组,实现前 6 个元素是 1 ,第三个参数不能是 6。
那么,这样写是正确的吗?
int arr[15];
memset(arr, 1, sizeof(int) * 6); // 错误示范
我们尝试跑一下 :
16843009 这个数字是怎么来的?不要忘记,memset() 中,是按 byte 赋值的,那么把 4 个 byte 赋值为 1, int 值并不是 1,而是:
所以,不能用 memset() 初始化数组为 1 。但是可以将数组高效地初始化为 0 或 -1(只能是0 或 -1。原理:补码表示法, -1 的补码为: 0xFFFFFFFF,在内存上是连续的, -2 就不行,-2 是 0xFFFFFFFE)