链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
目录
1001 上下金字塔
输出双层金字塔
#include <iostream>
using namespace std;
int main(){
int n;
int i,j,k;
//共有n*2-1行,每行的*数目为奇数,分别为从1—(n*2-1)-1
while(scanf("%d",&n)!=EOF){
// 先输出上半部分
for(i=1;i<n;i++){
//输出前面的空格
for(j=n-i;j>=1;j--) cout << " ";
//输出*
for(k=1;k<=2*i-1;k++) cout << "*";
//输出换行符号
cout << endl;
}
//输出第n行
for(i=1;i<=2*n-1;i++) cout << "*";
cout << endl;
//输出下半部分
for(i=n-1;i>=1;i--){
//输出空格
for(j=n-i;j>=1;j--) cout << " ";
//输出*
for(k=1;k<=2*i-1;k++) cout << "*";
//换行
cout << endl;
}
}
return 0;
}
1002 数字三角形
打印数字三角形,从1开始输出,第i行输出i个数,每个数字按4个位置输出
注:c语言中 %4d可以输出一个数,占据四个位置,右对齐。
#include <iostream>
using namespace std;
int main(){
//打印数字三角形,从1开始输出,第i行输出i个数,每个数字按四个位置输出
//c语言中 %4d可以输出一个数,占据四个位置,右对齐。
int n;
int i=1,j;//i表示行数
int num=1;//从1开始输出
cin >> n;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
printf("%4d",num);
num++;
}
printf("\n");//换行
}
return 0;
}
1003 字符金字塔
请打印输出一个字符金字塔,字符金字塔的特征请参考样例
#include <iostream>
using namespace std;
int main(){
char c;
cin >> c;//获取输入的字符,保证是大写
int line=c-'A'+1;//一共要输出的行数用line存储
for(int i=1;i<=line;i++){
//先输出字符前面的空格
for(int j=0;j<line-i;j++)
cout << " ";
//第i行要输出的前半部分字符从A-A+i
for(int k=0;k<=i-2;k++)
cout << char('A'+k);
//最中间的字符
cout << char('A'+i-1);
//后半部分的字符
for(int k=i-2;k>=0;k--)
cout << char('A'+k);
cout << endl;//每行最后输出换行符
}
return 0;
}
1004 涂小天与他的画
涂小天是个画家,他希望有一天他的画能让心仪的她看到。
只是后来她有了他,他却只有他的画,他望着他的画,默默的发呆。
可惜做题的你,画不出他画的她,所以,我们只好画点简单的画,或许有一天,你就会遇到画里她/他吗?
因此我们规定画画的内容:输入一个正整数 n(n为奇数),输出高度为 n 的菱形,例如 n = 5 时,输出
*
***
*****
***
*
#include <iostream>
using namespace std;
int main(){
int t;//表示有t组测试数据
int n;//整数
cin >> t;
while(t--){
cin >> n;//输出高度为n
int temp=(n+1)/2;//用来求空格数
//cout << "temp= " << temp << endl;
//输出前半部分
for(int i=1;i<temp;i++){
//输出前面的空格 第i行的空格数为temp-i
for(int j=0;j<temp-i;j++)
cout << " ";
//输出* 第i行的*数目为2*i-1
for(int k=0;k<2*i-1;k++)
cout << "*";
//输出换行符
cout << endl;
}
//输出中间那行的*符号 共有n个*
for(int i=0;i<n;i++)
cout << "*";
cout << endl;
//输出后半部分
for(int i=temp-1;i>0;i--){
//输出空格 第i行的空格数为temp-i
for(int j=0;j<temp-i;j++)
cout << " ";
//输出* 第i行的*数目为2*i-1
for(int k=0;k<2*i-1;k++)
cout << "*";
cout << endl;
}
}
return 0;
}
1005 箭形图案
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的箭形图案
#include <iostream>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF){//本题多组输入
int line=2*n+1;//一共的行数
//打印上半部分的符号
for(int i=1;i<=n;i++){//控制行数
//打印空格数 第i行的空格数为line-(2*i-1)
for(int j=0;j<line-(2*i-1);j++)
cout << " ";
//打印* 第i行的*数为i个
for(int k=0;k<i;k++)
cout << "*";
cout << endl;//打印换行符
}
//打印最中间的符号 n+1个*
for(int i=0;i<=n;i++)
cout << "*";
cout << endl;
//打印下半部分的符号
for(int i=n;i>0;i--){
//打印空格 第i行的空格数为 line- (2*i-1)
for(int j=0;j<line-(2*i-1);j++)
cout << " ";
//打印* 第i行的*数为 i
for(int k=0;k<i;k++)
cout << "*";
cout << endl;
}
}
return 0;
}
1006 牛牛学数列
牛牛开始学习数列啦
现在他想知道1-2+3-4...+n的值
#include <iostream>
using namespace std;
int main(){
//求1-2+3-4...+n的值
int n;
cin >> n;
int flag=-1,sum=1;//sum存储最后的和
for(int i=2;i<=n;i++){
sum += i*flag;
flag *= -1;
}
cout << sum << endl;
return 0;
}
1007 牛牛学数列2
这次牛牛又换了个数列,他想计算:1+1/2+1/3+…+1/N的值。(保留6位小数)
#include <iostream>
using namespace std;
int main(){
//计算:1+1/2+1/3+…+1/N的值。(保留6位小数)
int n;
cin >> n;
double sum=0;//存储最后求和的值
for(int i=1;i<=n;i++){//i表示分母的值
sum += 1.0/i;
}
printf("%.6lf",sum);
return 0;
}
1008 牛牛学数列3
牛牛准备继续进阶,计算更难的数列
输入一个整数n,计算 1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...((-1)^(n-1))*(2n-1))的值
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int fm=0;//分母初始化为0
double sum=0;
int flag=1;//用来求-1的方
for(int i=1;i<=n;i++){//共有n项
fm += flag*(2*i-1);
flag *= -1;
sum += 1.0/fm;
}
printf("%.3lf",sum);
return 0;
}
1009 牛牛学数列4
帮助牛牛计算 1+(1+2)+(1+2+3)+...+(1+2+3+...+n)
#include <iostream>
using namespace std;
int main(){
int n;
int sum=0;//存储最后的加和
int t=1;//存储每一项要加的项是多少 初始化为1
cin >> n;
for(int i=1;i<=n;i++){//输入为n时要加n个数
sum += t;
t+=(i+1);
}
cout << sum << endl;
return 0;
}
1010 牛牛学数列5
求fib数列的第n项,前几项是1,1,2,3,5,每一项都等于前面两项的和
#include <iostream>
using namespace std;
int main(){
int n;
int num;
cin >> n;
int t,t1=1,t2=1; //初始化为第1、2项的值
if(n==1||n==2)
cout << 1 << endl;
else if(n>2){
n-=2;
while(n){
num=t1+t2;//新的项的值
t1=t2;
t2=num;
n--;
}
cout << num << endl;
}
return 0;
}
1011 牛牛学数列6
有一个数列
已知
A1=0A_1=0A1=0
A2=1A_2=1A2=1
A3=1A_3=1A3=1
A4=A1+2∗A2+A3A_4=A_1+2*A_2+A_3A4=A1+2∗A2+A3
A5=A2+2∗A3+A4A_5=A_2+2*A_3+A_4A5=A2+2∗A3+A4
......
求AnA_nAn
#include <iostream>
using namespace std;
int main(){
int n;
int ans;//存储最后的输出答案
cin >> n;//1≤n≤20
if(n==1){
cout << 0 << endl;
}else if(n==2||n==3){
cout << 1 << endl;
}else{//n>3时 An=(An-3)+2*(An-2)+(An-1)
int x=0,y=1,z=1;//初始化前三项的值
n-=3;
while(n){
ans=x+2*y+z;
x=y;
y=z;
z=ans;
n--;
}
cout << ans << endl;
}
return 0;
}
1012 A+B
请输所给A + B的值
#include <iostream>
using namespace std;
int main(){
int a,b;//1 < A, B < 1000000
while(scanf("%d %d",&a,&b)!=EOF){//本题有多组案例,对于每一个案例输入一行两个数A, B。
cout << a+b << endl;
}
return 0;
}
1013 多组输入a+b
计算a+b
#include <iostream>
using namespace std;
int main(){
int a,b;//1 < A, B < 1000000
while(scanf("%d %d",&a,&b)!=EOF){//本题有多组案例,对于每一个案例输入一行两个数A, B。
cout << a+b << endl;
}
return 0;
}
1014 多组输入a+b II
计算a+b
#include <iostream>
using namespace std;
int main(){
int n,a,b;
cin >> n;//表示有n组输入数据
while(n--){
cin >> a >> b;
cout << a+b << endl;
}
return 0;
}
1015 多组输入a+b III
计算a+b
#include <iostream>
using namespace std;
int main(){
int a,b;
while(scanf("%d %d",&a,&b)&&!(a==0&&b==0)){
cout << a+b << endl;
}
return 0;
}
1016 [NOIP2018]标题统计
凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?
注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时,空格和换行符不计算在内。
#include <iostream>
#include <cctype>
using namespace std;
int main(){
int ans=0;//初始化为0
char c;
//getchar()函数可以用来读取一个字符
//isspace()函数用来判断一个字符是否为空字符
while((c=getchar())!='\n'){
if(!isspace(c))
ans++;
}
cout << ans << endl;
return 0;
}
1017 栗酱数数
栗酱在酒桌上玩一个小游戏,第一个人从1开始数数,如果遇到数字中含4或者数字是4的倍数则跳过报下一个,谁数错了就要罚酒一杯。
所以栗酱想让你写个程序把所有数生成出来,这样她就可以作弊直接读了。你一定能解决的吧?
#include <iostream>
using namespace std;
int fun(int num){//判断数字种是否含4
int t;
while(num){
t=num%10;
if(t==4){//说明数字中含有4
return 1;
break;
}
num/=10;
}
return 0;
}
int main(){
int n;
cin >> n;
int num=1;//从1开始报数
while(num<=n){
if(fun(num)||num%4==0){
num++;//寻找下一个满足条件的值输出
}else{//满足输出条件的话先输出再num++
cout << num << endl;
num++;
}
}
return 0;
}
1018 有趣的二进制
小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。
参考博客:https://blog.csdn.net/qq_37868325/article/details/80384095
#include <iostream>
using namespace std;
int main(){
unsigned long long n;
int ans;
while(~scanf("%lld",&n)){
ans=0;
while(n){
if(n%2==1) ans++;
n/=2;
}
cout << ans << endl;
}
return 0;
}
1019 [NOIP2006]数列
给定一个正整数k( 3 ≤ k ≤ 15 ),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k = 3时,这个序列是:
1,3,4,9,10,12,13,…(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。例如,对于k = 3,N = 100,正确答案应该是 981。
#include <iostream>
#include <cmath>
using namespace std;
int main(){
//https://blog.csdn.net/qq_60404548/article/details/124571302
int k,n;
long ans=0;//不用long 存储不通过
cin >> k >> n;//3 ≤ k ≤ 15,10 ≤ N ≤ 1000
//按二进制思路解决问题 100=2^6+2^5+2^2 结果=3^6+3^5+3^2
int arr[10]={0};//存储n的二进制数表示
int i=0;
while(n){
int t=n%2;
if(t==1){
arr[i]=1;
ans+=pow(k,i);
}
i++;
n/=2;
}
cout << ans << endl;
return 0;
}
1020 只能吃土豆的牛牛
旅行完了的牛牛又胖了,于是他终于下决心要戒掉零食,所以他带着他最爱的土豆回到了牛星,开始了在牛星种土豆和只吃土豆减肥的日子。(吃土豆能减肥么?)经过了辛勤的劳作,牛牛种的土豆奇迹般的收获了,于是他得到了很多很多很多很多的土豆(实在太多,数不过来了,你可以认为是无穷个)。他将这很多很多个土豆按照重量从小到大进行了排序,每个土豆的编号依次为1、2、3……N,然后他就惊奇地发现:由于牛星球的土壤很奇特,第i个土豆的重量正好是3^(i-1) 。
现在牛牛饿了要吃掉其中的若干个土豆。他每次拿的土豆的数目是任意的,选的土豆也是任意的。选中的土豆的总重量即每个土豆重量之和。例如:牛牛这一次拿了第一个土豆和第三个土豆,那么总重量为1+9=10。
牛牛想知道,在所有的选土豆方案里,他可以获得的第k大的“总重量”是多少。
#include <iostream>
#include <cmath>
using namespace std;
void fun(long k,int x){
//先求出k的二进制形式
int i=0;
long ans=0;//存储最后输出的重量
while(k){
int t=k%2;
if(t==1) ans+=pow(3,i);
i++;
k/=2;
}
cout << "Case #" << x << ": " << ans << endl;
}
int main(){
int t;//0 ≤ T ≤ 70
cin >> t;//t组测试样例
long k;//k<=2^31-1
//也是利用二进制思路解决问题
for(int i=1;i<=t;i++){
cin >> k;//求第k大的重量
fun(k,i);
}
return 0;
}
1021 [NOIP2015]金币
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
#include <iostream>
using namespace std;
int main(){
int k;
cin >> k;
int ans=0;//初始化为0
int i=1,n=0;//i表示金币数,从1开始
int day=1;//day表示过去了多少天
while(day<=k){
ans+=i;//表示收到i枚金币
n++;//收到金币数为i的天数+1
if(n==i){//满足连续n天收到了n枚金币
i++;
n=0;//n从0开始再计算
}
day++;
}
cout << ans << endl;
return 0;
}
1022 托米历险记
这天,托米家的电影院门口排起了长队--因为最新的电影"托米历险记"就要上映了!
每个人都有且仅有一张面值为25或50或100元的钞票.一张电影票的价格是25元.
托米想知道售票员能否在初始金钱为0并且按排队顺序售票的情况下完成找零.
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;// 表示排队的人数
int arr[n]={0};//定义数组arr,存储每个人的币值
int i=0,t,x=0;//x表示售票员拥有的钱数,初始化为0元
while(n--){
cin >> t;
if(t>25){//当需要找零时
int temp=t-25;//求出需要找的钱数
if(temp>x){//无法找零
cout << "NO" << endl;
break;
}else if(temp<=x){
x-=temp;//找零
}
}else{//不需要找零时
x+=t;
}
}
if(n==-1)
cout << "YES" << endl;
return 0;
}
1023 绩点
小A刚考完大学考试。现在已经出了n门课的成绩,他想自己先算一下这些课的绩点是多少。设第i门课的他拿到的绩点是gpai,而这门课的学分是sci,那么他的总绩点用下面的公式计算:
∑i=1ngpai×sci∑i=1nsci\frac{\sum_{i=1}^n gpa_i\times sc_i}{\sum_{i=1}^n sc_i}∑i=1nsci∑i=1ngpai×sci,
换言之,设S为sci的和,T为gpai与sci的乘积的和。那么小A的绩点就是T除以S的值。
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int i;
float gpa,sci,t=0,s=0;//s用来存储sci的和 ,t为gpai与sci乘积的和
for(i=0;i<n;i++){
cin >> gpa >> sci;
s+=sci;
t+=gpa*sci;
}
float ans=t/s;
printf("%.1f",ans);
return 0;
}
1024 买铅笔
P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过 n 支铅笔才够给小朋友们发礼物。
现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 n 支铅笔最少需要花费多少钱。
#include <iostream>
using namespace std;
int fun(int n,int count,int price){//计算买够至少n支铅笔要花多少钱哦
int num=(n-1)/count+1;//需要买num盒铅笔
int cost=num*price;//计算所需要的花费
return cost;
}
int main(){
int n;
cin >> n;//n表示需要的铅笔数量
int count,price;
int arr[3]={0};
int i=0;
for(i=0;i<3;i++){
cin >> count >> price;
arr[i]=fun(n,count,price);
}
int min1,min2,min;
min1=arr[0]<arr[1]?arr[0]:arr[1];
min2=arr[1]<arr[2]?arr[1]:arr[2];
min=min1<min2?min1:min2;
cout << min << endl;
return 0;
}
1025 整数个数
给定k(k大于1且小于50)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。
#include <iostream>
using namespace std;
int main(){
int k;//k大于1且小于50
int t;
int a=0,b=0,c=0;//分别存储1,5,10出现的次数
cin >> k;
for(int i=0;i<k;i++){
cin >> t;
if(t==1) a++;
else if(t==5) b++;
else if(t==10) c++;
}
cout << a << " " << b << " " << c << endl;
return 0;
}
1026 栗酱的文明2
“伟大的勇栗兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您。您骑着威风凛凛的小白兔,带领栗子们奋勇前行。伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,
冲在每场战争的前线——无论您在哪里,他们都能找到您。骑小白兔飞驰吧,凶猛的女王,但愿您有真正的朋友和软弱的敌人。”
今天,冰雪聪明的栗酱终于玩到了她梦寐很久的文明游戏。
不过作为一个萌新,兔头獐脑的栗酱自然不愿意第一次玩就遇到一个尴尬的结局,于是希望通过你来寻找一个完美结局。
已知游戏结束前场上有n个国家,第i个国家有ai块土地,任意2个国家若是想建立外交关系,则需要互相在对方的一块土地上建立一个大使馆。
一块土地只能建立一个大使馆,若一个国家和其他国家存在外交关系,则需要征用一块己方土地作为备用大使馆。
完美结局的定义是:找到最多数量的国家,使他们相互之间存在外交关系。
#include <iostream>
using namespace std;
void fun(int n,int arr[]){
//数组arr[]中存储的是下标元素出现的次数
//从后往前遍历数组元素找到满足条件的值输出
int i,num=0;//num从后往前统计元素个数
for(i=n;i>0;i--){
num+=arr[i];
if(num>=i){//找到了满足条件的元素
cout << i << endl;
break;
}
}
}
int main(){
//找到最多数量的国家,使他们相互之间存在外交关系。
//也就是找到x 满足x个数 >= x即可
int t;//表示有t组数据
cin >> t;
int n,i,temp;
while(t--){
cin >> n;//n表示国家的数量
int arr[n+1]={0};//1≤n≤1000 1≤ai≤n
for(i=0;i<n;i++){
cin >> temp;
arr[temp]++;
}
fun(n,arr);
}
return 0;
}
1027 黑大火与他的猫
白小水是只可爱的白猫,它的铲屎官黑大火是个善解人意的汉子,为了他家的小公举而努力奋斗。
遇见白小水之前,黑大火只是一个懵懂的少年。只是后来偶然在路边对视了一眼,却从此成为了心中执念。
他觉得大概这辈子就栽在它手上了吧,它的一举一动总能拉扯着他的心弦。
所以,今天黑大火又要为白小水准备好吃的猫粮了,写题的你愿意帮助一下他们么?
黑大火现在拥有的金钱数为 N,有 M 种白小水喜欢的猫粮从左到右排列,已知每种猫粮的价格 ai,他的购买规则如下:
- 必须按照从左到右的顺序购买,如果可以买这种猫粮则一定购买,每种猫粮只能购买一个,买完第一种猫粮买第二种猫粮,以此类推。
- 如果遇到金额不足的情况,将跳过该猫粮,购买下一种猫粮,直到结束。
输出他最多能买多少种猫粮。
#include <iostream>
using namespace std;
void fun(int n,int m,int arr[]){
int num=0;//num表示最多购买多少种,初始化为0
int i;
for(i=0;i<m;i++){
if(n>=arr[i]){//买得起
n-=arr[i];//钱数减去猫粮的价格
num++;
}
}
cout << num << endl;
}
int main(){
int t;
cin >> t;
int n,m;
while(t--){
cin >> n >> m;
int arr[m]={0};
for(int i=0;i<m;i++){
cin >> arr[i];
}
fun(n,m,arr);
}
return 0;
}
1028 [NOIP2000]进制转换
我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的值减1为指数,以10为底数的幂之和的形式。例如:123可表示为 1*102+2*101+3*100这样的形式。
与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的值-1为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负整数-R都可以被选来,作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的数码为 0,1,....R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4,5和6,这与其是R或-R无关。如果作为基数的数绝对值超过10,则为了表示这些数码,通常使用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。
在负进制数中是用-R 作为基数,例如-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数:
110001=1*(-2)5+1*(-2)4+0*(-2)3+0*(-2)2+0*(-2)1 +1*(-2)0
设计一个程序,读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数:-R∈{-2,-3,-4,...,-20}
#include <iostream>
#include <cmath>
using namespace std;
char ans[1100]="\0";
const char num[20]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};
int main(){
//https://blog.csdn.net/m0_51276753/article/details/121938846
//负进制数的转换过程中,取余时可能会出现负数,需要将负余数转换成正数
//即:将得到的负余数mod+要转换的进制R,使其变为正数
int n,r;
cin >> n >> r;
int temp=n;//暂存n的值
int i=0,t,mod;
while(n){
mod=n%r;
n/=r;
if(mod<0){
mod=(mod-r)%(-r);
n++;
}
ans[i++]=num[mod];
}
cout << temp << "=";
for(int j=i-1;j>=0;j--)
cout << ans[j];
cout << "(base" << r << ")";
return 0;
}
1029 素数判断
给你一个整数n, 判断它是否是素数。注意1不是素数
#include <iostream>
using namespace std;
void fun(int n){//判断n是否为素数
int i;
if(n==1)
cout << "No" << endl;
else if(n>1){
for( i=2;i<n;i++){//找n的因子
if(n%i==0){
cout << "No" << endl;
break;
}
}
if(i==n)
cout << "Yes" << endl;
}
}
int main(){
int n,t;
cin >> t;
while(t--){
cin >> n;
fun(n);
}
return 0;
}
1030 Game
Nancy喜欢博弈!
Johnson和Nancy得到了一个神奇的多重集合,仅包含一个正整数n,两个人轮流进行操作。
一次操作可以将集合中一个数字分解为它的任意两个非1的因数,并加入集合中。
他们想知道,在Johnson和Nancy绝顶聪明的情况下,如果Nancy先手进行操作,最后谁没有办法继续操作了呢?
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
//求n的质因数个数,如4=2*2, 有两个质因数,可进行一次分解操作
//游戏次数为奇数,说明Johnson无法再操作
//n=1时,对应0次分解操作
if(n==1){
cout << "Nancy" << endl;
}
int i;
int num=0;//num计数游戏次数
//找到n的所有质因数
for(i=2;i<=n;i++){
while(n%i==0){
n/=i;
num++;
}
}
if(num%2==0) cout << "Johnson" << endl;
else cout << "Nancy" << endl;
return 0;
}