CCF入门篇练习(3)

1027. 数字之和

题目:对于任意输入的整数,计算其各个数位上的数字之和。
数据范围限制
1<=N<2^31

输入
输入一个正整数N。

输出
输出N的各个位上的数字之和。

样例输入

1234

样例输出

10

C语言

#include <stdio.h>
int main()
{
	int n, sum;
	sum = 0;
	scanf("%d", &n);
	
	while(n != 0)
	{
		sum += n % 10;
		n /= 10;
	}
	printf("%d", sum);
	return 0;
}

🍅 Try it 🗝 1027. 数字之和 (Standard IO)


1028. 判断互质

题目:输入两个正整数m和n,判断m和n是否互质(即最大公约数为1),是则输出Yes,否则输出No。

输入
输入两个整数m和n,中间用空格隔开。

输出
如互质输出Yes,否则输出No。

样例输入

36 56

样例输出

No

C语言

#include <stdio.h>

// 函数的声明(以分号结束) 
void swap(int m, int n);	// 确定 m > n, 用于辗转相除法的大数m 除以 小数n 
int gcd(int m, int n);		// 辗转相除法(欧几里德算法) 

int main()
{
	int m, n, r;
	scanf("%d %d", &m, &n);
	
	// 调用函数 
	swap(m, n);		
	m = gcd(m, n);
	
	if (m == 1)		// 若最大公约数为1,即互质
		printf("Yes");
	else
		printf("No");
	
	return 0;
}

// 函数的定义 
void swap(int m, int n)
{
	int t;	// 中间数 
	if (m < n)
	{
		t = m;
		m = n;
		n = t;
	}
}

// 辗转相除法(欧几里德算法) 
int gcd(int m, int n)
{
	int r; 	// 余数:remainder->r 
	do{
		r = m % n;	
		m = n;
		n = r;
	}while(r != 0);
	
	return m;
}

🍅 Try it 🗝 1028. 判断互质 (Standard IO)


1030. 角谷猜想

题目:角谷猜想又称冰雹猜想。它首先流传于美国,不久传到欧洲,后来由一位叫角谷的日本人带到亚洲。因为被称为角谷猜想。
通俗地讲,角谷猜想的内容是这样的:任意给定一个自然数n,当n是偶数时,将它除以2,即将它变成n/2;当n是奇数时,就将它变成3n+1,……,若干步后,总会得到1。
在上述演变过程中,将每一次出现的数字排列起来,就会出现一个数字序列。
我们现在要解决的问题是:对于给定的n,求出数字序列中第一次出现1的位置。

输入
输入一个自然数n。

输出
输出序列中第一次出现1的位置。

样例输入

6

样例输出

9

C语言

#include <stdio.h>
int main()
{
	long n;
	scanf("%ld", &n);	// 注:long类型输入的格式控制符 %ld
	
	int pos = 1;
	while(n != 1)
	{
		if (n % 2 == 0)
			n /= 2;
		else
			n = 3 * n +1;
		pos++;
	}
	printf("%d", pos);
	return 0;
} 

C++

#include <iostream>
using namespace std;
int main()
{
	long n;   // 数可能越算越大,所以定义为 long 类型 
	cin >> n;
		
	int pos = 1;  // 位置
	while(n != 1)
	{
		if (n % 2 == 0)  // 偶数
			n /= 2;
		else       		 //  奇数
			n = 3 * n + 1; 
		pos++;
	}
	
	cout << pos << endl;
	return 0;
} 

🍅 Try it 🗝 1030. 角谷猜想 (Standard IO)


1031. 等腰三角形

题目:输入一个正整数n,输出高为n的由*组成的等腰三角形。

输入
输入一个正整数。

输出
输出高为n的由*组成的等腰三角形。

样例输入

3

样例输出

在这里插入图片描述

C++

#include <iostream>
using namespace std;

void printTriangle(int n);   // 函数的声明

int main()
{
	int n;
	cin >> n; 
	
	printTriangle(n);   	// 函数的调用
	
	return 0;
}

void printTriangle(int n)   // 函数的定义
{
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n - i; j++)
			cout << " ";
		for (int k = 1; k <= 2 * i - 1; k++)
			cout << "*";
		cout << endl;
	}
} 

🍅 Try it 🗝 1031. 等腰三角形 (Standard IO)


1032. 菱形

题目:输入一个正整数n,输出用1至(2n-1)的数字组成的菱形。

输入
输入正整数n。

输出
输出对应的菱形(见样例)。

样例输入

3

样例输出
在这里插入图片描述
C++

#include <iostream>
using namespace std;

void printDiamond(int n);   // 函数声明

int main()
{
	int n;
	cin >> n;
	
	printDiamond(n);   // 函数调用
	
	return 0;	
}

void printDiamond(int n)   // 函数定义
{
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n - i; j++)
			cout << " ";
		for (int j = 1; j <= 2 * i - 1; j++)
			cout << j;
		cout << endl;
	}
	for (int i = n - 1; i >= 1; i--)
	{
		for (int j = 1; j <= n - i; j++)
			cout << " ";
		for (int j = 1; j <= 2 * i - 1; j++)
			cout << j;
		cout << endl;
	}
} 

🍅 Try it 🗝 1032. 菱形 (Standard IO)


1034. 钞票兑换

题目:将任意给定的整百元钞票,兑换成10元、20元、50元小钞票形式。输出兑换方案总数。

输入
输入需要兑换的钞票总数n。

输出
输出方案总数。

样例输入

100

样例输出

10

C++

法一:穷举法(时间超限)

#include <iostream>
using namespace std;
 
void exchange(int n);   // 函数声明

int main()
{
	int n;
	cin >> n;
	
	exchange(n);  // 函数调用
	
	return 0;
}

void exchange(int n)   // 函数定义
{
	int cnt = 0;
	for (int i = 0; i <= n / 50; i++)
		for (int j = 0; j <= n / 20; j++)
			for (int k = 0; k <= n / 10; k++)
				if (i * 50 + j * 20 + k * 10 == n)
					cnt++;	
					
	cout << cnt << endl;
}

法二:消元法(在CCF中学生程序设计在线评测中依然时间超限)

#include <iostream>
using namespace std;

void exchange(int n);   // 函数声明

int main()
{
	int n;
	cin >> n;
	
	exchange(n);  // 函数调用
	
	return 0;
}

void exchange(int n)   // 函数定义
{
	int cnt = 0;
	for (int i = 0; i <= n / 50; i++)
		for (int j = 0; j <= n / 20; j++)
			if (i * 50 + j * 20 <= n)
				cnt++; 
				
	cout << cnt << endl;
}

法三:(借鉴别人的思路得到公式 :cnt = 5n^2 + 4*n + 1 )

#include <iostream>
using namespace std;
int main()
{
	int n, cnt;
	cin >> n;
	
	n /= 100;
	cnt = 5 * n * n + 4 * n + 1;
	
	cout << cnt << endl;
	return 0; 
} 

🍅 Try it 🗝 1034. 钞票兑换 (Standard IO)


1035. 数根

题目:数根是这样定义的:对于一个正整数n,将它的各个数位上的数字相加得到一个新数,如果这个数是一位数,我们就称之为n的数根,否则重复处理直到它成为一个一位数。
例如,n=34,3+4=7,7是一位数,所以7是34的数根。
再如,n=345,3+4+5=12,1+2=3,3是一位数,所以3是345的数根。
对于输入数字n,编程计算它的数根。
数据范围限制
1<=n<2^31

输入
输入正整数n。

输出
输出n的数根。

样例输入

345

样例输出

3

C语言

#include <stdio.h>

int getSum(int x);

int main()
{
	int n, sum;
	scanf("%d", &n);

	while(n / 10 != 0)
	{
		sum = getSum(n);
		n = sum;
	}
	printf("%d", n);
	return 0;	
}

int getSum(int x)
{
	int sum = 0;
	while(x != 0)
	{
		sum += x % 10;
		x /= 10;
	}
	return sum;
}	

🍅 Try it 🗝 1035. 数根 (Standard IO)


1036. 进制转换

题目:模拟将任意给定的正整数n转换成对应的二进制数的过程:对于输入的任意正整数n,输出若干行“shang:* yu:*”的形式,表示其转换过程。

输入
输入正整数n。

输出
输出其转为二进制的过程(具体见样例)。

样例输入

13

样例输出
在这里插入图片描述

C语言

#include <stdio.h> 
int main()
{
	int n, shang, yu;
	shang = 0;
	yu = 0;
	scanf("%d", &n);
	
	while(n != 0)
	{
		shang = n / 2;
		yu = n % 2;
		printf("shang:%d yu:%d\n", shang, yu);
		n /= 2; 
	}
	return 0;
}

C++

#include <iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	
	while(n != 0)
	{
		int yu = n % 2;
		n /= 2;
		cout << "shang:" << n 
		     << " yu:" << yu << endl;
	}
	return 0;
} 

🍅 Try it 🗝 1036. 进制转换 (Standard IO)


1037. 个位数

题目:计算a^b的个位数。

输入
一行两个空格隔开的正整数表示a和b。

输出
输出a^b的个位数。

样例输入

2 4

样例输出

6

C++

法一: 常规思路:直接求a^b,再求个位数。后果:若指数过大,会造成数据溢出,同时造成时间超限

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int a, b;
	cin >> a >> b;
	
	long int result;
	result = pow(a, b);
	
	int single_digit = result % 10;
	cout << single_digit << endl;
	return 0;
}

法二: 因为只求结果的个位数, 因此用 a 乘以每次乘积结果的个位数,如此往复,完成b次相乘。

#include <iostream>
#include <cmath>
using namespace std; 

int main()
{
	int a, b;
	cin >> a >> b;
	int x = 1;
	for (int i = 1; i <= b; i++)
	{
		x = x * a;
		x %= 10;
	}
	cout << x << endl;
	return 0;
}

小结: 求a^b的个位数
根据数据范围,先直接求a^b,再求个位数,若指数过大,必然导致时间超限
解决方法:让a乘以每次乘积结果的个位数,完成b次的连乘,即可得到a^b的个位数。

🍅 Try it 🗝 1037. 个位数 (Standard IO)


1038. 玩扑克

题目:又到休息时间了。两个小伙伴要玩扑克牌比大小的游戏:每人分到一种花色的扑克牌,然后每人随机出一张牌,大者胜,最后获胜次数多的人,赢一轮。
不开心的事发生了,玩了一轮后,发现扑克牌竟然少了一张。到底少了几呢?
你能写个程序,快速找到扑克x吗?

输入
输入一行,包括25个用空格分隔的数字(A表示为1,J、Q、K表示为11、12、13)。

输出
输出数字x,表示缺少的扑克牌数字。

样例输入
> 9 1 13 2 6 10 7 8 3 11 4 1 5 9 10 2 4 3 12 13 11 5 8 6 7

样例输出

12

C++

法一: 求和法
每人分到一种花色的扑克牌,所以总张数2 * 13 = 26张

#include <iostream>
using namespace std;

// 使用宏定义可以增加程序的可阅读性和可修改性
#define TOTAL (1 + 13) * 13
#define N 26

int main()
{
	int x, sum;
	sum = 0;
	for (int i = 1; i < N; i++)
	{
		cin >> x;
		sum += x;
	}
	cout << TOTAL - sum << endl;
	return 0;
} 

法二:

#include <iostream>
using namespace std;

#define N 26

int main()
{
	int x;
	int a[14] = {0};
	
	for (int i = 1; i < N; i++)
	{
		cin >> x;
		a[x]++;
	}
	
	for (int i = 0; i <= 13; i++)
		if (a[i] == 1)
			cout << i << endl;
	
	return 0;
}

🍅 Try it 🗝 1038. 玩扑克 (Standard IO)


🍅 🍅 🍅 撸起袖子加油干 🔊

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值