牛客竞赛语法入门班-循环结构习题代码(1)

 链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

目录

1001 上下金字塔

1002 数字三角形

1003 字符金字塔

1004 涂小天与他的画

1005 箭形图案

1006 牛牛学数列

1007 牛牛学数列2

1008 牛牛学数列3

1009 牛牛学数列4

1010 牛牛学数列5

1011 牛牛学数列6

1012 A+B

1013 多组输入a+b

1014 多组输入a+b II

1015 多组输入a+b III

1016 [NOIP2018]标题统计

1017 栗酱数数

1018 有趣的二进制

1019 [NOIP2006]数列

1020 只能吃土豆的牛牛

1021 [NOIP2015]金币

1022 托米历险记

1023 绩点

1024 买铅笔

1025 整数个数

1026 栗酱的文明2

1027 黑大火与他的猫

1028 [NOIP2000]进制转换

1029 素数判断

1030 Game


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=1n​sci​∑i=1n​gpai​×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,他的购买规则如下:

  1. 必须按照从左到右的顺序购买,如果可以买这种猫粮则一定购买,每种猫粮只能购买一个,买完第一种猫粮买第二种猫粮,以此类推。
  2. 如果遇到金额不足的情况,将跳过该猫粮,购买下一种猫粮,直到结束。

输出他最多能买多少种猫粮。

#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;
}

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值