你好呀,我是目录
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)
🍅 🍅 🍅 撸起袖子加油干 🔊